From: Fariborz Jahanian Date: Wed, 27 Aug 2014 16:38:47 +0000 (+0000) Subject: Objective-C. When multiple nullary selectors are found in X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=fa0908f21915ffa5e0f4f2e4feda84b02b43e7ce;p=clang Objective-C. When multiple nullary selectors are found in global pool in the course of method selection for a messaging expression, select one with the most general return type of 'id'. This is to remove type-mismatch warning (which is useless) as result of random selection of method with more restrictive return type. rdar://18095772 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@216560 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp index 7bc42bfe9c..95b1dc0906 100644 --- a/lib/Sema/SemaOverload.cpp +++ b/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/test/SemaObjC/resolve-method-in-global-pool.m b/test/SemaObjC/resolve-method-in-global-pool.m index 2c5dde4cba..523856d663 100644 --- a/test/SemaObjC/resolve-method-in-global-pool.m +++ b/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 delegate; +@end + +@interface NSConnection +@property (assign) id delegate; +@end + +extern id NSApp; + +@interface AppDelegate +@end + +AppDelegate* GetDelegate() +{ + return [NSApp delegate]; +}