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 Livoid 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 Livoid 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 Livoid 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 Livoid 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 Livoid 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 Livoid 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