[cfe-commits] r152968 - /cfe/trunk/lib/Sema/SemaExprMember.cpp

Ted Kremenek kremenek at apple.com
Fri Mar 16 17:53:39 PDT 2012


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





More information about the cfe-commits mailing list