xref: /aosp_15_r20/external/clang/test/SemaCXX/c99-variable-length-array.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify -Wvla-extension %s
2*67e74705SXin Li struct NonPOD {
3*67e74705SXin Li   NonPOD();
4*67e74705SXin Li };
5*67e74705SXin Li 
6*67e74705SXin Li struct NonPOD2 {
7*67e74705SXin Li   NonPOD np;
8*67e74705SXin Li };
9*67e74705SXin Li 
10*67e74705SXin Li struct POD {
11*67e74705SXin Li   int x;
12*67e74705SXin Li   int y;
13*67e74705SXin Li };
14*67e74705SXin Li 
15*67e74705SXin Li // We allow VLAs of POD types, only.
vla(int N)16*67e74705SXin Li void vla(int N) {
17*67e74705SXin Li   int array1[N]; // expected-warning{{variable length arrays are a C99 feature}}
18*67e74705SXin Li   POD array2[N]; // expected-warning{{variable length arrays are a C99 feature}}
19*67e74705SXin Li   NonPOD array3[N]; // expected-warning{{variable length arrays are a C99 feature}}
20*67e74705SXin Li   NonPOD2 array4[N][3]; // expected-warning{{variable length arrays are a C99 feature}}
21*67e74705SXin Li }
22*67e74705SXin Li 
23*67e74705SXin Li /// Warn about VLAs in templates.
24*67e74705SXin Li template<typename T>
vla_in_template(int N,T t)25*67e74705SXin Li void vla_in_template(int N, T t) {
26*67e74705SXin Li   int array1[N]; // expected-warning{{variable length arrays are a C99 feature}}
27*67e74705SXin Li }
28*67e74705SXin Li 
29*67e74705SXin Li struct HasConstantValue {
30*67e74705SXin Li   static const unsigned int value = 2;
31*67e74705SXin Li };
32*67e74705SXin Li 
33*67e74705SXin Li struct HasNonConstantValue {
34*67e74705SXin Li   static unsigned int value;
35*67e74705SXin Li };
36*67e74705SXin Li 
37*67e74705SXin Li template<typename T>
vla_in_template(T t)38*67e74705SXin Li void vla_in_template(T t) {
39*67e74705SXin Li   int array2[T::value]; // expected-warning{{variable length arrays are a C99 feature}}
40*67e74705SXin Li }
41*67e74705SXin Li 
42*67e74705SXin Li template void vla_in_template<HasConstantValue>(HasConstantValue);
43*67e74705SXin Li template void vla_in_template<HasNonConstantValue>(HasNonConstantValue); // expected-note{{instantiation of}}
44*67e74705SXin Li 
45*67e74705SXin Li template<typename T> struct X0 { };
46*67e74705SXin Li 
47*67e74705SXin Li // Cannot use any variably-modified type with a template parameter or
48*67e74705SXin Li // argument.
inst_with_vla(int N)49*67e74705SXin Li void inst_with_vla(int N) {
50*67e74705SXin Li   int array[N]; // expected-warning{{variable length arrays are a C99 feature}}
51*67e74705SXin Li   X0<__typeof__(array)> x0a; // expected-error{{variably modified type 'typeof (array)' (aka 'int [N]') cannot be used as a template argument}}
52*67e74705SXin Li }
53*67e74705SXin Li 
54*67e74705SXin Li template<typename T>
55*67e74705SXin Li struct X1 {
56*67e74705SXin Li   template<int (&Array)[T::value]> // expected-error{{non-type template parameter of variably modified type 'int (&)[HasNonConstantValue::value]'}}  \
57*67e74705SXin Li   // expected-warning{{variable length arrays are a C99 feature}}
58*67e74705SXin Li   struct Inner {
59*67e74705SXin Li 
60*67e74705SXin Li   };
61*67e74705SXin Li };
62*67e74705SXin Li 
63*67e74705SXin Li X1<HasConstantValue> x1a;
64*67e74705SXin Li X1<HasNonConstantValue> x1b; // expected-note{{in instantiation of}}
65*67e74705SXin Li 
66*67e74705SXin Li // Template argument deduction does not allow deducing a size from a VLA.
67*67e74705SXin Li // FIXME: This diagnostic should make it clear that the two 'N's are different entities!
68*67e74705SXin Li template<typename T, unsigned N>
69*67e74705SXin Li void accept_array(T (&array)[N]); // expected-note{{candidate template ignored: could not match 'T [N]' against 'int [N]'}}
70*67e74705SXin Li 
test_accept_array(int N)71*67e74705SXin Li void test_accept_array(int N) {
72*67e74705SXin Li   int array[N]; // expected-warning{{variable length arrays are a C99 feature}}
73*67e74705SXin Li   accept_array(array); // expected-error{{no matching function for call to 'accept_array'}}
74*67e74705SXin Li }
75*67e74705SXin Li 
76*67e74705SXin Li // Variably-modified types cannot be used in local classes.
local_classes(int N)77*67e74705SXin Li void local_classes(int N) { // expected-note {{declared here}}
78*67e74705SXin Li   struct X {
79*67e74705SXin Li     int size;
80*67e74705SXin Li     int array[N]; // expected-error{{fields must have a constant size: 'variable length array in structure' extension will never be supported}} \
81*67e74705SXin Li                   // expected-error{{reference to local variable 'N' declared in enclosing function 'local_classes'}} \
82*67e74705SXin Li                   // expected-warning{{variable length arrays are a C99 feature}}
83*67e74705SXin Li   };
84*67e74705SXin Li }
85*67e74705SXin Li 
86*67e74705SXin Li namespace PR7206 {
f(int x)87*67e74705SXin Li   void f(int x) {
88*67e74705SXin Li     struct edge_info {
89*67e74705SXin Li       float left;
90*67e74705SXin Li       float right;
91*67e74705SXin Li     };
92*67e74705SXin Li     struct edge_info edgeInfo[x]; // expected-warning{{variable length arrays are a C99 feature}}
93*67e74705SXin Li   }
94*67e74705SXin Li }
95*67e74705SXin Li 
96*67e74705SXin Li namespace rdar8020206 {
97*67e74705SXin Li   template<typename T>
f(int i)98*67e74705SXin Li   void f(int i) {
99*67e74705SXin Li     const unsigned value = i;
100*67e74705SXin Li     int array[value * i]; // expected-warning 2{{variable length arrays are a C99 feature}}
101*67e74705SXin Li   }
102*67e74705SXin Li 
103*67e74705SXin Li   template void f<int>(int); // expected-note{{instantiation of}}
104*67e74705SXin Li }
105*67e74705SXin Li 
106*67e74705SXin Li namespace rdar8021385 {
107*67e74705SXin Li   typedef int my_int;
108*67e74705SXin Li   struct A { typedef int my_int; };
109*67e74705SXin Li   template<typename T>
110*67e74705SXin Li   struct B {
111*67e74705SXin Li     typedef typename T::my_int my_int;
f0rdar8021385::B112*67e74705SXin Li     void f0() {
113*67e74705SXin Li       int M = 4;
114*67e74705SXin Li       my_int a[M]; // expected-warning{{variable length arrays are a C99 feature}}
115*67e74705SXin Li     }
116*67e74705SXin Li   };
117*67e74705SXin Li   B<A> a;
118*67e74705SXin Li }
119*67e74705SXin Li 
120*67e74705SXin Li namespace PR8209 {
f(int n)121*67e74705SXin Li   void f(int n) {
122*67e74705SXin Li     typedef int vla_type[n]; // expected-warning{{variable length arrays are a C99 feature}}
123*67e74705SXin Li     (void)new vla_type; // expected-error{{variably}}
124*67e74705SXin Li   }
125*67e74705SXin Li }
126*67e74705SXin Li 
127*67e74705SXin Li namespace rdar8733881 { // rdar://8733881
128*67e74705SXin Li 
129*67e74705SXin Li static const int k_cVal3 = (int)(1000*0.2f);
f()130*67e74705SXin Li   int f() {
131*67e74705SXin Li     // Ok, fold to a constant size array as an extension.
132*67e74705SXin Li     char rgch[k_cVal3] = {0};
133*67e74705SXin Li   }
134*67e74705SXin Li }
135*67e74705SXin Li 
136*67e74705SXin Li namespace PR11744 {
f(int n)137*67e74705SXin Li   template<typename T> int f(int n) {
138*67e74705SXin Li     T arr[3][n]; // expected-warning 3 {{variable length arrays are a C99 feature}}
139*67e74705SXin Li     return 3;
140*67e74705SXin Li   }
141*67e74705SXin Li   int test = f<int>(0); // expected-note {{instantiation of}}
142*67e74705SXin Li }
143*67e74705SXin Li 
144*67e74705SXin Li namespace pr18633 {
145*67e74705SXin Li   struct A1 {
146*67e74705SXin Li     static const int sz;
147*67e74705SXin Li     static const int sz2;
148*67e74705SXin Li   };
149*67e74705SXin Li   const int A1::sz2 = 11;
150*67e74705SXin Li   template<typename T>
func()151*67e74705SXin Li   void func () {
152*67e74705SXin Li     int arr[A1::sz]; // expected-warning{{variable length arrays are a C99 feature}}
153*67e74705SXin Li   }
154*67e74705SXin Li   template<typename T>
func2()155*67e74705SXin Li   void func2 () {
156*67e74705SXin Li     int arr[A1::sz2];
157*67e74705SXin Li   }
158*67e74705SXin Li   const int A1::sz = 12;
func2()159*67e74705SXin Li   void func2() {
160*67e74705SXin Li     func<int>();
161*67e74705SXin Li     func2<int>();
162*67e74705SXin Li   }
163*67e74705SXin Li }
164