]> granicus.if.org Git - clang/commitdiff
Fix PR2400 by more graceful handling of invalid decls. Don't try to layout
authorChris Lattner <sabre@nondot.org>
Sat, 9 Aug 2008 21:35:13 +0000 (21:35 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 9 Aug 2008 21:35:13 +0000 (21:35 +0000)
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

clang.xcodeproj/project.pbxproj
lib/AST/ASTContext.cpp
test/Sema/invalid-decl.c

index ff5647df40e262cc9a6a9200374ffc07296d7242..31cf111a5920938b5a71504ac905b367309039a5 100644 (file)
                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 */,
index a20236f9eb5d430e6b88221bbd1c43983cb31f34..0325ba5734a0d1def5b9c114e59c85df7937cd10 100644 (file)
@@ -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.
index 2fa4758bbe9308456b1289a58be1d069e57f0f30..ccd3bc83659fcf462b3fd25f463a48ffb46ae860 100644 (file)
@@ -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)
+};
+