typesafe_cb: fix up (and test!) cast_if_any.
authorRusty Russell <rusty@rustcorp.com.au>
Mon, 7 Jun 2010 04:29:18 +0000 (13:59 +0930)
committerRusty Russell <rusty@rustcorp.com.au>
Mon, 7 Jun 2010 04:29:18 +0000 (13:59 +0930)
ccan/typesafe_cb/test/compile_fail-cast_if_any.c [new file with mode: 0644]
ccan/typesafe_cb/test/compile_ok-cast_if_any.c [new file with mode: 0644]
ccan/typesafe_cb/typesafe_cb.h

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 (file)
index 0000000..9ead3de
--- /dev/null
@@ -0,0 +1,39 @@
+#include <ccan/typesafe_cb/typesafe_cb.h>
+#include <stdlib.h>
+
+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 (file)
index 0000000..2955f60
--- /dev/null
@@ -0,0 +1,38 @@
+#include <ccan/typesafe_cb/typesafe_cb.h>
+#include <stdlib.h>
+
+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;
+}
index f5e416de2de26c0e65605c5ed923ce0177cf4c33..4aabecf53e1228bbe4d2dd3ce69b505bbfb84311 100644 (file)
@@ -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)
 
 /**