aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2008-08-09 21:35:13 +0000
committerChris Lattner <sabre@nondot.org>2008-08-09 21:35:13 +0000
commit8389eab190afef3462f6418b8d8fb70fb01c4005 (patch)
treed2a41484bacad7d91991fdd7902ea5e7a4ab0133
parentaad6953ca1149d44cebadca8839745796bfd524e (diff)
Fix PR2400 by more graceful handling of invalid decls. Don't try to layout
an invalid struct decl. Thanks to Martin Doucha for the isIncompleteArrayType part of this patch. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@54592 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--clang.xcodeproj/project.pbxproj4
-rw-r--r--lib/AST/ASTContext.cpp10
-rw-r--r--test/Sema/invalid-decl.c12
3 files changed, 22 insertions, 4 deletions
diff --git a/clang.xcodeproj/project.pbxproj b/clang.xcodeproj/project.pbxproj
index ff5647df40..31cf111a59 100644
--- a/clang.xcodeproj/project.pbxproj
+++ b/clang.xcodeproj/project.pbxproj
@@ -885,19 +885,19 @@
DEC8D9920A9433F400353FCA /* AST */ = {
isa = PBXGroup;
children = (
- 35EE48AF0E0C4CCA00715C54 /* DeclCXX.cpp */,
- 35EE48B00E0C4CCA00715C54 /* ParentMap.cpp */,
35BB2D7E0D19954000944DB5 /* ASTConsumer.cpp */,
DE1732FF0B068B700080B521 /* ASTContext.cpp */,
DED677C80B6C854100AAD4A3 /* Builtins.cpp */,
DEC63B190C7B940200DBF169 /* CFG.cpp */,
35FE6BCE0DF6EE1F00739712 /* DeclBase.cpp */,
DED62ABA0AE2EDF1001E80A4 /* Decl.cpp */,
+ 35EE48AF0E0C4CCA00715C54 /* DeclCXX.cpp */,
DE38CF260D8C9E6C00A273B6 /* DeclObjC.cpp */,
3513185F0CD14468006B66F7 /* DeclSerialization.cpp */,
DE0FCB330A9C21F100248FD5 /* Expr.cpp */,
1A32C17E0E1C87AD00A6B483 /* ExprConstant.cpp */,
35260CA40C7F75C000D66CE9 /* ExprCXX.cpp */,
+ 35EE48B00E0C4CCA00715C54 /* ParentMap.cpp */,
DE3452400AEF1A2D00DBC861 /* Stmt.cpp */,
DEF2EDA60C6A4252000C4259 /* StmtDumper.cpp */,
DE34621C0AFEB19B00DBC861 /* StmtPrinter.cpp */,
diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp
index a20236f9eb..0325ba5734 100644
--- a/lib/AST/ASTContext.cpp
+++ b/lib/AST/ASTContext.cpp
@@ -325,6 +325,12 @@ ASTContext::getTypeInfo(QualType T) {
break;
}
case Type::Tagged: {
+ if (cast<TagType>(T)->getDecl()->isInvalidDecl()) {
+ Width = 1;
+ Align = 1;
+ break;
+ }
+
if (EnumType *ET = dyn_cast<EnumType>(cast<TagType>(T)))
return getTypeInfo(ET->getDecl()->getIntegerType());
@@ -377,8 +383,8 @@ void ASTRecordLayout::LayoutField(const FieldDecl *FD, unsigned FieldNo,
if (!FD->getIdentifier())
FieldAlign = 1;
} else {
- if (FD->getType()->isIncompleteType()) {
- // This must be a flexible array member; we can't directly
+ if (FD->getType()->isIncompleteArrayType()) {
+ // This is a flexible array member; we can't directly
// query getTypeInfo about these, so we figure it out here.
// Flexible array members don't have any size, but they
// have to be aligned appropriately for their element type.
diff --git a/test/Sema/invalid-decl.c b/test/Sema/invalid-decl.c
index 2fa4758bbe..ccd3bc8365 100644
--- a/test/Sema/invalid-decl.c
+++ b/test/Sema/invalid-decl.c
@@ -6,3 +6,15 @@ void test() {
}
+// PR2400
+typedef xtype (*zend_stream_fsizer_t)(void* handle); // expected-error {{function cannot return array or function type}}
+
+typedef struct _zend_module_entry zend_module_entry;
+struct _zend_module_entry {
+ xtype globals_size; // expected-error {{field 'globals_size' declared as a function}}
+};
+
+zend_module_entry openssl_module_entry = {
+ sizeof(zend_module_entry)
+};
+