Commit bd9f3925 authored by Rusty Russell's avatar Rusty Russell

Compile even with !HAVE_TYPEOF etc, and remove redundant test case.

parent 246bde09
#include "typesafe_cb/typesafe_cb.h"
#include <stdlib.h>
static void _callback(void (*fn)(void *arg), void *arg)
{
fn(arg);
}
#define callback(fn, arg) \
_callback(cast_if_type((fn), void (*)(typeof(arg)), void (*)(void *)), \
arg)
static void my_callback(char *p)
{
}
int main(int argc, char *argv[])
{
callback(my_callback, "hello world");
#ifdef FAIL
/* Must be a char * */
callback(my_callback, my_callback);
#endif
return 0;
}
...@@ -14,6 +14,9 @@ int main(int argc, char *argv[]) ...@@ -14,6 +14,9 @@ int main(int argc, char *argv[])
#ifdef FAIL #ifdef FAIL
int x = 0; int x = 0;
set_some_value(x); set_some_value(x);
#if !HAVE_TYPEOF||!HAVE_BUILTIN_CHOOSE_EXPR||!HAVE_BUILTIN_TYPES_COMPATIBLE_P
#error "Unfortunately we don't fail if cast_if_type is a noop."
#endif
#else #else
void *p = 0; void *p = 0;
set_some_value(p); set_some_value(p);
......
...@@ -10,8 +10,7 @@ void _callback(void (*fn)(void *arg), void *arg) ...@@ -10,8 +10,7 @@ void _callback(void (*fn)(void *arg), void *arg)
/* Callback is set up to warn if arg isn't a pointer (since it won't /* Callback is set up to warn if arg isn't a pointer (since it won't
* pass cleanly to _callback's second arg. */ * pass cleanly to _callback's second arg. */
#define callback(fn, arg) \ #define callback(fn, arg) \
_callback(cast_if_type((fn), void (*)(typeof(arg)), void (*)(void *)), \ _callback(typesafe_cb(void, (fn), (arg)), (arg))
arg)
void my_callback(int something); void my_callback(int something);
void my_callback(int something) void my_callback(int something)
...@@ -21,6 +20,7 @@ void my_callback(int something) ...@@ -21,6 +20,7 @@ void my_callback(int something)
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
#ifdef FAIL #ifdef FAIL
/* This fails due to arg, not due to cast. */
callback(my_callback, 100); callback(my_callback, 100);
#endif #endif
return 0; return 0;
......
...@@ -16,10 +16,18 @@ int main(int argc, char *argv[]) ...@@ -16,10 +16,18 @@ int main(int argc, char *argv[])
{ {
#ifdef FAIL #ifdef FAIL
int *p; int *p;
#if !HAVE_TYPEOF||!HAVE_BUILTIN_CHOOSE_EXPR||!HAVE_BUILTIN_TYPES_COMPATIBLE_P
#error "Unfortunately we don't fail if cast_if_type is a noop."
#endif
#else #else
char *p; char *p;
#endif #endif
p = NULL; p = NULL;
/* This should work always. */
register_callback(my_callback, "hello world");
/* This will fail with FAIL defined */
register_callback(my_callback, p); register_callback(my_callback, p);
return 0; return 0;
} }
...@@ -15,6 +15,9 @@ int main(int argc, char *argv[]) ...@@ -15,6 +15,9 @@ int main(int argc, char *argv[])
{ {
#ifdef FAIL #ifdef FAIL
int *p; int *p;
#if !HAVE_TYPEOF||!HAVE_BUILTIN_CHOOSE_EXPR||!HAVE_BUILTIN_TYPES_COMPATIBLE_P
#error "Unfortunately we don't fail if cast_if_type is a noop."
#endif
#else #else
char *p; char *p;
#endif #endif
......
...@@ -16,6 +16,9 @@ int main(int argc, char *argv[]) ...@@ -16,6 +16,9 @@ int main(int argc, char *argv[])
{ {
#ifdef FAIL #ifdef FAIL
int *p; int *p;
#if !HAVE_TYPEOF||!HAVE_BUILTIN_CHOOSE_EXPR||!HAVE_BUILTIN_TYPES_COMPATIBLE_P
#error "Unfortunately we don't fail if cast_if_type is a noop."
#endif
#else #else
char *p; char *p;
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment