annotate gcc/testsuite/gcc.dg/vla-4.c @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* { dg-do run } */
kono
parents:
diff changeset
2 /* { dg-options "-std=c99 -pedantic-errors" } */
kono
parents:
diff changeset
3 /* { dg-require-effective-target alloca } */
kono
parents:
diff changeset
4 /* PR c/18740 */
kono
parents:
diff changeset
5
kono
parents:
diff changeset
6 static int i;
kono
parents:
diff changeset
7
kono
parents:
diff changeset
8 int foo(int n)
kono
parents:
diff changeset
9 {
kono
parents:
diff changeset
10 int (*t)[n];
kono
parents:
diff changeset
11 i = 0;
kono
parents:
diff changeset
12 int j = 0;
kono
parents:
diff changeset
13 char b[1][n+3]; /* Variable length array. */
kono
parents:
diff changeset
14 int d[3][n]; /* Variable length array. */
kono
parents:
diff changeset
15 sizeof (b[i++ + sizeof(j++)]); /* Outer sizeof is evaluated for vla, but not the inner one. */
kono
parents:
diff changeset
16 if (i != 1 || j != 0)
kono
parents:
diff changeset
17 return 1;
kono
parents:
diff changeset
18 __typeof__(b[i++]) c1; /* typeof is evauluated when given a vm */
kono
parents:
diff changeset
19 if (i != 2)
kono
parents:
diff changeset
20 return 1;
kono
parents:
diff changeset
21 __typeof__(t + (i++,0)) c2; /* typeof is evauluated when given a vm */
kono
parents:
diff changeset
22 if (i != 3)
kono
parents:
diff changeset
23 return 1;
kono
parents:
diff changeset
24 __typeof__(i + (i++,0)) c3; /* typeof is not evauluated when not given a vm */
kono
parents:
diff changeset
25 if (i != 3)
kono
parents:
diff changeset
26 return 1;
kono
parents:
diff changeset
27 sizeof (d[i++]); /* sizeof is evaluated for vla. */
kono
parents:
diff changeset
28 if (i != 4)
kono
parents:
diff changeset
29 return 1;
kono
parents:
diff changeset
30 __alignof__(__typeof__(t + (i++,0))); /* typeof is not evauluated when given a vm inside alignof*/
kono
parents:
diff changeset
31 if (i != 4)
kono
parents:
diff changeset
32 return 1;
kono
parents:
diff changeset
33 sizeof(__typeof__(t + (i++,0))); /* typeof is not evauluated when given a vm inside sizeof*/
kono
parents:
diff changeset
34 if (i != 4)
kono
parents:
diff changeset
35 return 1;
kono
parents:
diff changeset
36 return 0;
kono
parents:
diff changeset
37 }
kono
parents:
diff changeset
38
kono
parents:
diff changeset
39 int foo6(int a, int b[a][a], int (*c)[sizeof(*b)]) {
kono
parents:
diff changeset
40 return sizeof (*c);
kono
parents:
diff changeset
41 }
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 int main() {
kono
parents:
diff changeset
44 int b[10][10];
kono
parents:
diff changeset
45 int (*c)[sizeof(int)*10];
kono
parents:
diff changeset
46 if (foo6(10, b, c) != 10*sizeof(int)*sizeof(int))
kono
parents:
diff changeset
47 return 1;
kono
parents:
diff changeset
48 return foo(10);
kono
parents:
diff changeset
49 }