[arcmt] Remove the "it is not safe to remove an unused 'autorelease' message" ARC
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Thu, 17 May 2012 18:16:05 +0000 (18:16 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Thu, 17 May 2012 18:16:05 +0000 (18:16 +0000)
migration error.

This is more trouble that it is worth; autoreleasing a value without holding on it
is a valid use-case, we should not "punish" correct code for the minority of
broken/fragile programs that depend on the behavior of  -autorelease.

rdar://9914061

llvm-svn: 156999

clang/lib/ARCMigrate/TransRetainReleaseDealloc.cpp
clang/test/ARCMT/checking.m

index 11a6553..976c097 100644 (file)
@@ -63,17 +63,6 @@ public:
         break;
       return true;
     case OMF_autorelease:
-      if (isRemovable(E)) {
-        // An unused autorelease is badness. If we remove it the receiver
-        // will likely die immediately while previously it was kept alive
-        // by the autorelease pool. This is bad practice in general, leave it
-        // and emit an error to force the user to restructure his code.
-        Pass.TA.reportError("it is not safe to remove an unused 'autorelease' "
-            "message; its receiver may be destroyed immediately",
-            E->getLocStart(), E->getSourceRange());
-        return true;
-      }
-      // Pass through.
     case OMF_retain:
     case OMF_release:
       if (E->getReceiverKind() == ObjCMessageExpr::Instance)
index cf71611..73eba9f 100644 (file)
@@ -89,8 +89,7 @@ void test1(A *a, BOOL b, struct UnsafeS *unsafeS) {
   [a retain];
   [a retainCount]; // expected-error {{ARC forbids explicit message send of 'retainCount'}}
   [a release];
-  [a autorelease]; // expected-error {{it is not safe to remove an unused 'autorelease' message; its receiver may be destroyed immediately}} \
-                   // expected-error {{ARC forbids explicit message send}}
+  [a autorelease];
 
   CFStringRef cfstr;
   NSString *str = (NSString *)cfstr; // expected-error {{cast of C pointer type 'CFStringRef' (aka 'const struct __CFString *') to Objective-C pointer type 'NSString *' requires a bridged cast}} \