diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2014-06-24 17:02:19 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2014-06-24 17:02:19 +0000 |
commit | a36053be37f9f3e3fff6aadb90d81d4e06d61d1f (patch) | |
tree | 20cfa405e317c267738f38f12924760c9097f274 /lib/Sema/SemaExprObjC.cpp | |
parent | e8e398049c5cb9d8ee10a8fcee11cb5df2f8999f (diff) | |
download | clang-a36053be37f9f3e3fff6aadb90d81d4e06d61d1f.tar.gz clang-a36053be37f9f3e3fff6aadb90d81d4e06d61d1f.tar.bz2 clang-a36053be37f9f3e3fff6aadb90d81d4e06d61d1f.tar.xz |
Objective-C. When we use @selector(save:), etc. there may be more
than one method with mismatched type of same selector name.
clang issues a warning to point this out since it may cause
undefined behavior. There are cases though that some APIs
don't care about user methods and such warnings are perceived as
noise. This patch allows users to add paren delimiters around
selector name to turn off such warnings. So, @selector((save:)) will
turn off the warning. It also provides 'fixit' so user knows
what to do. // rdar://16458579
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@211611 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaExprObjC.cpp')
-rw-r--r-- | lib/Sema/SemaExprObjC.cpp | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/lib/Sema/SemaExprObjC.cpp b/lib/Sema/SemaExprObjC.cpp index 9fbf656b55..299dd5d379 100644 --- a/lib/Sema/SemaExprObjC.cpp +++ b/lib/Sema/SemaExprObjC.cpp @@ -976,6 +976,8 @@ ExprResult Sema::ParseObjCEncodeExpression(SourceLocation AtLoc, static bool HelperToDiagnoseMismatchedMethodsInGlobalPool(Sema &S, SourceLocation AtLoc, + SourceLocation LParenLoc, + SourceLocation RParenLoc, ObjCMethodDecl *Method, ObjCMethodList &MethList) { ObjCMethodList *M = &MethList; @@ -991,7 +993,8 @@ static bool HelperToDiagnoseMismatchedMethodsInGlobalPool(Sema &S, if (!Warned) { Warned = true; S.Diag(AtLoc, diag::warning_multiple_selectors) - << Method->getSelector(); + << Method->getSelector() << FixItHint::CreateInsertion(LParenLoc, "(") + << FixItHint::CreateInsertion(RParenLoc, ")"); S.Diag(Method->getLocation(), diag::note_method_declared_at) << Method->getDeclName(); } @@ -1003,23 +1006,26 @@ static bool HelperToDiagnoseMismatchedMethodsInGlobalPool(Sema &S, } static void DiagnoseMismatchedSelectors(Sema &S, SourceLocation AtLoc, - ObjCMethodDecl *Method) { - if (S.Diags.isIgnored(diag::warning_multiple_selectors, SourceLocation())) + ObjCMethodDecl *Method, + SourceLocation LParenLoc, + SourceLocation RParenLoc, + bool WarnMultipleSelectors) { + if (!WarnMultipleSelectors || + S.Diags.isIgnored(diag::warning_multiple_selectors, SourceLocation())) return; bool Warned = false; for (Sema::GlobalMethodPool::iterator b = S.MethodPool.begin(), e = S.MethodPool.end(); b != e; b++) { // first, instance methods ObjCMethodList &InstMethList = b->second.first; - if (HelperToDiagnoseMismatchedMethodsInGlobalPool(S, AtLoc, + if (HelperToDiagnoseMismatchedMethodsInGlobalPool(S, AtLoc, LParenLoc, RParenLoc, Method, InstMethList)) Warned = true; // second, class methods ObjCMethodList &ClsMethList = b->second.second; - if (HelperToDiagnoseMismatchedMethodsInGlobalPool(S, AtLoc, - Method, ClsMethList) || - Warned) + if (HelperToDiagnoseMismatchedMethodsInGlobalPool(S, AtLoc, LParenLoc, RParenLoc, + Method, ClsMethList) || Warned) return; } } @@ -1028,7 +1034,8 @@ ExprResult Sema::ParseObjCSelectorExpression(Selector Sel, SourceLocation AtLoc, SourceLocation SelLoc, SourceLocation LParenLoc, - SourceLocation RParenLoc) { + SourceLocation RParenLoc, + bool WarnMultipleSelectors) { ObjCMethodDecl *Method = LookupInstanceMethodInGlobalPool(Sel, SourceRange(LParenLoc, RParenLoc), false, false); if (!Method) @@ -1046,7 +1053,8 @@ ExprResult Sema::ParseObjCSelectorExpression(Selector Sel, } else Diag(SelLoc, diag::warn_undeclared_selector) << Sel; } else - DiagnoseMismatchedSelectors(*this, AtLoc, Method); + DiagnoseMismatchedSelectors(*this, AtLoc, Method, LParenLoc, RParenLoc, + WarnMultipleSelectors); if (Method && Method->getImplementationControl() != ObjCMethodDecl::Optional && |