]> granicus.if.org Git - clang/commitdiff
objc rewriter: Fixes a rewriting of implicit casting of an integral
authorFariborz Jahanian <fjahanian@apple.com>
Thu, 4 Aug 2011 23:58:03 +0000 (23:58 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Thu, 4 Aug 2011 23:58:03 +0000 (23:58 +0000)
argument to bool. // rdar://9899834

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@136946 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Rewrite/RewriteObjC.cpp
test/Rewriter/rewrite-cast-to-bool.mm [new file with mode: 0644]

index 63e2084686f1fd9ec7e3e523da81da51cefc4f52..3ba7e90dac92125ce22c70b88739092fe392977a 100644 (file)
@@ -3008,7 +3008,11 @@ Stmt *RewriteObjC::SynthMessageExpr(ObjCMessageExpr *Exp,
         type = Context->getObjCIdType();
       // Make sure we convert "type (^)(...)" to "type (*)(...)".
       (void)convertBlockPointerToFunctionPointer(type);
-      userExpr = NoTypeInfoCStyleCastExpr(Context, type, CK_BitCast,
+      const Expr *SubExpr = ICE->IgnoreParenImpCasts();
+      bool integral = SubExpr->getType()->isIntegralType(*Context);
+      userExpr = NoTypeInfoCStyleCastExpr(Context, type, 
+                                          (integral && type->isBooleanType()) 
+                                            ? CK_IntegralToBoolean : CK_BitCast,
                                           userExpr);
     }
     // Make id<P...> cast into an 'id' cast.
diff --git a/test/Rewriter/rewrite-cast-to-bool.mm b/test/Rewriter/rewrite-cast-to-bool.mm
new file mode 100644 (file)
index 0000000..0e9f364
--- /dev/null
@@ -0,0 +1,17 @@
+// RUN: %clang_cc1 -x objective-c++ -Wno-return-type -fblocks -fms-extensions -rewrite-objc %s -o %t-rw.cpp
+// RUN: %clang_cc1 -fsyntax-only -fblocks -Wno-address-of-temporary -D"id=void*" -D"SEL=void*" -D"__declspec(X)=" %t-rw.cpp
+// radar 9899834
+
+void *sel_registerName(const char *);
+
+@interface  NSURLDownload
+-(void)setBool:(bool)Arg;
+@end
+
+@implementation NSURLDownload
+- (void) Meth
+{
+   [self setBool:(signed char)1];
+}
+@end
+