diff options
-rw-r--r-- | clang/lib/Sema/SemaOverload.cpp | 12 | ||||
-rw-r--r-- | clang/test/SemaObjC/resolve-method-in-global-pool.m | 21 |
2 files changed, 32 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 7bc42bfe9cb..95b1dc09062 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -5743,10 +5743,20 @@ ObjCMethodDecl *Sema::SelectBestMethod(Selector Sel, MultiExprArg Args, break; } } - } else + } else { // Check for extra arguments to non-variadic methods. if (Args.size() != NumNamedArgs) Match = false; + else if (Match && NumNamedArgs == 0 && Methods.size() > 1) { + // Special case when selectors have no argument. In this case, select + // one with the most general result type of 'id'. + for (unsigned b = 0, e = Methods.size(); b < e; b++) { + QualType ReturnT = Methods[b]->getReturnType(); + if (ReturnT->isObjCIdType()) + return Methods[b]; + } + } + } if (Match) return Method; diff --git a/clang/test/SemaObjC/resolve-method-in-global-pool.m b/clang/test/SemaObjC/resolve-method-in-global-pool.m index 2c5dde4cba9..523856d663f 100644 --- a/clang/test/SemaObjC/resolve-method-in-global-pool.m +++ b/clang/test/SemaObjC/resolve-method-in-global-pool.m @@ -40,3 +40,24 @@ void func( Class c, float g ) { [c clsMethod: &g]; } + +// rdar://18095772 +@protocol NSKeyedArchiverDelegate @end + +@interface NSKeyedArchiver +@property (assign) id <NSKeyedArchiverDelegate> delegate; +@end + +@interface NSConnection +@property (assign) id delegate; +@end + +extern id NSApp; + +@interface AppDelegate +@end + +AppDelegate* GetDelegate() +{ + return [NSApp delegate]; +} |