From: Argyrios Kyrtzidis Date: Tue, 28 Jul 2015 06:12:24 +0000 (+0000) Subject: [sema] Fix crash when typo-transforming an expression containing an ObjC super messag... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=445092f1baaeaedfb2b670f0fe281ed1b80d5d3a;p=clang [sema] Fix crash when typo-transforming an expression containing an ObjC super message expression. rdar://21427916 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@243387 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h index 0ec47b8fc1..35408acdad 100644 --- a/lib/Sema/TreeTransform.h +++ b/lib/Sema/TreeTransform.h @@ -2657,20 +2657,18 @@ public: ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, Selector Sel, ArrayRef 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::TransformObjCMessageExpr(ObjCMessageExpr *E) { return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), E->getSelector(), SelLocs, + E->getReceiverType(), E->getMethodDecl(), E->getLeftLoc(), Args, diff --git a/test/SemaObjC/typo-correction.m b/test/SemaObjC/typo-correction.m index 893e31294a..58824e2edb 100644 --- a/test/SemaObjC/typo-correction.m +++ b/test/SemaObjC/typo-correction.m @@ -1,10 +1,16 @@ // RUN: %clang_cc1 %s -verify -fsyntax-only -@interface B +@protocol P +-(id)description; +@end + +@interface B

@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