diff --git a/clang/lib/Sema/SemaExprObjC.cpp b/clang/lib/Sema/SemaExprObjC.cpp index e3d2074c0e27..5be84607b2a4 100644 --- a/clang/lib/Sema/SemaExprObjC.cpp +++ b/clang/lib/Sema/SemaExprObjC.cpp @@ -395,10 +395,10 @@ Sema::ExprResult Sema::ActOnInstanceMessage(ExprTy *receiver, Selector Sel, } if (Method && DiagnoseUseOfDecl(Method, receiverLoc)) return true; - } else { - // We're not in a method context, look for any factory method named 'Sel'. - Method = FactoryMethodPool[Sel].Method; } + // Look for any factory method named 'Sel'. + if (!Method) + Method = FactoryMethodPool[Sel].Method; if (!Method) Method = LookupInstanceMethodInGlobalPool( Sel, SourceRange(lbrac,rbrac)); diff --git a/clang/test/SemaObjC/method-lookup-2.m b/clang/test/SemaObjC/method-lookup-2.m index 4ebdb8e4524d..9939e349547a 100644 --- a/clang/test/SemaObjC/method-lookup-2.m +++ b/clang/test/SemaObjC/method-lookup-2.m @@ -2,7 +2,10 @@ typedef signed char BOOL; @protocol NSObject ++ alloc; +- init; - (BOOL) isEqual:(id) object; +- (Class)class; @end @interface NSObject < NSObject > {} @end @@ -38,3 +41,22 @@ extern NSString *const NSWillBecomeMultiThreadedNotification; return[[self sharedInstance] run]; } @end + +@interface XX : NSObject + ++ classMethod; + +@end + +@interface YY : NSObject +- whatever; +@end + +@implementation YY + +- whatever { + id obj = [[XX alloc] init]; + [[obj class] classMethod]; +} + +@end