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
This commit is contained in:
Chris Lattner 2008-08-09 21:35:13 +00:00
Родитель aad6953ca1
Коммит 8389eab190
3 изменённых файлов: 22 добавлений и 4 удалений

Просмотреть файл

@ -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 */,

Просмотреть файл

@ -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.

Просмотреть файл

@ -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)
};