Browse Source

typesafe_cb: fix up (and test!) cast_if_any.

Rusty Russell 16 years ago
parent
commit
175ca4aa64

+ 39 - 0
ccan/typesafe_cb/test/compile_fail-cast_if_any.c

@@ -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;
+}

+ 38 - 0
ccan/typesafe_cb/test/compile_ok-cast_if_any.c

@@ -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;
+}

+ 2 - 0
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)
 
 /**