forked from OSchip/llvm-project
[AST] Fix a crash on invalid bitwidth exprs when preserving the recoveryexprs.
Summary: If the bitwith expr contains errors, we mark the field decl invalid. This patch also tweaks the behavior of ObjCInterfaceDecl to be consistent with existing RecordDecl -- getObjCLayout method is only called with valid decls. Reviewers: sammccall Subscribers: cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D76953
This commit is contained in:
parent
dcc04e09cf
commit
f757ecbf85
|
@ -2161,6 +2161,11 @@ TypeInfo ASTContext::getTypeInfoImpl(const Type *T) const {
|
|||
return getTypeInfo(cast<AdjustedType>(T)->getAdjustedType().getTypePtr());
|
||||
case Type::ObjCInterface: {
|
||||
const auto *ObjCI = cast<ObjCInterfaceType>(T);
|
||||
if (ObjCI->getDecl()->isInvalidDecl()) {
|
||||
Width = 8;
|
||||
Align = 8;
|
||||
break;
|
||||
}
|
||||
const ASTRecordLayout &Layout = getASTObjCInterfaceLayout(ObjCI->getDecl());
|
||||
Width = toBits(Layout.getSize());
|
||||
Align = toBits(Layout.getAlignment());
|
||||
|
|
|
@ -3222,7 +3222,8 @@ ASTContext::getObjCLayout(const ObjCInterfaceDecl *D,
|
|||
if (D->hasExternalLexicalStorage() && !D->getDefinition())
|
||||
getExternalSource()->CompleteType(const_cast<ObjCInterfaceDecl*>(D));
|
||||
D = D->getDefinition();
|
||||
assert(D && D->isThisDeclarationADefinition() && "Invalid interface decl!");
|
||||
assert(D && !D->isInvalidDecl() && D->isThisDeclarationADefinition() &&
|
||||
"Invalid interface decl!");
|
||||
|
||||
// Look up this layout, if already laid out, return what we have.
|
||||
const ObjCContainerDecl *Key =
|
||||
|
|
|
@ -16172,6 +16172,10 @@ ExprResult Sema::VerifyBitField(SourceLocation FieldLoc,
|
|||
IdentifierInfo *FieldName,
|
||||
QualType FieldTy, bool IsMsStruct,
|
||||
Expr *BitWidth, bool *ZeroWidth) {
|
||||
assert(BitWidth);
|
||||
if (BitWidth->containsErrors())
|
||||
return ExprError();
|
||||
|
||||
// Default to true; that shouldn't confuse checks for emptiness
|
||||
if (ZeroWidth)
|
||||
*ZeroWidth = true;
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
// RUN: %clang_cc1 -fobjc-runtime=gcc -frecovery-ast -verify %s
|
||||
// RUN: %clang_cc1 -fobjc-runtime=gcc -fno-recovery-ast -verify %s
|
||||
|
||||
@interface Ivar
|
||||
{
|
||||
int Foo : foo(); // expected-error {{use of undeclared identifier}}
|
||||
};
|
||||
@end
|
||||
|
||||
struct X { int Y: foo(); }; // expected-error {{use of undeclared identifier}}
|
||||
|
||||
constexpr int s = sizeof(Ivar);
|
||||
constexpr int ss = sizeof(X);
|
Loading…
Reference in New Issue