Home | History | Annotate | Download | only in Parser
      1 // RUN: %clang_cc1 -fsyntax-only -verify %s
      2 
      3 extern int funcInt(int);
      4 extern float funcFloat(float);
      5 extern double funcDouble(double);
      6 // figure out why "char *" doesn't work (with gcc, nothing to do with clang)
      7 //extern void funcCharPtr(char *);
      8 
      9 #define func(expr) \
     10   do { \
     11     typeof(expr) tmp; \
     12     if (__builtin_types_compatible_p(typeof(expr), int)) funcInt(tmp); \
     13     else if (__builtin_types_compatible_p(typeof(expr), float)) funcFloat(tmp); \
     14     else if (__builtin_types_compatible_p(typeof(expr), double)) funcDouble(tmp); \
     15   } while (0)
     16 #define func_choose(expr) \
     17   __builtin_choose_expr(__builtin_types_compatible_p(typeof(expr), int), funcInt(expr), \
     18     __builtin_choose_expr(__builtin_types_compatible_p(typeof(expr), float), funcFloat(expr), \
     19       __builtin_choose_expr(__builtin_types_compatible_p(typeof(expr), double), funcDouble(expr), (void)0)))
     20 
     21 static void test()
     22 {
     23   int a;
     24   float b;
     25   double d;
     26 
     27   func(a);
     28   func(b);
     29   func(d);
     30   a = func_choose(a);
     31   b = func_choose(b);
     32   d = func_choose(d);
     33 
     34   int c;
     35   struct xx { int a; } x, y;
     36 
     37   c = __builtin_choose_expr(a+3-7, b, x); // expected-error{{'__builtin_choose_expr' requires a constant expression}}
     38   c = __builtin_choose_expr(0, b, x); // expected-error{{assigning to 'int' from incompatible type 'struct xx'}}
     39   c = __builtin_choose_expr(5+3-7, b, x);
     40   y = __builtin_choose_expr(4+3-7, b, x);
     41 
     42 }
     43 
     44