зеркало из https://github.com/microsoft/clang-1.git
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:
Родитель
aad6953ca1
Коммит
8389eab190
|
@ -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)
|
||||
};
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче