diff options
Diffstat (limited to 'test/SemaCXX/c99-variable-length-array.cpp')
-rw-r--r-- | test/SemaCXX/c99-variable-length-array.cpp | 35 |
1 files changed, 22 insertions, 13 deletions
diff --git a/test/SemaCXX/c99-variable-length-array.cpp b/test/SemaCXX/c99-variable-length-array.cpp index 3f1d6a8..7773c08 100644 --- a/test/SemaCXX/c99-variable-length-array.cpp +++ b/test/SemaCXX/c99-variable-length-array.cpp @@ -14,8 +14,8 @@ struct POD { // We allow VLAs of POD types, only. void vla(int N) { - int array1[N]; // expected-warning{{variable length arrays are a C99 feature, accepted as an extension}} - POD array2[N]; // expected-warning{{variable length arrays are a C99 feature, accepted as an extension}} + int array1[N]; // expected-warning{{variable length arrays are a C99 feature}} + POD array2[N]; // expected-warning{{variable length arrays are a C99 feature}} NonPOD array3[N]; // expected-error{{variable length array of non-POD element type 'NonPOD'}} NonPOD2 array4[N][3]; // expected-error{{variable length array of non-POD element type 'NonPOD2'}} } @@ -23,7 +23,7 @@ void vla(int N) { /// Warn about VLAs in templates. template<typename T> void vla_in_template(int N, T t) { - int array1[N]; // expected-warning{{variable length arrays are a C99 feature, accepted as an extension}} + int array1[N]; // expected-warning{{variable length arrays are a C99 feature}} } struct HasConstantValue { @@ -36,7 +36,7 @@ struct HasNonConstantValue { template<typename T> void vla_in_template(T t) { - int array2[T::value]; // expected-warning{{variable length arrays are a C99 feature, accepted as an extension}} + int array2[T::value]; // expected-warning{{variable length arrays are a C99 feature}} } template void vla_in_template<HasConstantValue>(HasConstantValue); @@ -47,14 +47,14 @@ template<typename T> struct X0 { }; // Cannot use any variably-modified type with a template parameter or // argument. void inst_with_vla(int N) { - int array[N]; // expected-warning{{variable length arrays are a C99 feature, accepted as an extension}} + int array[N]; // expected-warning{{variable length arrays are a C99 feature}} X0<__typeof__(array)> x0a; // expected-error{{variably modified type 'typeof (array)' (aka 'int [N]') cannot be used as a template argument}} } template<typename T> struct X1 { template<int (&Array)[T::value]> // expected-error{{non-type template parameter of variably modified type 'int (&)[HasNonConstantValue::value]'}} \ - // expected-warning{{variable length arrays are a C99 feature, accepted as an extension}} + // expected-warning{{variable length arrays are a C99 feature}} struct Inner { }; @@ -68,16 +68,17 @@ template<typename T, unsigned N> void accept_array(T (&array)[N]); // expected-note{{candidate template ignored: failed template argument deduction}} void test_accept_array(int N) { - int array[N]; // expected-warning{{variable length arrays are a C99 feature, accepted as an extension}} + int array[N]; // expected-warning{{variable length arrays are a C99 feature}} accept_array(array); // expected-error{{no matching function for call to 'accept_array'}} } // Variably-modified types cannot be used in local classes. -void local_classes(int N) { +void local_classes(int N) { // expected-note {{declared here}} struct X { int size; int array[N]; // expected-error{{fields must have a constant size: 'variable length array in structure' extension will never be supported}} \ - // expected-warning{{variable length arrays are a C99 feature, accepted as an extension}} + // expected-error{{reference to local variable 'N' declared in enclosing function 'local_classes'}} \ + // expected-warning{{variable length arrays are a C99 feature}} }; } @@ -87,7 +88,7 @@ namespace PR7206 { float left; float right; }; - struct edge_info edgeInfo[x]; // expected-warning{{variable length arrays are a C99 feature, accepted as an extension}} + struct edge_info edgeInfo[x]; // expected-warning{{variable length arrays are a C99 feature}} } } @@ -95,7 +96,7 @@ namespace rdar8020206 { template<typename T> void f(int i) { const unsigned value = i; - int array[value * i]; // expected-warning 2{{variable length arrays are a C99 feature, accepted as an extension}} + int array[value * i]; // expected-warning 2{{variable length arrays are a C99 feature}} } template void f<int>(int); // expected-note{{instantiation of}} @@ -109,7 +110,7 @@ namespace rdar8021385 { typedef typename T::my_int my_int; void f0() { int M = 4; - my_int a[M]; // expected-warning{{variable length arrays are a C99 feature, accepted as an extension}} + my_int a[M]; // expected-warning{{variable length arrays are a C99 feature}} } }; B<A> a; @@ -117,7 +118,7 @@ namespace rdar8021385 { namespace PR8209 { void f(int n) { - typedef int vla_type[n]; // expected-warning{{variable length arrays are a C99 feature, accepted as an extension}} + typedef int vla_type[n]; // expected-warning{{variable length arrays are a C99 feature}} (void)new vla_type; // expected-error{{variably}} } } @@ -130,3 +131,11 @@ static const int k_cVal3 = (int)(1000*0.2f); char rgch[k_cVal3] = {0}; } } + +namespace PR11744 { + template<typename T> int f(int n) { + T arr[3][n]; // expected-warning 3 {{variable length arrays are a C99 feature}} + return 3; + } + int test = f<int>(0); // expected-note {{instantiation of}} +} |