xref: /aosp_15_r20/external/clang/test/Sema/vla.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 %s -verify -fsyntax-only -pedantic
2*67e74705SXin Li 
test1()3*67e74705SXin Li int test1() {
4*67e74705SXin Li   typedef int x[test1()];  // vla
5*67e74705SXin Li   static int y = sizeof(x);  // expected-error {{not a compile-time constant}}
6*67e74705SXin Li }
7*67e74705SXin Li 
8*67e74705SXin Li // PR2347
f(unsigned int m)9*67e74705SXin Li void f (unsigned int m)
10*67e74705SXin Li {
11*67e74705SXin Li   int e[2][m];
12*67e74705SXin Li 
13*67e74705SXin Li   e[0][0] = 0;
14*67e74705SXin Li }
15*67e74705SXin Li 
16*67e74705SXin Li // PR3048
17*67e74705SXin Li int x = sizeof(struct{char qq[x];}); // expected-error {{fields must have a constant size}}
18*67e74705SXin Li 
19*67e74705SXin Li // PR2352
f2(unsigned int m)20*67e74705SXin Li void f2(unsigned int m)
21*67e74705SXin Li {
22*67e74705SXin Li   extern int e1[2][m]; // expected-error {{variable length array declaration cannot have 'extern' linkage}}
23*67e74705SXin Li 
24*67e74705SXin Li   e1[0][0] = 0;
25*67e74705SXin Li 
26*67e74705SXin Li }
27*67e74705SXin Li 
28*67e74705SXin Li // PR2361
29*67e74705SXin Li int i;
30*67e74705SXin Li int c[][i]; // expected-error {{variably modified type declaration not allowed at file scope}}
31*67e74705SXin Li int d[i]; // expected-error {{variable length array declaration not allowed at file scope}}
32*67e74705SXin Li 
33*67e74705SXin Li int (*e)[i]; // expected-error {{variably modified type declaration not allowed at file scope}}
34*67e74705SXin Li 
f3()35*67e74705SXin Li void f3()
36*67e74705SXin Li {
37*67e74705SXin Li   static int a[i]; // expected-error {{variable length array declaration cannot have 'static' storage duration}}
38*67e74705SXin Li   extern int b[i]; // expected-error {{variable length array declaration cannot have 'extern' linkage}}
39*67e74705SXin Li 
40*67e74705SXin Li   extern int (*c1)[i]; // expected-error {{variably modified type declaration cannot have 'extern' linkage}}
41*67e74705SXin Li   static int (*d)[i];
42*67e74705SXin Li }
43*67e74705SXin Li 
44*67e74705SXin Li // PR3663
45*67e74705SXin Li static const unsigned array[((2 * (int)((((4) / 2) + 1.0/3.0) * (4) - 1e-8)) + 1)]; // expected-warning {{variable length array folded to constant array as an extension}}
46*67e74705SXin Li 
47*67e74705SXin Li int a[*]; // expected-error {{star modifier used outside of function prototype}}
48*67e74705SXin Li int f4(int a[*][*]);
49*67e74705SXin Li 
50*67e74705SXin Li // PR2044
pr2044(int b)51*67e74705SXin Li int pr2044(int b) {int (*c(void))[b];**c() = 2;} // expected-error {{variably modified type}}
52*67e74705SXin Li int pr2044b;
53*67e74705SXin Li int (*pr2044c(void))[pr2044b]; // expected-error {{variably modified type}}
54*67e74705SXin Li 
55*67e74705SXin Li const int f5_ci = 1;
f5()56*67e74705SXin Li void f5() { char a[][f5_ci] = {""}; } // expected-warning {{variable length array folded to constant array as an extension}}
57*67e74705SXin Li 
58*67e74705SXin Li // PR5185
59*67e74705SXin Li void pr5185(int a[*]);
pr5185(int a[* ])60*67e74705SXin Li void pr5185(int a[*]) // expected-error {{variable length array must be bound in function definition}}
61*67e74705SXin Li {
62*67e74705SXin Li }
63*67e74705SXin Li 
pr23151(int (* p1)[* ])64*67e74705SXin Li void pr23151(int (*p1)[*]) // expected-error {{variable length array must be bound in function definition}}
65*67e74705SXin Li {}
66*67e74705SXin Li 
67*67e74705SXin Li // Make sure this isn't treated as an error
TransformBug(int a)68*67e74705SXin Li int TransformBug(int a) {
69*67e74705SXin Li  return sizeof(*(int(*)[({ goto v; v: a;})]) 0); // expected-warning {{use of GNU statement expression extension}}
70*67e74705SXin Li }
71