summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonathan Roelofs <jonathan@codesourcery.com>2015-04-28 18:04:44 +0000
committerJonathan Roelofs <jonathan@codesourcery.com>2015-04-28 18:04:44 +0000
commit7441136d2a254ed156e33972bd1e2255530d4dbd (patch)
tree29c55bd2c35f70325c0c3bf42e3d24c568e7fc3d
parent907233fd99182cf9ca794bec7bc974939dd1c4ed (diff)
downloadbcm5719-llvm-7441136d2a254ed156e33972bd1e2255530d4dbd.tar.gz
bcm5719-llvm-7441136d2a254ed156e33972bd1e2255530d4dbd.zip
Fix PR22047: ObjC: Method unavailability attribute doesn't work with overloaded methods
http://reviews.llvm.org/D9261 llvm-svn: 236006
-rw-r--r--clang/lib/Sema/SemaDeclObjC.cpp12
-rw-r--r--clang/test/SemaObjC/multiple-method-names.m19
2 files changed, 25 insertions, 6 deletions
diff --git a/clang/lib/Sema/SemaDeclObjC.cpp b/clang/lib/Sema/SemaDeclObjC.cpp
index 37ef9baf112..38318791fd7 100644
--- a/clang/lib/Sema/SemaDeclObjC.cpp
+++ b/clang/lib/Sema/SemaDeclObjC.cpp
@@ -2385,10 +2385,10 @@ bool Sema::AreMultipleMethodsInGlobalPool(Selector Sel, ObjCMethodDecl *BestMeth
// Diagnose finding more than one method in global pool
SmallVector<ObjCMethodDecl *, 4> Methods;
Methods.push_back(BestMethod);
- for (ObjCMethodList *M = &MethList; M; M = M->getNext())
- if (M->getMethod() && !M->getMethod()->isHidden() &&
- M->getMethod() != BestMethod)
- Methods.push_back(M->getMethod());
+ for (ObjCMethodList *ML = &MethList; ML; ML = ML->getNext())
+ if (ObjCMethodDecl *M = ML->getMethod())
+ if (!M->isHidden() && M != BestMethod && !M->hasAttr<UnavailableAttr>())
+ Methods.push_back(M);
if (Methods.size() > 1)
DiagnoseMultipleMethodInGlobalPool(Methods, Sel, R, receiverIdOrClass);
@@ -2420,7 +2420,7 @@ void Sema::DiagnoseMultipleMethodInGlobalPool(SmallVectorImpl<ObjCMethodDecl*> &
bool receiverIdOrClass) {
// We found multiple methods, so we may have to complain.
bool issueDiagnostic = false, issueError = false;
-
+
// We support a warning which complains about *any* difference in
// method signature.
bool strictSelectorMatch =
@@ -2434,7 +2434,7 @@ void Sema::DiagnoseMultipleMethodInGlobalPool(SmallVectorImpl<ObjCMethodDecl*> &
}
}
}
-
+
// If we didn't see any strict differences, we won't see any loose
// differences. In ARC, however, we also need to check for loose
// mismatches, because most of them are errors.
diff --git a/clang/test/SemaObjC/multiple-method-names.m b/clang/test/SemaObjC/multiple-method-names.m
new file mode 100644
index 00000000000..9fd83b208ab
--- /dev/null
+++ b/clang/test/SemaObjC/multiple-method-names.m
@@ -0,0 +1,19 @@
+// RUN: %clang_cc1 -Wobjc-multiple-method-names -x objective-c %s -verify
+// PR22047
+
+@interface Face0
+- (void)foo:(float)i; // expected-note {{using}}
+@end
+
+@interface Face1
+- (void)foo:(int)i __attribute__((unavailable));
+@end
+
+@interface Face2
+- (void)foo:(char)i; // expected-note {{also found}}
+@end
+
+void f(id i) {
+ [i foo:4.0f]; // expected-warning {{multiple methods named 'foo:' found}}
+}
+
OpenPOWER on IntegriCloud