2013-04-22 12:18:25 +08:00
|
|
|
// RUN: %clang_cc1 -std=c++1y %s -verify -triple=x86_64-linux-gnu -pedantic-errors
|
2013-04-21 07:28:26 +08:00
|
|
|
|
|
|
|
// FIXME: many diagnostics here say 'variably modified type'.
|
|
|
|
// catch this case and say 'array of runtime bound' instead.
|
|
|
|
|
|
|
|
namespace std { struct type_info; }
|
|
|
|
|
|
|
|
struct S {
|
|
|
|
int arr[__SIZE_MAX__ / 32];
|
|
|
|
};
|
|
|
|
S s[32]; // expected-error {{array is too large}}
|
|
|
|
|
|
|
|
int n;
|
|
|
|
int a[n]; // expected-error {{not allowed at file scope}}
|
|
|
|
|
|
|
|
struct T {
|
|
|
|
int a[n]; // expected-error {{fields must have a constant size}}
|
|
|
|
static int b[n]; // expected-error {{not allowed at file scope}}
|
|
|
|
};
|
|
|
|
|
|
|
|
int g(int n, int a[n]);
|
|
|
|
|
|
|
|
template<typename T> struct X {};
|
|
|
|
template<int N, int[N]> struct Y {};
|
|
|
|
template<int[n]> struct Z {}; // expected-error {{of variably modified type}}
|
|
|
|
|
|
|
|
int f(int n) {
|
|
|
|
int arb[n]; // expected-note 3{{here}}
|
|
|
|
[arb] {} (); // expected-error {{cannot be captured}}
|
|
|
|
|
|
|
|
// FIXME: an array of runtime bound can be captured by reference.
|
|
|
|
[&arb] { // expected-error {{cannot be captured}}
|
|
|
|
// Capturing the array implicitly captures the bound, if we need it
|
|
|
|
// in a range-based for loop.
|
|
|
|
for (auto &n : arb) { } // expected-error {{cannot be captured}}
|
|
|
|
} ();
|
|
|
|
|
|
|
|
X<int[n]> x; // expected-error {{variably modified type}}
|
|
|
|
|
|
|
|
int arb_neg[-1]; // expected-error {{negative size}}
|
|
|
|
int arb_of_array[n][2];
|
|
|
|
int arr[3] = { 1, 2, 3, 4 }; // expected-error {{excess elements}}
|
|
|
|
char foo[4] = "fool"; // expected-error {{initializer-string for char array is too long}}
|
|
|
|
|
|
|
|
static int not_auto1[n]; // expected-error {{can not have 'static'}}
|
|
|
|
extern int not_auto2[n]; // expected-error {{can not have 'extern'}}
|
|
|
|
// FIXME: say 'thread_local' not 'static'.
|
|
|
|
thread_local int not_auto1[n]; // expected-error {{can not have 'static'}}
|
|
|
|
|
|
|
|
// FIXME: these should all be invalid.
|
|
|
|
auto &&ti1 = typeid(arb);
|
|
|
|
auto &&ti2 = typeid(int[n]);
|
|
|
|
auto &&so1 = sizeof(arb);
|
|
|
|
auto &&so2 = sizeof(int[n]);
|
|
|
|
auto *p = &arb;
|
|
|
|
decltype(arb) arb2;
|
|
|
|
int (*arbp)[n] = 0;
|
|
|
|
const int (&arbr)[n] = arbr; // expected-warning {{not yet bound}}
|
|
|
|
typedef int arbty[n];
|
|
|
|
int array_of_arb[2][n];
|
|
|
|
|
|
|
|
struct Dyn { Dyn() {} Dyn(int) {} ~Dyn() {} };
|
|
|
|
|
|
|
|
// FIXME: these should be valid.
|
|
|
|
int arb_dynamic[n] = { 1, 2, 3, 4 }; // expected-error {{may not be initialized}}
|
|
|
|
Dyn dyn[n]; // expected-error {{non-POD}}
|
|
|
|
Dyn dyn_init[n] = { 1, 2, 3, 4 }; // expected-error {{non-POD}}
|
|
|
|
}
|