Home | History | Annotate | Download | only in SemaCXX
      1 // RUN: %clang_cc1 -std=c++1y %s -verify -triple=x86_64-linux-gnu -pedantic-errors
      2 
      3 // FIXME: many diagnostics here say 'variably modified type'.
      4 //        catch this case and say 'array of runtime bound' instead.
      5 
      6 namespace std { struct type_info; }
      7 
      8 struct S {
      9   int arr[__SIZE_MAX__ / 32];
     10 };
     11 S s[32]; // expected-error {{array is too large}}
     12 
     13 int n;
     14 int a[n]; // expected-error {{not allowed at file scope}}
     15 
     16 struct T {
     17   int a[n]; // expected-error {{fields must have a constant size}}
     18   static int b[n]; // expected-error {{not allowed at file scope}}
     19 };
     20 
     21 int g(int n, int a[n]);
     22 
     23 template<typename T> struct X {};
     24 template<int N, int[N]> struct Y {};
     25 template<int[n]> struct Z {}; // expected-error {{of variably modified type}}
     26 
     27 int f(int n) {
     28   int arb[n]; // expected-note 3{{here}}
     29   [arb] {} (); // expected-error {{cannot be captured}}
     30 
     31   // FIXME: an array of runtime bound can be captured by reference.
     32   [&arb] { // expected-error {{cannot be captured}}
     33     // Capturing the array implicitly captures the bound, if we need it
     34     // in a range-based for loop.
     35     for (auto &n : arb) { } // expected-error {{cannot be captured}}
     36   } ();
     37 
     38   X<int[n]> x; // expected-error {{variably modified type}}
     39 
     40   int arb_neg[-1]; // expected-error {{negative size}}
     41   int arb_of_array[n][2];
     42   int arr[3] = { 1, 2, 3, 4 }; // expected-error {{excess elements}}
     43   char foo[4] = "fool"; // expected-error {{initializer-string for char array is too long}}
     44 
     45   static int not_auto1[n]; // expected-error {{can not have 'static'}}
     46   extern int not_auto2[n]; // expected-error {{can not have 'extern'}}
     47   // FIXME: say 'thread_local' not 'static'.
     48   thread_local int not_auto1[n]; // expected-error {{can not have 'static'}}
     49 
     50   // FIXME: these should all be invalid.
     51   auto &&ti1 = typeid(arb);
     52   auto &&ti2 = typeid(int[n]);
     53   auto &&so1 = sizeof(arb);
     54   auto &&so2 = sizeof(int[n]);
     55   auto *p = &arb;
     56   decltype(arb) arb2;
     57   int (*arbp)[n] = 0;
     58   const int (&arbr)[n] = arbr; // expected-warning {{not yet bound}}
     59   typedef int arbty[n];
     60   int array_of_arb[2][n];
     61 
     62   struct Dyn { Dyn() {} Dyn(int) {} ~Dyn() {} };
     63 
     64   // FIXME: these should be valid.
     65   int arb_dynamic[n] = { 1, 2, 3, 4 }; // expected-error {{may not be initialized}}
     66   Dyn dyn[n]; // expected-error {{non-POD}}
     67   Dyn dyn_init[n] = { 1, 2, 3, 4 }; // expected-error {{non-POD}}
     68 }
     69