From: Fariborz Jahanian Date: Mon, 30 Mar 2015 23:30:24 +0000 (+0000) Subject: [Objective-C patch]. Amend TransformObjCMessageExpr to handle call X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=14627bb51fb28648007bc19e67b8eafc20903af6;p=clang [Objective-C patch]. Amend TransformObjCMessageExpr to handle call to 'super' of instance/class methods and not assert. rdar://20350364 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@233642 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h index 1b0080a05f..6116a78dc7 100644 --- a/lib/Sema/TreeTransform.h +++ b/lib/Sema/TreeTransform.h @@ -2623,6 +2623,31 @@ public: RBracLoc, Args); } + /// \brief Build a new Objective-C instance/class message to 'super'. + ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, + Selector Sel, + ArrayRef SelectorLocs, + 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, + SuperLoc, + Sel, Method, LBracLoc, SelectorLocs, + RBracLoc, Args) + : SemaRef.BuildClassMessage(nullptr, + ReceiverTy, + SuperLoc, + Sel, Method, LBracLoc, SelectorLocs, + RBracLoc, Args); + + + } + /// \brief Build a new Objective-C ivar reference expression. /// /// By default, performs semantic analysis to build the new expression. @@ -10047,6 +10072,19 @@ TreeTransform::TransformObjCMessageExpr(ObjCMessageExpr *E) { Args, E->getRightLoc()); } + else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || + E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { + // Build a new class message send to 'super'. + SmallVector SelLocs; + E->getSelectorLocs(SelLocs); + return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), + E->getSelector(), + SelLocs, + E->getMethodDecl(), + E->getLeftLoc(), + Args, + E->getRightLoc()); + } // Instance message: transform the receiver assert(E->getReceiverKind() == ObjCMessageExpr::Instance && diff --git a/test/SemaObjC/undef-arg-super-method-call.m b/test/SemaObjC/undef-arg-super-method-call.m new file mode 100644 index 0000000000..6a27acb630 --- /dev/null +++ b/test/SemaObjC/undef-arg-super-method-call.m @@ -0,0 +1,23 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s +// rdar://20350364 + +@interface NSObject @end + +@interface DBGViewDebuggerSupport : NSObject ++ (void)addViewLayerInfo:(id)view; +- (void)addInstViewLayerInfo:(id)view; +@end + +@interface DBGViewDebuggerSupport_iOS : DBGViewDebuggerSupport +@end + +@implementation DBGViewDebuggerSupport_iOS ++ (void)addViewLayerInfo:(id)aView; // expected-note {{'aView' declared here}} +{ + [super addViewLayerInfo:view]; // expected-error {{use of undeclared identifier 'view'; did you mean 'aView'?}} +} +- (void)addInstViewLayerInfo:(id)aView; // expected-note {{'aView' declared here}} +{ + [super addInstViewLayerInfo:view]; // expected-error {{use of undeclared identifier 'view'; did you mean 'aView'?}} +} +@end