| /* Test C11 _Generic. Valid uses. */ |
| /* { dg-do run } */ |
| /* { dg-options "-std=c11 -pedantic-errors" } */ |
| |
| _Noreturn extern void exit (int); |
| _Noreturn extern void abort (void); |
| |
| void |
| check (int n) |
| { |
| if (n) |
| abort (); |
| } |
| |
| int |
| main (void) |
| { |
| int n = 0; |
| |
| check (_Generic (n++, int: 0)); |
| /* _Generic should not evaluate its argument. */ |
| check (n); |
| |
| check (_Generic (n, double: n++, default: 0)); |
| check (n); |
| |
| /* Qualifiers are removed for the purpose of type matching. */ |
| const int cn = 0; |
| check (_Generic (cn, int: 0, default: n++)); |
| check (n); |
| check (_Generic ((const int) n, int: 0, default: n++)); |
| check (n); |
| |
| /* Arrays decay to pointers. */ |
| int a[1]; |
| const int ca[1]; |
| check (_Generic (a, int *: 0, const int *: n++)); |
| check (n); |
| check (_Generic (ca, const int *: 0, int *: n++)); |
| check (n); |
| |
| /* Functions decay to pointers. */ |
| extern void f (void); |
| check (_Generic (f, void (*) (void): 0, default: n++)); |
| check (n); |
| |
| /* _Noreturn is not part of the function type. */ |
| check (_Generic (&abort, void (*) (void): 0, default: n++)); |
| check (n); |
| |
| /* Integer promotions do not occur. */ |
| short s; |
| check (_Generic (s, short: 0, int: n++)); |
| check (n); |
| |
| exit (0); |
| } |