| /* { dg-do compile } */ |
| /* { dg-options "-std=c2y -pedantic-errors" } */ |
| |
| #define NULL ((void *) 0) |
| |
| extern int x[]; |
| |
| static int w[] = {1, 2, 3}; |
| |
| void |
| completed (void) |
| { |
| int i = 42; |
| int a[] = {1, 2, i}; |
| |
| _Static_assert(_Countof (w) == 3); |
| _Static_assert(_Countof (a) == 3); |
| } |
| |
| void |
| incomplete (int p[]) |
| { |
| _Countof (x); /* { dg-error "incomplete" } */ |
| |
| /* We want to support array parameters in the future, |
| which should change this from "invalid" to "incomplete". */ |
| _Countof (p); /* { dg-error "invalid" } */ |
| } |
| |
| void |
| fam (void) |
| { |
| struct { |
| int x; |
| int fam[]; |
| } s; |
| |
| _Countof (s.fam); /* { dg-error "incomplete" } */ |
| } |
| |
| void |
| param (int n, int p[n]) |
| { |
| /* We want to support array parameters in the future, |
| which would make this work. */ |
| _Countof (p); /* { dg-error "invalid" } */ |
| } |
| |
| void fix_fix (int i, char (*a)[3][5], int (*x)[_Countof (*a)], |
| short (*)[_Generic(x, int (*)[3]: 1)]); |
| void fix_var (int i, char (*a)[3][i], int (*x)[_Countof (*a)], |
| short (*)[_Generic(x, int (*)[3]: 1)]); |
| void fix_uns (int i, char (*a)[3][*], int (*x)[_Countof (*a)], |
| short (*)[_Generic(x, int (*)[3]: 1)]); |
| |
| void |
| func (void) |
| { |
| int i3[3]; |
| int i5[5]; |
| char c35[3][5]; |
| |
| fix_fix (5, &c35, &i3, NULL); |
| fix_fix (5, &c35, &i5, NULL); /* { dg-error "incompatible-pointer-types" } */ |
| |
| fix_var (5, &c35, &i3, NULL); |
| fix_var (5, &c35, &i5, NULL); /* { dg-error "incompatible-pointer-types" } */ |
| |
| fix_uns (5, &c35, &i3, NULL); |
| fix_uns (5, &c35, &i5, NULL); /* { dg-error "incompatible-pointer-types" } */ |
| } |
| |
| void |
| non_arr(void) |
| { |
| int x; |
| int *p; |
| struct s { |
| int x[3]; |
| } s; |
| |
| _Countof (x); /* { dg-error "invalid" } */ |
| _Countof (int); /* { dg-error "invalid" } */ |
| _Countof (s); /* { dg-error "invalid" } */ |
| _Countof (struct s); /* { dg-error "invalid" } */ |
| _Countof (&x); /* { dg-error "invalid" } */ |
| _Countof (p); /* { dg-error "invalid" } */ |
| _Countof (int *); /* { dg-error "invalid" } */ |
| _Countof (&s.x); /* { dg-error "invalid" } */ |
| _Countof (int (*)[3]); /* { dg-error "invalid" } */ |
| } |
| |
| static int f1(); |
| static int f2(); /* { dg-error "never defined" } */ |
| int a[10][9]; |
| int n; |
| |
| void |
| syms(void) |
| { |
| int b[n][n]; |
| |
| _Countof (a[f1()]); |
| _Countof (b[f2()]); |
| } |
| |
| void |
| no_parens(void) |
| { |
| _Static_assert(_Countof a == 10); |
| _Static_assert(_Countof *a == 9); |
| _Static_assert(_Countof (int [3]) {} == 3); |
| |
| _Countof int [3]; /* { dg-error "expected expression before" } */ |
| } |
| |
| void |
| const_expr(void) |
| { |
| int n = 7; |
| |
| _Static_assert (_Countof (int [3][n]) == 3); |
| _Static_assert (_Countof (int [n][3]) == 7); /* { dg-error "not constant" } */ |
| } |