Author: compnerd
Date: Thu Nov 17 11:10:54 2016
New Revision: 287238

URL: http://llvm.org/viewvc/llvm-project?rev=287238&view=rev
Log:
Sema: correct typo correction for ivars in @implementation

The previous typo correction handling assumed that ivars are only declared in
the interface declaration rather than as a private ivar in the implementation.
Adjust the handling to permit both interfaces.  Assert earlier that the
interface has been acquired to ensure that we can identify when both possible
casts have failed.

Addresses PR31040!

Modified:
    cfe/trunk/lib/Sema/SemaExprMember.cpp
    cfe/trunk/test/SemaObjC/typo-correction.m

Modified: cfe/trunk/lib/Sema/SemaExprMember.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprMember.cpp?rev=287238&r1=287237&r2=287238&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExprMember.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExprMember.cpp Thu Nov 17 11:10:54 2016
@@ -1394,10 +1394,17 @@ static ExprResult LookupMemberExpr(Sema
 
         // 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);
+        if (auto *Category = dyn_cast<ObjCCategoryDecl>(D))
+          D = Category->getClassInterface();
+
+        if (auto *Implementation = dyn_cast<ObjCImplementationDecl>(D))
+          ClassDeclared = Implementation->getClassInterface();
+        else if (auto *Interface = dyn_cast<ObjCInterfaceDecl>(D))
+          ClassDeclared = Interface;
+
+        assert(ClassDeclared && "cannot query interface");
       } else {
         if (IsArrow &&
             IDecl->FindPropertyDeclaration(

Modified: cfe/trunk/test/SemaObjC/typo-correction.m
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/typo-correction.m?rev=287238&r1=287237&r2=287238&view=diff
==============================================================================
--- cfe/trunk/test/SemaObjC/typo-correction.m (original)
+++ cfe/trunk/test/SemaObjC/typo-correction.m Thu Nov 17 11:10:54 2016
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 %s -verify -fsyntax-only
+// RUN: %clang_cc1 %s -verify -fsyntax-only -fobjc-runtime=ios
 
 @protocol P
 -(id)description;
@@ -28,3 +28,26 @@ typedef int super1;
   [self foo:[super description] other:someivar]; // expected-error {{use of 
undeclared identifier 'someivar'; did you mean '_someivar'?}}
 }
 @end
+
+__attribute__ (( __objc_root_class__ ))
+@interface I {
+  id _interface; // expected-note {{'_interface' declared here}}
+}
+-(void)method;
+@end
+
+@interface I () {
+  id _extension; // expected-note {{'_extension' declared here}}
+}
+@end
+
+@implementation I {
+  id _implementation; // expected-note {{'_implementation' declared here}}
+}
+-(void)method {
+  (void)self->implementation; // expected-error {{'I' does not have a member 
named 'implementation'; did you mean '_implementation'?}}
+  (void)self->interface; // expected-error {{'I' does not have a member named 
'interface'; did you mean '_interface'?}}
+  (void)self->extension; // expected-error {{'I' does not have a member named 
'extension'; did you mean '_extension'?}}
+}
+@end
+


_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to