Don't allow definitions of array variables without some size information in C++. Fixed PR5401

llvm-svn: 86165
This commit is contained in:
Sebastian Redl 2009-11-05 19:47:47 +00:00
parent 415c64ea3f
commit 1060067dd1
4 changed files with 15 additions and 2 deletions

View File

@ -1488,6 +1488,9 @@ def err_tentative_def_incomplete_type_arr : Error<
"tentative definition has array of type %0 that is never completed">;
def warn_tentative_incomplete_array : Warning<
"tentative array definition assumed to have one element">;
def err_typecheck_incomplete_array_needs_initializer : Error<
"definition of variable with array type needs an explicit size "
"or an initializer">;
def err_realimag_invalid_type : Error<"invalid type %0 to %1 operator">;
def err_typecheck_sclass_fscope : Error<

View File

@ -3433,6 +3433,16 @@ void Sema::ActOnUninitializedDecl(DeclPtrTy dcl,
return;
}
// An array without size is an incomplete type, and there are no special
// rules in C++ to make such a definition acceptable.
if (getLangOptions().CPlusPlus && Type->isIncompleteArrayType() &&
!Var->hasExternalStorage()) {
Diag(Var->getLocation(),
diag::err_typecheck_incomplete_array_needs_initializer);
Var->setInvalidDecl();
return;
}
// C++ [temp.expl.spec]p15:
// An explicit specialization of a static data member of a template is a
// definition if the declaration includes an initializer; otherwise, it

View File

@ -20,7 +20,7 @@ int ar6[-1]; // expected-error {{array size is negative}}
int ar7[0u]; // expected-warning {{zero size arrays are an extension}}
// An array with unknown bound is incomplete.
int ar8[]; // FIXME: This needs to fail!
int ar8[]; // expected-error {{needs an explicit size or an initializer}}
// So is an array with an incomplete element type.
struct Incomplete; // expected-note {{forward declaration}}
Incomplete ar9[10]; // expected-error {{incomplete type}}

View File

@ -4,7 +4,7 @@ template<typename T, int Size> void f() {
T x1;
T* x2;
T& x3; // expected-error{{declaration of reference variable 'x3' requires an initializer}}
T x4[]; // expected-error{{variable has incomplete type 'T []'}}
T x4[]; // expected-error{{needs an explicit size or an initializer}}
T x5[Size];
int x6[Size];
}