diff options
Diffstat (limited to 'gcc/testsuite/gcc.dg/countof-compile.c')
-rw-r--r-- | gcc/testsuite/gcc.dg/countof-compile.c | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/countof-compile.c b/gcc/testsuite/gcc.dg/countof-compile.c new file mode 100644 index 0000000..afd5659 --- /dev/null +++ b/gcc/testsuite/gcc.dg/countof-compile.c @@ -0,0 +1,124 @@ +/* { 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" } */ +} |