[cfe-commits] r149435 - in /cfe/trunk: lib/ARCMigrate/TransUnbridgedCasts.cpp test/ARCMT/no-canceling-bridge-to-bridge-cast.m

Fariborz Jahanian fjahanian at apple.com
Tue Jan 31 13:58:24 PST 2012


Author: fjahanian
Date: Tue Jan 31 15:58:23 2012
New Revision: 149435

URL: http://llvm.org/viewvc/llvm-project?rev=149435&view=rev
Log:
arc migrator: Do not attempt to migrate to bridge casts which 
cancel out each other. Leave it alone so users can take a look
(unmigrated code forces error diagnostic). // rdar://10521744

Added:
    cfe/trunk/test/ARCMT/no-canceling-bridge-to-bridge-cast.m
Modified:
    cfe/trunk/lib/ARCMigrate/TransUnbridgedCasts.cpp

Modified: cfe/trunk/lib/ARCMigrate/TransUnbridgedCasts.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ARCMigrate/TransUnbridgedCasts.cpp?rev=149435&r1=149434&r2=149435&view=diff
==============================================================================
--- cfe/trunk/lib/ARCMigrate/TransUnbridgedCasts.cpp (original)
+++ cfe/trunk/lib/ARCMigrate/TransUnbridgedCasts.cpp Tue Jan 31 15:58:23 2012
@@ -128,6 +128,21 @@
           if (fname.endswith("Retain") ||
               fname.find("Create") != StringRef::npos ||
               fname.find("Copy") != StringRef::npos) {
+            // Do not migrate to couple of bridge transfer casts which
+            // cancel each other out. Leave it unchanged so error gets user
+            // attention instead.
+            if (FD->getName() == "CFRetain" && 
+                FD->getNumParams() == 1 &&
+                FD->getParent()->isTranslationUnit() &&
+                FD->getLinkage() == ExternalLinkage) {
+              Expr *Arg = callE->getArg(0);
+              if (const CastExpr *ICE = dyn_cast<CastExpr>(Arg)) {
+                const Expr *sub = ICE->getSubExpr();
+                QualType T = sub->getType();
+                if (T->isObjCObjectPointerType())
+                  return;
+              }
+            }
             castToObjCObject(E, /*retained=*/true);
             return;
           }

Added: cfe/trunk/test/ARCMT/no-canceling-bridge-to-bridge-cast.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/no-canceling-bridge-to-bridge-cast.m?rev=149435&view=auto
==============================================================================
--- cfe/trunk/test/ARCMT/no-canceling-bridge-to-bridge-cast.m (added)
+++ cfe/trunk/test/ARCMT/no-canceling-bridge-to-bridge-cast.m Tue Jan 31 15:58:23 2012
@@ -0,0 +1,43 @@
+// RUN: %clang_cc1 -arcmt-check -triple x86_64-apple-darwin10 -fsyntax-only -x objective-c -verify %s 
+// DISABLE: mingw32
+// rdar://10387088
+typedef const void * CFTypeRef;
+
+extern 
+CFTypeRef CFRetain(CFTypeRef cf);
+
+ at interface INTF
+{
+  void *cf_format;
+  id objc_format;
+}
+ at end
+
+ at interface NSString
++ (id)stringWithFormat:(NSString *)format;
+ at end
+
+ at implementation INTF
+- (void) Meth {
+  NSString *result;
+
+  result = (id) CFRetain([NSString stringWithFormat:@"PBXLoopMode"]); // expected-error {{cast of C pointer type 'CFTypeRef' (aka 'const void *') to Objective-C pointer type 'id' requires a bridged cast}} \
+								      // expected-note {{use __bridge to convert directly (no change in ownership)}} \
+								      // expected-note {{use __bridge_transfer to transfer ownership of a +1 'CFTypeRef' (aka 'const void *') into ARC}}
+
+  result = (id) CFRetain((id)((objc_format))); // expected-error {{cast of C pointer type 'CFTypeRef' (aka 'const void *') to Objective-C pointer type 'id' requires a bridged cast}} \
+					       // expected-note {{use __bridge to convert directly (no change in ownership)}} \
+					       // expected-note {{use __bridge_transfer to transfer ownership of a +1 'CFTypeRef' (aka 'const void *') into ARC}}
+
+  result = (id) CFRetain((id)((cf_format))); // expected-error {{cast of C pointer type 'CFTypeRef' (aka 'const void *') to Objective-C pointer type 'id' requires a bridged cast}} \
+					     // expected-note {{use __bridge to convert directly (no change in ownership)}} \
+                                             // expected-note {{use __bridge_transfer to transfer ownership of a +1 'CFTypeRef' (aka 'const void *') into ARC}}
+
+  result = (id) CFRetain((CFTypeRef)((objc_format))); // expected-error {{cast of C pointer type 'CFTypeRef' (aka 'const void *') to Objective-C pointer type 'id' requires a bridged cast}} \
+						      // expected-note {{use __bridge to convert directly (no change in ownership)}} \
+                                                      // expected-note {{use __bridge_transfer to transfer ownership of a +1 'CFTypeRef' (aka 'const void *') into ARC}}
+
+  result = (id) CFRetain(cf_format); // OK
+}
+ at end
+





More information about the cfe-commits mailing list