From: Chris Lattner Date: Sat, 9 Aug 2008 21:35:13 +0000 (+0000) Subject: Fix PR2400 by more graceful handling of invalid decls. Don't try to layout X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8389eab190afef3462f6418b8d8fb70fb01c4005;p=clang 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 --- 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(T)->getDecl()->isInvalidDecl()) { + Width = 1; + Align = 1; + break; + } + if (EnumType *ET = dyn_cast(cast(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) +}; +