Don't allow definitions of array variables without some size information in C++. Fixed PR5401
llvm-svn: 86165
This commit is contained in:
parent
415c64ea3f
commit
1060067dd1
|
@ -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<
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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}}
|
||||
|
|
|
@ -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];
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue