r221562 - [Objective-C Sema]. Issue availability/deprecated warning when

Fariborz Jahanian fjahanian at apple.com
Fri Nov 7 15:51:16 PST 2014


Author: fjahanian
Date: Fri Nov  7 17:51:15 2014
New Revision: 221562

URL: http://llvm.org/viewvc/llvm-project?rev=221562&view=rev
Log:
[Objective-C Sema]. Issue availability/deprecated warning when 
there is a uinque method found when message is sent to receiver 
of 'id' type. // rdar://18848183

Modified:
    cfe/trunk/lib/Sema/SemaExprObjC.cpp
    cfe/trunk/test/ARCMT/checking.m
    cfe/trunk/test/SemaObjC/attr-deprecated.m

Modified: cfe/trunk/lib/Sema/SemaExprObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprObjC.cpp?rev=221562&r1=221561&r2=221562&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExprObjC.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExprObjC.cpp Fri Nov  7 17:51:15 2014
@@ -2448,10 +2448,14 @@ ExprResult Sema::BuildInstanceMessage(Ex
         Method = LookupFactoryMethodInGlobalPool(Sel, 
                                                  SourceRange(LBracLoc,RBracLoc),
                                                  receiverIsId);
-      if (Method)
+      if (Method) {
         if (ObjCMethodDecl *BestMethod =
               SelectBestMethod(Sel, ArgsIn, Method->isInstanceMethod()))
           Method = BestMethod;
+          SmallVector<ObjCMethodDecl*, 4> Methods;
+          if (!CollectMultipleMethodsInGlobalPool(Sel, Methods, Method->isInstanceMethod()))
+            DiagnoseUseOfDecl(Method, SelLoc);
+      }
     } else if (ReceiverType->isObjCClassType() ||
                ReceiverType->isObjCQualifiedClassType()) {
       // Handle messages to Class.

Modified: cfe/trunk/test/ARCMT/checking.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/checking.m?rev=221562&r1=221561&r2=221562&view=diff
==============================================================================
--- cfe/trunk/test/ARCMT/checking.m (original)
+++ cfe/trunk/test/ARCMT/checking.m Fri Nov  7 17:51:15 2014
@@ -14,9 +14,9 @@ typedef int BOOL;
 typedef unsigned NSUInteger;
 
 @protocol NSObject
-- (id)retain NS_AUTOMATED_REFCOUNT_UNAVAILABLE;
+- (id)retain NS_AUTOMATED_REFCOUNT_UNAVAILABLE; // expected-note {{'retain' has been explicitly marked unavailable here}}
 - (NSUInteger)retainCount NS_AUTOMATED_REFCOUNT_UNAVAILABLE;
-- (oneway void)release NS_AUTOMATED_REFCOUNT_UNAVAILABLE;
+- (oneway void)release NS_AUTOMATED_REFCOUNT_UNAVAILABLE; // expected-note 4 {{'release' has been explicitly marked unavailable here}}
 - (id)autorelease NS_AUTOMATED_REFCOUNT_UNAVAILABLE;
 @end
 
@@ -74,16 +74,20 @@ id global_foo;
 
 void test1(A *a, BOOL b, struct UnsafeS *unsafeS) {
   [[a delegate] release]; // expected-error {{it is not safe to remove 'retain' message on the result of a 'delegate' message; the object that was passed to 'setDelegate:' may not be properly retained}} \
+			  // expected-error {{'release' is unavailable: not available in automatic reference counting mode}} \
                           // expected-error {{ARC forbids explicit message send}}
   [a.delegate release]; // expected-error {{it is not safe to remove 'retain' message on the result of a 'delegate' message; the object that was passed to 'setDelegate:' may not be properly retained}} \
+			// expected-error {{'release' is unavailable: not available in automatic reference counting mode}} \
                         // expected-error {{ARC forbids explicit message send}}
   [unsafeS->unsafeObj retain]; // expected-error {{it is not safe to remove 'retain' message on an __unsafe_unretained type}} \
                                // expected-error {{ARC forbids explicit message send}} \
                                // expected-error {{'retain' is unavailable}}
   id foo = [unsafeS->unsafeObj retain]; // no warning.
   [global_foo retain]; // expected-error {{it is not safe to remove 'retain' message on a global variable}} \
+		       // expected-error {{'retain' is unavailable: not available in automatic reference counting mode}} \
                        // expected-error {{ARC forbids explicit message send}}
   [global_foo release]; // expected-error {{it is not safe to remove 'release' message on a global variable}} \
+			// expected-error {{'release' is unavailable: not available in automatic reference counting mode}} \
                         // expected-error {{ARC forbids explicit message send}}
   [a dealloc];
   [a retain];
@@ -304,7 +308,8 @@ void rdar9491791(int p) {
 
 // rdar://9504750
 void rdar9504750(id p) {
-  RELEASE_MACRO(p); // expected-error {{ARC forbids explicit message send of 'release'}}
+  RELEASE_MACRO(p); // expected-error {{ARC forbids explicit message send of 'release'}} \
+		    // expected-error {{'release' is unavailable: not available in automatic reference counting mode}}
 }
 
 // rdar://8939557

Modified: cfe/trunk/test/SemaObjC/attr-deprecated.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/attr-deprecated.m?rev=221562&r1=221561&r2=221562&view=diff
==============================================================================
--- cfe/trunk/test/SemaObjC/attr-deprecated.m (original)
+++ cfe/trunk/test/SemaObjC/attr-deprecated.m Fri Nov  7 17:51:15 2014
@@ -5,7 +5,7 @@
   int X __attribute__((deprecated)); // expected-note 2 {{'X' has been explicitly marked deprecated here}}
 }
 + (void)F __attribute__((deprecated)); // expected-note 2 {{'F' has been explicitly marked deprecated here}}
-- (void)f __attribute__((deprecated)); // expected-note 4 {{'f' has been explicitly marked deprecated here}}
+- (void)f __attribute__((deprecated)); // expected-note 5 {{'f' has been explicitly marked deprecated here}}
 @end
 
 @implementation A
@@ -54,7 +54,7 @@ void t1(A *a)
 
 void t2(id a)
 {
-  [a f];
+  [a f]; // expected-warning {{'f' is deprecated}}
 }
 
 void t3(A<P>* a)
@@ -228,3 +228,13 @@ expected-note {{property declared here}}
 
 @end
 
+// rdar://18848183
+ at interface NSString
+- (const char *)cString __attribute__((availability(macosx,introduced=10.0 ,deprecated=10.4,message="" ))); // expected-note {{'cString' has been explicitly marked deprecated here}}
+ at end
+
+id PID = 0;
+const char * func() {
+  return [PID cString]; // expected-warning {{'cString' is deprecated: first deprecated in OS X 10.4}}
+}
+





More information about the cfe-commits mailing list