Sent from my iPhone
On Mar 17, 2012, at 9:50 AM, Fariborz Jahanian <[email protected]> wrote: > I think after ivar name is corrected, you should call lookupInstanceVariable > again instead of looking up ivar out of the box. > This makes sure that ivar is always looked up with the same lookup algorithm > (and ClassDeclared is set same way) IMO, the right answer here is to fold lookupInstanceVariable into Sema's normal lookup routines, so there's just one, always-correct way to find ivars. > . A positive test case will clarify this issue > (even though it does not show the original crashed bug). > > - Fariborz > > > On Mar 16, 2012, at 5:53 PM, Ted Kremenek wrote: > >> Author: kremenek >> Date: Fri Mar 16 19:53:39 2012 >> New Revision: 152968 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=152968&view=rev >> Log: >> Fix crash on invalid code. I've tried to produce a reduced test case, but >> when I do the specific crash is hidden. Fixes <rdar://problem/11063594>. >> >> Modified: >> cfe/trunk/lib/Sema/SemaExprMember.cpp >> >> Modified: cfe/trunk/lib/Sema/SemaExprMember.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprMember.cpp?rev=152968&r1=152967&r2=152968&view=diff >> ============================================================================== >> --- cfe/trunk/lib/Sema/SemaExprMember.cpp (original) >> +++ cfe/trunk/lib/Sema/SemaExprMember.cpp Fri Mar 16 19:53:39 2012 >> @@ -1127,7 +1127,7 @@ >> << BaseExpr.get()->getSourceRange())) >> return ExprError(); >> >> - ObjCInterfaceDecl *ClassDeclared; >> + ObjCInterfaceDecl *ClassDeclared = 0; >> ObjCIvarDecl *IV = IDecl->lookupInstanceVariable(Member, ClassDeclared); >> >> if (!IV) { >> @@ -1145,6 +1145,13 @@ >> IV->getNameAsString()); >> Diag(IV->getLocation(), diag::note_previous_decl) >> << IV->getDeclName(); >> + >> + // Figure out the class that declares the ivar. >> + assert(!ClassDeclared); >> + Decl *D = cast<Decl>(IV->getDeclContext()); >> + if (ObjCCategoryDecl *CAT = dyn_cast<ObjCCategoryDecl>(D)) >> + D = CAT->getClassInterface(); >> + ClassDeclared = cast<ObjCInterfaceDecl>(D); >> } else { >> if (IsArrow && IDecl->FindPropertyDeclaration(Member)) { >> Diag(MemberLoc, >> @@ -1160,6 +1167,8 @@ >> 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 >> >> >> _______________________________________________ >> cfe-commits mailing list >> [email protected] >> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
