Objective-C: Tweak unavailability warning.
authorNico Weber <nicolasweber@gmx.de>
Sat, 27 Dec 2014 07:09:37 +0000 (07:09 +0000)
committerNico Weber <nicolasweber@gmx.de>
Sat, 27 Dec 2014 07:09:37 +0000 (07:09 +0000)
Don't warn when a selector has an unavailable and an available variant,
and the first also has an implementation.

llvm-svn: 224881

clang/lib/Sema/SemaDeclObjC.cpp
clang/test/SemaObjC/attr-deprecated.m

index 90835be..7e3da94 100644 (file)
@@ -2249,7 +2249,7 @@ void Sema::addMethodToGlobalList(ObjCMethodList *List,
     // Propagate the 'defined' bit.
     if (Method->isDefined())
       PrevObjCMethod->setDefined(true);
-    else if (!PrevObjCMethod->isDefined()) {
+    else {
       // Objective-C doesn't allow an @interface for a class after its
       // @implementation. So if Method is not defined and there already is
       // an entry for this type signature, Method has to be for a different
index 416e464..13ba68d 100644 (file)
@@ -263,11 +263,24 @@ const char * func() {
 @end
 
 @interface InterfaceWithSameMethodAsUndeclaredImpl
-- (void)partiallyUnavailableMethod __attribute__((unavailable));  // expected-note{{explicitly marked unavailable here}}
+- (void)partiallyUnavailableMethod __attribute__((unavailable));
 @end
 
 void f(id a) {
-  // FIXME: Warning on this looks incorrect, since `a` could be an
-  // UndeclaredImpl object, where this method isn't inavailable.
-  [a partiallyUnavailableMethod]; // expected-error{{is unavailable}}
+  [a partiallyUnavailableMethod]; // no warning, `a` could be an UndeclaredImpl.
+}
+
+@interface InterfaceWithImplementation
+- (void)anotherPartiallyUnavailableMethod;
+@end
+@implementation InterfaceWithImplementation
+- (void)anotherPartiallyUnavailableMethod {}
+@end
+
+@interface InterfaceWithSameMethodAsInterfaceWithImplementation
+- (void)anotherPartiallyUnavailableMethod __attribute__((unavailable));
+@end
+
+void g(id a) {
+  [a anotherPartiallyUnavailableMethod]; // no warning, `a` could be an InterfaceWithImplementation.
 }