From 269d38e036293631be8cf6005528b544cbbf0ef9 Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Wed, 26 Mar 2014 20:59:26 +0000 Subject: [PATCH] Objective-C. Fixes a bogus warning on unimplemented selectors because we were not going through entire elements in list of all implemented selectors. // rdar://16428638 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@204852 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaDeclObjC.cpp | 14 +++++++++----- test/SemaObjC/selector-3.m | 24 ++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index 5be26a91a2..d59dd8b995 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/lib/Sema/SemaDeclObjC.cpp @@ -2402,11 +2402,15 @@ ObjCMethodDecl *Sema::LookupImplementedMethodInGlobalPool(Selector Sel) { return 0; GlobalMethods &Methods = Pos->second; - - if (Methods.first.Method && Methods.first.Method->isDefined()) - return Methods.first.Method; - if (Methods.second.Method && Methods.second.Method->isDefined()) - return Methods.second.Method; + for (const ObjCMethodList *Method = &Methods.first; Method; + Method = Method->getNext()) + if (Method->Method && Method->Method->isDefined()) + return Method->Method; + + for (const ObjCMethodList *Method = &Methods.second; Method; + Method = Method->getNext()) + if (Method->Method && Method->Method->isDefined()) + return Method->Method; return 0; } diff --git a/test/SemaObjC/selector-3.m b/test/SemaObjC/selector-3.m index 37c4ec19df..c934dbcd8d 100644 --- a/test/SemaObjC/selector-3.m +++ b/test/SemaObjC/selector-3.m @@ -110,3 +110,27 @@ extern SEL MySelector(SEL s); @interface USETextSub : USEText - (int) invalidate : (id)arg; @end + +// rdar://16428638 +@interface I16428638 +- (int) compare: (I16428638 *) arg1; // commenting out this line avoids the warning +@end + +@interface J16428638 +- (int) compare: (J16428638 *) arg1; +@end + +@implementation J16428638 +- (void)method { + SEL s = @selector(compare:); // spurious warning + (void)s; +} +- (int) compare: (J16428638 *) arg1 { + return 0; +} +@end + +void test16428638() { + SEL s = @selector(compare:); + (void)s; +} -- 2.40.0