diff options
| author | Steve Naroff <snaroff@apple.com> | 2009-03-05 20:12:00 +0000 |
|---|---|---|
| committer | Steve Naroff <snaroff@apple.com> | 2009-03-05 20:12:00 +0000 |
| commit | e29c4dd02238ad794f2348e27ba89b5aac90bb6a (patch) | |
| tree | d514599a360b22e07e96b8a46e127b9781e72446 /clang | |
| parent | 631c5818ab34a1111612a9599fb653f4e1f0dfba (diff) | |
| download | bcm5719-llvm-e29c4dd02238ad794f2348e27ba89b5aac90bb6a.tar.gz bcm5719-llvm-e29c4dd02238ad794f2348e27ba89b5aac90bb6a.zip | |
Partial fix <rdar://problem/6301205> [irgen] dot-syntax on super isn't supported.
Tweak Sema::ActOnMemberReferenceExpr() and Sema::ActOnDeclarationNameExpr() to handle "super." notation for Class methods.
llvm-svn: 66185
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 27 | ||||
| -rw-r--r-- | clang/test/SemaObjC/super-property-notation.m | 30 |
2 files changed, 55 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index f71f82daa90..8630da3c3f1 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -673,8 +673,13 @@ Sema::ActOnDeclarationNameExpr(Scope *S, SourceLocation Loc, } // Needed to implement property "super.method" notation. if (D == 0 && II->isStr("super")) { - QualType T = Context.getPointerType(Context.getObjCInterfaceType( - getCurMethodDecl()->getClassInterface())); + QualType T; + + if (getCurMethodDecl()->isInstanceMethod()) + T = Context.getPointerType(Context.getObjCInterfaceType( + getCurMethodDecl()->getClassInterface())); + else + T = Context.getObjCClassType(); return Owned(new (Context) ObjCSuperExpr(Loc, T)); } } @@ -1956,6 +1961,24 @@ Sema::ActOnMemberReferenceExpr(Scope *S, ExprArg Base, SourceLocation OpLoc, return ExprError(Diag(MemberLoc, diag::err_property_not_found) << &Member << BaseType); } + // Handle properties on ObjC 'Class' types. + if (OpKind == tok::period && (BaseType == Context.getObjCClassType())) { + // Also must look for a getter name which uses property syntax. + Selector Sel = PP.getSelectorTable().getNullarySelector(&Member); + if (ObjCMethodDecl *MD = getCurMethodDecl()) { + ObjCMethodDecl *OMD; + // FIXME: need to also look locally in the implementation. + if ((OMD = MD->getClassInterface()->lookupClassMethod(Sel))) { + // Check the use of this method. + if (DiagnoseUseOfDecl(OMD, MemberLoc)) + return ExprError(); + + return Owned(new (Context) ObjCMessageExpr(BaseExpr, Sel, + OMD->getResultType(), OMD, OpLoc, MemberLoc, NULL, 0)); + } + } + } + // Handle 'field access' to vectors, such as 'V.xx'. if (BaseType->isExtVectorType()) { QualType ret = CheckExtVectorComponent(BaseType, OpLoc, Member, MemberLoc); diff --git a/clang/test/SemaObjC/super-property-notation.m b/clang/test/SemaObjC/super-property-notation.m new file mode 100644 index 00000000000..4c963629481 --- /dev/null +++ b/clang/test/SemaObjC/super-property-notation.m @@ -0,0 +1,30 @@ +// RUN: clang -fsyntax-only -verify %s + +@interface B ++(int) classGetter; +-(int) getter; +@end + +@interface A : B +@end + +@implementation A ++(int) classGetter { + return 0; +} + ++(int) classGetter2 { + return super.classGetter; +} + +-(void) method { + int x = super.getter; +} +@end + +void f0() { + // FIXME: not implemented yet. + //int l1 = A.classGetter; + int l2 = [A classGetter2]; +} + |

