1 /* Test __builtin_tgmath: errors that indicate a bad definition of a
2    type-generic macro rather than bad arguments in a call to it.  */
3 /* { dg-do compile } */
4 /* { dg-options "" } */
5 
6 void *p;
7 double d;
8 double unprototyped_d ();
9 long double unprototyped_ld ();
10 double variadic_d (double, ...);
11 long double variadic_ld (long double, ...);
12 double no_arguments_d (void);
13 long double no_arguments_ld (void);
14 double f_d (double);
15 long double f_ld (long double);
16 double many_args (double, double, double, double);
17 int f_i_d (double);
18 _Complex int f_ci_d (double);
19 void * f_p_d (double);
20 double f_d_i (int);
21 double f_d_ci (_Complex int);
22 double f_d_p (void *);
23 long double f_ld_d (double);
24 _Complex double f_cd_d (double);
25 double f_d_f (float);
26 double f_d_dd (double, double);
27 long double f_ld_ldld (long double, long double);
28 float f_f_fd (float, double);
29 
30 void
test(void)31 test (void)
32 {
33   /* Arguments individually invalid or no consistent number of
34      arguments followed by those arguments.  */
35   __builtin_tgmath (); /* { dg-error "too few arguments" } */
36   __builtin_tgmath (f_d); /* { dg-error "too few arguments" } */
37   __builtin_tgmath (f_d, f_ld); /* { dg-error "too few arguments" } */
38   __builtin_tgmath (many_args, many_args, many_args); /* { dg-error "too few arguments" } */
39   __builtin_tgmath (many_args, d, d, d, d); /* { dg-error "too few arguments" } */
40   __builtin_tgmath (f_ld, many_args, d); /* { dg-error "has wrong number of arguments" } */
41   __builtin_tgmath (unprototyped_d, unprototyped_ld, d); /* { dg-error "is unprototyped" } */
42   __builtin_tgmath (f_d, unprototyped_ld, d); /* { dg-error "is unprototyped" } */
43   __builtin_tgmath (variadic_d, variadic_ld, d); /* { dg-error "variable arguments" } */
44   __builtin_tgmath (f_d, variadic_ld, d); /* { dg-error "variable arguments" } */
45   __builtin_tgmath (p, p, p); /* { dg-error "is not a function pointer" } */
46   __builtin_tgmath (f_d, p, p); /* { dg-error "is not a function pointer" } */
47   __builtin_tgmath (no_arguments_d, no_arguments_d, no_arguments_ld); /* { dg-error "has no arguments" } */
48   __builtin_tgmath (f_d, no_arguments_d, no_arguments_ld); /* { dg-error "has no arguments" } */
49 
50   /* Invalid varying types of arguments.  */
51   __builtin_tgmath (f_i_d, f_ld, 0); /* { dg-error "invalid type-generic return type" } */
52   __builtin_tgmath (f_ci_d, f_ld, 0); /* { dg-error "invalid type-generic return type" } */
53   __builtin_tgmath (f_p_d, f_ld, 0); /* { dg-error "invalid type-generic return type" } */
54   __builtin_tgmath (f_ld, f_i_d, 0); /* { dg-error "invalid type-generic return type" } */
55   __builtin_tgmath (f_ld, f_ci_d, 0); /* { dg-error "invalid type-generic return type" } */
56   __builtin_tgmath (f_ld, f_p_d, 0); /* { dg-error "invalid type-generic return type" } */
57   __builtin_tgmath (f_d_i, f_ld, 0); /* { dg-error "invalid type-generic type for argument" } */
58   __builtin_tgmath (f_d_ci, f_ld, 0); /* { dg-error "invalid type-generic type for argument" } */
59   __builtin_tgmath (f_d_p, f_ld, 0); /* { dg-error "invalid type-generic type for argument" } */
60   __builtin_tgmath (f_ld, f_d_i, 0); /* { dg-error "invalid type-generic type for argument" } */
61   __builtin_tgmath (f_ld, f_d_ci, 0); /* { dg-error "invalid type-generic type for argument" } */
62   __builtin_tgmath (f_ld, f_d_p, 0); /* { dg-error "invalid type-generic type for argument" } */
63 
64   /* Arguments same type.  */
65   __builtin_tgmath (f_d, f_d, 0); /* { dg-error "all have the same type" } */
66 
67   /* Missing or invalid type-generic parameter.  */
68   __builtin_tgmath (f_d, f_ld_d, 0); /* { dg-error "lack type-generic parameter" } */
69   __builtin_tgmath (f_d, f_ld, f_cd_d, 0); /* { dg-error "lack type-generic parameter" } */
70   __builtin_tgmath (f_d, f_ld, f_d, 0); /* { dg-error "duplicate type-generic parameter type" } */
71 
72   /* Variation not consistent with the identified type-generic
73      parameter.  */
74   __builtin_tgmath (f_d, f_ld, f_d_f, 0); /* { dg-error "bad return type for function argument" } */
75   __builtin_tgmath (f_d_dd, f_ld_ldld, f_f_fd, 0, 0); /* { dg-error "bad type for argument" } */
76 }
77