]> granicus.if.org Git - clang/commitdiff
[sema] Fix crash when typo-transforming an expression containing an ObjC super messag...
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Tue, 28 Jul 2015 06:12:24 +0000 (06:12 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Tue, 28 Jul 2015 06:12:24 +0000 (06:12 +0000)
rdar://21427916

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@243387 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/TreeTransform.h
test/SemaObjC/typo-correction.m

index 0ec47b8fc19ab4b3f172dab40e2369ada6f8d3d5..35408acdad3dbcac0bfdf96f468644a46f3882f4 100644 (file)
@@ -2657,20 +2657,18 @@ public:
   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
                                     Selector Sel,
                                     ArrayRef<SourceLocation> SelectorLocs,
+                                    QualType SuperType,
                                     ObjCMethodDecl *Method,
                                     SourceLocation LBracLoc,
                                     MultiExprArg Args,
                                     SourceLocation RBracLoc) {
-    ObjCInterfaceDecl *Class = Method->getClassInterface();
-    QualType ReceiverTy = SemaRef.Context.getObjCInterfaceType(Class);
-    
     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
-                                          ReceiverTy,
+                                          SuperType,
                                           SuperLoc,
                                           Sel, Method, LBracLoc, SelectorLocs,
                                           RBracLoc, Args)
                                       : SemaRef.BuildClassMessage(nullptr,
-                                          ReceiverTy,
+                                          SuperType,
                                           SuperLoc,
                                           Sel, Method, LBracLoc, SelectorLocs,
                                           RBracLoc, Args);
@@ -10348,6 +10346,7 @@ TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
                                                E->getSelector(),
                                                SelLocs,
+                                               E->getReceiverType(),
                                                E->getMethodDecl(),
                                                E->getLeftLoc(),
                                                Args,
index 893e31294ad67f8e042cbefb27d889c494557272..58824e2edbf097dd97e9d0d06650f239725c3091 100644 (file)
@@ -1,10 +1,16 @@
 // RUN: %clang_cc1 %s -verify -fsyntax-only
 
-@interface B
+@protocol P
+-(id)description;
+@end
+
+@interface B<P>
 @property int x;
 @end
 
-@interface S : B
+@interface S : B {
+  id _someivar; // expected-note {{here}}
+}
 @end
 
 // Spell-checking 'undefined' is ok.
@@ -12,9 +18,13 @@ undefined var; // expected-error {{unknown type name}}
 
 typedef int super1;
 @implementation S
--(void)foo {
+-(void)foo:(id)p1 other:(id)p2 {
   // Spell-checking 'super' is not ok.
   super.x = 0;
   self.x = 0;
 }
+
+-(void)test {
+  [self foo:[super description] other:someivar]; // expected-error {{use of undeclared identifier 'someivar'; did you mean '_someivar'?}}
+}
 @end