From: Rusty Russell Date: Mon, 7 Jun 2010 04:29:18 +0000 (+0930) Subject: typesafe_cb: fix up (and test!) cast_if_any. X-Git-Url: https://git.ozlabs.org/?p=ccan;a=commitdiff_plain;h=175ca4aa64c3489011b441a8c709693af1e70db0;hp=67a035869c6f3512ba943ae197b407f182a4506d typesafe_cb: fix up (and test!) cast_if_any. --- diff --git a/ccan/typesafe_cb/test/compile_fail-cast_if_any.c b/ccan/typesafe_cb/test/compile_fail-cast_if_any.c new file mode 100644 index 00000000..9ead3de5 --- /dev/null +++ b/ccan/typesafe_cb/test/compile_fail-cast_if_any.c @@ -0,0 +1,39 @@ +#include +#include + +struct foo { + int x; +}; + +struct bar { + int x; +}; + +struct baz { + int x; +}; + +struct any { + int x; +}; + +struct other { + int x; +}; + +static void take_any(struct any *any) +{ +} + +int main(int argc, char *argv[]) +{ +#ifdef FAIL + struct other +#else + struct foo +#endif + *arg = NULL; + take_any(cast_if_any(struct any *, arg, arg, + struct foo *, struct bar *, struct baz *)); + return 0; +} diff --git a/ccan/typesafe_cb/test/compile_ok-cast_if_any.c b/ccan/typesafe_cb/test/compile_ok-cast_if_any.c new file mode 100644 index 00000000..2955f60c --- /dev/null +++ b/ccan/typesafe_cb/test/compile_ok-cast_if_any.c @@ -0,0 +1,38 @@ +#include +#include + +struct foo { + int x; +}; + +struct bar { + int x; +}; + +struct baz { + int x; +}; + +struct any { + int x; +}; + +static void take_any(struct any *any) +{ +} + +int main(int argc, char *argv[]) +{ + struct foo *foo = NULL; + struct bar *bar = NULL; + struct baz *baz = NULL; + struct other *arg = NULL; + + take_any(cast_if_any(struct any *, arg, foo, + struct foo *, struct bar *, struct baz *)); + take_any(cast_if_any(struct any *, arg, bar, + struct foo *, struct bar *, struct baz *)); + take_any(cast_if_any(struct any *, arg, baz, + struct foo *, struct bar *, struct baz *)); + return 0; +} diff --git a/ccan/typesafe_cb/typesafe_cb.h b/ccan/typesafe_cb/typesafe_cb.h index f5e416de..4aabecf5 100644 --- a/ccan/typesafe_cb/typesafe_cb.h +++ b/ccan/typesafe_cb/typesafe_cb.h @@ -61,7 +61,9 @@ __builtin_choose_expr(__builtin_types_compatible_p(typeof(1?(test):0), oktype), cast_if_type(desttype, \ cast_if_type(desttype, \ cast_if_type(desttype, (expr), (test), ok1), \ + (test), \ ok2), \ + (test), \ ok3) /**