aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/countof-compile.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/gcc.dg/countof-compile.c')
-rw-r--r--gcc/testsuite/gcc.dg/countof-compile.c124
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" } */
+}