From: Ted Kremenek Date: Sat, 17 Mar 2012 00:53:39 +0000 (+0000) Subject: Fix crash on invalid code. I've tried to produce a reduced test case, but when I... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2c085ede8d0186b6b91d553fdb0d95798501c20f;p=clang Fix crash on invalid code. I've tried to produce a reduced test case, but when I do the specific crash is hidden. Fixes . git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@152968 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaExprMember.cpp b/lib/Sema/SemaExprMember.cpp index 180c1aa0f0..4155fdb9db 100644 --- a/lib/Sema/SemaExprMember.cpp +++ b/lib/Sema/SemaExprMember.cpp @@ -1127,7 +1127,7 @@ Sema::LookupMemberExpr(LookupResult &R, ExprResult &BaseExpr, << BaseExpr.get()->getSourceRange())) return ExprError(); - ObjCInterfaceDecl *ClassDeclared; + ObjCInterfaceDecl *ClassDeclared = 0; ObjCIvarDecl *IV = IDecl->lookupInstanceVariable(Member, ClassDeclared); if (!IV) { @@ -1145,6 +1145,13 @@ Sema::LookupMemberExpr(LookupResult &R, ExprResult &BaseExpr, IV->getNameAsString()); Diag(IV->getLocation(), diag::note_previous_decl) << IV->getDeclName(); + + // Figure out the class that declares the ivar. + assert(!ClassDeclared); + Decl *D = cast(IV->getDeclContext()); + if (ObjCCategoryDecl *CAT = dyn_cast(D)) + D = CAT->getClassInterface(); + ClassDeclared = cast(D); } else { if (IsArrow && IDecl->FindPropertyDeclaration(Member)) { Diag(MemberLoc, @@ -1160,6 +1167,8 @@ Sema::LookupMemberExpr(LookupResult &R, ExprResult &BaseExpr, return ExprError(); } } + + assert(ClassDeclared); // If the decl being referenced had an error, return an error for this // sub-expr without emitting another error, in order to avoid cascading