diff options
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Sema/SemaDeclObjC.cpp | 6 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaExprObjC.cpp | 26 | ||||
| -rw-r--r-- | clang/test/Sema/objc-method-lookup.m | 40 |
3 files changed, 68 insertions, 4 deletions
diff --git a/clang/lib/Sema/SemaDeclObjC.cpp b/clang/lib/Sema/SemaDeclObjC.cpp index 795e356cc37..3117f87f7ba 100644 --- a/clang/lib/Sema/SemaDeclObjC.cpp +++ b/clang/lib/Sema/SemaDeclObjC.cpp @@ -42,15 +42,17 @@ void Sema::ObjCActOnStartOfMethodDef(Scope *FnBodyScope, DeclTy *D) { // Insert the invisible arguments, self and _cmd! PI.Ident = &Context.Idents.get("self"); PI.IdentLoc = SourceLocation(); // synthesized vars have a null location. - QualType selfTy = Context.getObjCIdType(); + QualType selfTy; if (MDecl->isInstance()) { + selfTy = Context.getObjCIdType(); if (ObjCInterfaceDecl *OID = MDecl->getClassInterface()) { // There may be no interface context due to error in declaration of the // interface (which has been reported). Recover gracefully selfTy = Context.getObjCInterfaceType(OID); selfTy = Context.getPointerType(selfTy); } - } + } else // we have a factory method. + selfTy = Context.getObjCClassType(); CurMethodDecl->setSelfDecl(CreateImplicitParameter(FnBodyScope, PI.Ident, PI.IdentLoc, selfTy)); diff --git a/clang/lib/Sema/SemaExprObjC.cpp b/clang/lib/Sema/SemaExprObjC.cpp index e2e23ce0637..1f21ee0ec57 100644 --- a/clang/lib/Sema/SemaExprObjC.cpp +++ b/clang/lib/Sema/SemaExprObjC.cpp @@ -223,8 +223,7 @@ Sema::ExprResult Sema::ActOnInstanceMessage( receiverType = RExpr->getType().getCanonicalType().getUnqualifiedType(); - if (receiverType == Context.getObjCIdType().getCanonicalType() || - receiverType == Context.getObjCClassType().getCanonicalType()) { + if (receiverType == Context.getObjCIdType().getCanonicalType()) { Method = InstanceMethodPool[Sel].Method; if (!Method) Method = FactoryMethodPool[Sel].Method; @@ -238,6 +237,29 @@ Sema::ExprResult Sema::ActOnInstanceMessage( if (CheckMessageArgumentTypes(ArgExprs, Sel.getNumArgs(), Method)) return true; } + } else if (receiverType == Context.getObjCClassType().getCanonicalType()) { + if (CurMethodDecl) { + ObjCInterfaceDecl* ClassDecl = CurMethodDecl->getClassInterface(); + // If we have an implementation in scope, check "private" methods. + if (ClassDecl) + if (ObjCImplementationDecl *ImpDecl = + ObjCImplementations[ClassDecl->getIdentifier()]) + Method = ImpDecl->getClassMethod(Sel); + } + if (!Method) + Method = FactoryMethodPool[Sel].Method; + if (!Method) + Method = InstanceMethodPool[Sel].Method; + if (!Method) { + Diag(lbrac, diag::warn_method_not_found, std::string("-"), Sel.getName(), + SourceRange(lbrac, rbrac)); + returnType = Context.getObjCIdType(); + } else { + returnType = Method->getResultType(); + if (Sel.getNumArgs()) + if (CheckMessageArgumentTypes(ArgExprs, Sel.getNumArgs(), Method)) + return true; + } } else { bool receiverIsQualId = isa<ObjCQualifiedIdType>(receiverType); // FIXME (snaroff): checking in this code from Patrick. Needs to be diff --git a/clang/test/Sema/objc-method-lookup.m b/clang/test/Sema/objc-method-lookup.m new file mode 100644 index 00000000000..4ebdb8e4524 --- /dev/null +++ b/clang/test/Sema/objc-method-lookup.m @@ -0,0 +1,40 @@ +// RUN: clang -fsyntax-only -verify %s +typedef signed char BOOL; + +@protocol NSObject +- (BOOL) isEqual:(id) object; +@end + +@interface NSObject < NSObject > {} @end + +@class NSString, NSPort; + +@interface NSPortNameServer:NSObject ++ (NSPortNameServer *) systemDefaultPortNameServer; +@end + +@interface NSMachBootstrapServer:NSPortNameServer + (id) sharedInstance; @end + +enum { + NSWindowsNTOperatingSystem = 1, NSWindows95OperatingSystem, NSSolarisOperatingSystem, NSHPUXOperatingSystem, NSMACHOperatingSystem, NSSunOSOperatingSystem, NSOSF1OperatingSystem +}; + +@interface NSRunLoop:NSObject {} @end + +@interface NSRunLoop(NSRunLoopConveniences) +- (void) run; +@end + +extern NSString *const NSWillBecomeMultiThreadedNotification; + +@interface SenTestTool:NSObject {} +@end + +@implementation SenTestTool ++ (void) initialize {} ++(SenTestTool *) sharedInstance {} +-(int) run {} ++(int) run { + return[[self sharedInstance] run]; +} +@end |

