diff options
| author | Jonathan Roelofs <jonathan@codesourcery.com> | 2015-04-28 18:04:44 +0000 |
|---|---|---|
| committer | Jonathan Roelofs <jonathan@codesourcery.com> | 2015-04-28 18:04:44 +0000 |
| commit | 7441136d2a254ed156e33972bd1e2255530d4dbd (patch) | |
| tree | 29c55bd2c35f70325c0c3bf42e3d24c568e7fc3d | |
| parent | 907233fd99182cf9ca794bec7bc974939dd1c4ed (diff) | |
| download | bcm5719-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.cpp | 12 | ||||
| -rw-r--r-- | clang/test/SemaObjC/multiple-method-names.m | 19 |
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}} +} + |

