diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2015-03-30 23:30:24 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2015-03-30 23:30:24 +0000 |
commit | a8c2a0b0b24d915a2e8fcfaf9cdc01aafc7c0b9c (patch) | |
tree | 2f77612efcc9b0ff360636a28ff477c40901753a | |
parent | 4c302598798c99a2b9e4591cf1b3db2925f047ed (diff) | |
download | bcm5719-llvm-a8c2a0b0b24d915a2e8fcfaf9cdc01aafc7c0b9c.tar.gz bcm5719-llvm-a8c2a0b0b24d915a2e8fcfaf9cdc01aafc7c0b9c.zip |
[Objective-C patch]. Amend TransformObjCMessageExpr to handle call
to 'super' of instance/class methods and not assert.
rdar://20350364
llvm-svn: 233642
-rw-r--r-- | clang/lib/Sema/TreeTransform.h | 38 | ||||
-rw-r--r-- | clang/test/SemaObjC/undef-arg-super-method-call.m | 23 |
2 files changed, 61 insertions, 0 deletions
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 1b0080a05fe..6116a78dc7b 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/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<SourceLocation> 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<Derived>::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<SourceLocation, 16> 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/clang/test/SemaObjC/undef-arg-super-method-call.m b/clang/test/SemaObjC/undef-arg-super-method-call.m new file mode 100644 index 00000000000..6a27acb6304 --- /dev/null +++ b/clang/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 |