forked from OSchip/llvm-project
Add a bit more handling for declarations like "int a[*]".
llvm-svn: 70162
This commit is contained in:
parent
d98ecd615f
commit
4e2ab55502
|
|
@ -891,6 +891,8 @@ def err_illegal_decl_array_incomplete_type : Error<
|
|||
"array has incomplete element type %0">;
|
||||
def err_illegal_decl_array_of_references : Error<
|
||||
"'%0' declared as array of references">;
|
||||
def err_array_star_outside_prototype : Error<
|
||||
"star modifier used outside of function prototype">;
|
||||
def err_illegal_decl_pointer_to_reference : Error<
|
||||
"'%0' declared as a pointer to a reference">;
|
||||
def err_illegal_decl_mempointer_to_void : Error<
|
||||
|
|
|
|||
|
|
@ -37,7 +37,8 @@ void Type::Destroy(ASTContext& C) {
|
|||
}
|
||||
|
||||
void VariableArrayType::Destroy(ASTContext& C) {
|
||||
SizeExpr->Destroy(C);
|
||||
if (SizeExpr)
|
||||
SizeExpr->Destroy(C);
|
||||
this->~VariableArrayType();
|
||||
C.Deallocate(this);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -500,7 +500,10 @@ QualType Sema::BuildArrayType(QualType T, ArrayType::ArraySizeModifier ASM,
|
|||
}
|
||||
llvm::APSInt ConstVal(32);
|
||||
if (!ArraySize) {
|
||||
T = Context.getIncompleteArrayType(T, ASM, Quals);
|
||||
if (ASM == ArrayType::Star)
|
||||
T = Context.getVariableArrayType(T, 0, ASM, Quals);
|
||||
else
|
||||
T = Context.getIncompleteArrayType(T, ASM, Quals);
|
||||
} else if (ArraySize->isValueDependent()) {
|
||||
T = Context.getDependentSizedArrayType(T, ArraySize, ASM, Quals);
|
||||
} else if (!ArraySize->isIntegerConstantExpr(ConstVal, Context) ||
|
||||
|
|
@ -687,6 +690,15 @@ QualType Sema::GetTypeForDeclarator(Declarator &D, Scope *S, unsigned Skip) {
|
|||
ASM = ArrayType::Static;
|
||||
else
|
||||
ASM = ArrayType::Normal;
|
||||
if (ASM == ArrayType::Star &&
|
||||
D.getContext() != Declarator::PrototypeContext) {
|
||||
// FIXME: This check isn't quite right: it allows star in prototypes
|
||||
// for function definitions, and disallows some edge cases detailed
|
||||
// in http://gcc.gnu.org/ml/gcc-patches/2009-02/msg00133.html
|
||||
Diag(DeclType.Loc, diag::err_array_star_outside_prototype);
|
||||
ASM = ArrayType::Normal;
|
||||
D.setInvalidType(true);
|
||||
}
|
||||
T = BuildArrayType(T, ASM, ArraySize, ATI.TypeQuals, DeclType.Loc, Name);
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -43,3 +43,6 @@ void f3()
|
|||
|
||||
// PR3663
|
||||
static const unsigned array[((2 * (int)((((4) / 2) + 1.0/3.0) * (4) - 1e-8)) + 1)]; // expected-warning {{size of static array must be an integer constant expression}}
|
||||
|
||||
int a[*]; // expected-error {{star modifier used outside of function prototype}}
|
||||
int f4(int a[*][*]);
|
||||
|
|
|
|||
Loading…
Reference in New Issue