From cd9c9b5c464419116cc00145286589b13fd9eadf Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Tue, 18 Jun 2013 17:10:58 +0000 Subject: [PATCH] Objective-C: Fixes a typo correction bug where a selector would be correted to identical selector name in certain corner cases. // rdar://7853549 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@184208 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaDeclObjC.cpp | 6 ++++-- lib/Sema/SemaExprObjC.cpp | 2 +- test/SemaObjC/call-super-2.m | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index b62487bee7..9f10b7bb7e 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/lib/Sema/SemaDeclObjC.cpp @@ -2331,7 +2331,8 @@ Sema::SelectorsForTypoCorrection(Selector Sel, // instance methods for (ObjCMethodList *M = &b->second.first; M; M=M->getNext()) if (M->Method && - (M->Method->getSelector().getNumArgs() == NumArgs)) { + (M->Method->getSelector().getNumArgs() == NumArgs) && + (M->Method->getSelector() != Sel)) { if (ObjectIsId) Methods.push_back(M->Method); else if (!ObjectIsClass && @@ -2341,7 +2342,8 @@ Sema::SelectorsForTypoCorrection(Selector Sel, // class methods for (ObjCMethodList *M = &b->second.second; M; M=M->getNext()) if (M->Method && - (M->Method->getSelector().getNumArgs() == NumArgs)) { + (M->Method->getSelector().getNumArgs() == NumArgs) && + (M->Method->getSelector() != Sel)) { if (ObjectIsClass) Methods.push_back(M->Method); else if (!ObjectIsId && diff --git a/lib/Sema/SemaExprObjC.cpp b/lib/Sema/SemaExprObjC.cpp index 678a1291ae..2944422c55 100644 --- a/lib/Sema/SemaExprObjC.cpp +++ b/lib/Sema/SemaExprObjC.cpp @@ -1233,7 +1233,7 @@ bool Sema::CheckMessageArgumentTypes(QualType ReceiverType, : diag::warn_inst_method_not_found; if (!getLangOpts().DebuggerSupport) { const ObjCMethodDecl *OMD = SelectorsForTypoCorrection(Sel, ReceiverType); - if (OMD && !OMD->isInvalidDecl() && OMD->getSelector() != Sel) { + if (OMD && !OMD->isInvalidDecl()) { if (getLangOpts().ObjCAutoRefCount) DiagID = diag::error_method_not_found_with_typo; else diff --git a/test/SemaObjC/call-super-2.m b/test/SemaObjC/call-super-2.m index c33e7ab264..8927f3b528 100644 --- a/test/SemaObjC/call-super-2.m +++ b/test/SemaObjC/call-super-2.m @@ -35,7 +35,7 @@ id objc_getClass(const char *s); @implementation Derived + (int) class_func1 { - int i = (size_t)[self class_func0]; // expected-warning {{class method '+class_func0' not found (return type defaults to 'id')}} + int i = (size_t)[self class_func0]; // expected-warning {{class method '+class_func0' not found (return type defaults to 'id'); did you mean '+class_func}} return i + (size_t)[super class_func0]; // expected-warning {{class method '+class_func0' not found (return type defaults to 'id')}} } + (int) class_func2 -- 2.40.0