Add some more checking for compound literals.

llvm-svn: 51300
This commit is contained in:
Eli Friedman 2008-05-20 05:22:08 +00:00
parent 78aa98f7b8
commit 37a186d765
2 changed files with 19 additions and 2 deletions

View File

@ -738,7 +738,20 @@ ActOnCompoundLiteral(SourceLocation LParenLoc, TypeTy *Ty,
//assert((InitExpr != 0) && "ActOnCompoundLiteral(): missing expression");
Expr *literalExpr = static_cast<Expr*>(InitExpr);
// FIXME: add more semantic analysis (C99 6.5.2.5).
if (literalType->isArrayType()) {
if (literalType->getAsVariableArrayType())
return Diag(LParenLoc,
diag::err_variable_object_no_init,
SourceRange(LParenLoc,
literalExpr->getSourceRange().getEnd()));
} else if (literalType->isIncompleteType()) {
return Diag(LParenLoc,
diag::err_typecheck_decl_incomplete_type,
literalType.getAsString(),
SourceRange(LParenLoc,
literalExpr->getSourceRange().getEnd()));
}
if (CheckInitializerTypes(literalExpr, literalType))
return true;

View File

@ -21,4 +21,8 @@ int main(int argc, char **argv) {
fooFunc(&(struct foo){ 1, 2 });
}
struct Incomplete;
struct Incomplete* I1 = &(struct Incomplete){1, 2, 3}; // -expected-error {{variable has incomplete type}}
void IncompleteFunc(unsigned x) {
struct Incomplete* I2 = (struct foo[x]){1, 2, 3}; // -expected-error {{variable-sized object may not be initialized}}
}