diff --git a/lib/Rewrite/RewriteModernObjC.cpp b/lib/Rewrite/RewriteModernObjC.cpp index 83337df29d..acb0ac73f2 100644 --- a/lib/Rewrite/RewriteModernObjC.cpp +++ b/lib/Rewrite/RewriteModernObjC.cpp @@ -317,6 +317,7 @@ namespace { Stmt *RewriteAtSelector(ObjCSelectorExpr *Exp); Stmt *RewriteMessageExpr(ObjCMessageExpr *Exp); Stmt *RewriteObjCStringLiteral(ObjCStringLiteral *Exp); + Stmt *RewriteObjCBoolLiteralExpr(ObjCBoolLiteralExpr *Exp); Stmt *RewriteObjCProtocolExpr(ObjCProtocolExpr *Exp); Stmt *RewriteObjCTryStmt(ObjCAtTryStmt *S); Stmt *RewriteObjCSynchronizedStmt(ObjCAtSynchronizedStmt *S); @@ -2450,6 +2451,21 @@ Stmt *RewriteModernObjC::RewriteObjCStringLiteral(ObjCStringLiteral *Exp) { return cast; } +Stmt *RewriteModernObjC::RewriteObjCBoolLiteralExpr(ObjCBoolLiteralExpr *Exp) { + unsigned IntSize = + static_cast(Context->getTypeSize(Context->IntTy)); + + Expr *FlagExp = IntegerLiteral::Create(*Context, + llvm::APInt(IntSize, Exp->getValue()), + Context->IntTy, Exp->getLocation()); + CastExpr *cast = NoTypeInfoCStyleCastExpr(Context, Context->ObjCBuiltinBoolTy, + CK_BitCast, FlagExp); + ParenExpr *PE = new (Context) ParenExpr(Exp->getLocation(), Exp->getExprLoc(), + cast); + ReplaceStmt(Exp, PE); + return PE; +} + // struct objc_super { struct objc_object *receiver; struct objc_class *super; }; QualType RewriteModernObjC::getSuperStructType() { if (!SuperStructDecl) { @@ -4741,6 +4757,9 @@ Stmt *RewriteModernObjC::RewriteFunctionBodyOrGlobalInitializer(Stmt *S) { if (ObjCStringLiteral *AtString = dyn_cast(S)) return RewriteObjCStringLiteral(AtString); + + if (ObjCBoolLiteralExpr *BoolLitExpr = dyn_cast(S)) + return RewriteObjCBoolLiteralExpr(BoolLitExpr); if (ObjCMessageExpr *MessExpr = dyn_cast(S)) { #if 0 diff --git a/test/Rewriter/objc-bool-literal-check-modern.mm b/test/Rewriter/objc-bool-literal-check-modern.mm new file mode 100644 index 0000000000..b28e594d72 --- /dev/null +++ b/test/Rewriter/objc-bool-literal-check-modern.mm @@ -0,0 +1,29 @@ +// RUN: %clang_cc1 -E %s -o %t.mm +// RUN: %clang_cc1 -x objective-c++ -fblocks -fms-extensions -rewrite-objc %t.mm -o - | FileCheck %s +// rdar://11124775 + +typedef signed char BOOL; + +BOOL yes() { + return __objc_yes; +} + +BOOL no() { + return __objc_no; +} + +BOOL which (int flag) { + return flag ? yes() : no(); +} + +int main() { + which (__objc_yes); + which (__objc_no); + return __objc_yes; +} + +// CHECK: return ((signed char)1); +// CHECK: return ((signed char)0); +// CHECK: which (((signed char)1)); +// CHECK: which (((signed char)0)); +// CHECK: return ((signed char)1); diff --git a/test/Rewriter/objc-bool-literal-modern.mm b/test/Rewriter/objc-bool-literal-modern.mm new file mode 100644 index 0000000000..6bbbb449c9 --- /dev/null +++ b/test/Rewriter/objc-bool-literal-modern.mm @@ -0,0 +1,23 @@ +// RUN: %clang_cc1 -x objective-c++ -fms-extensions -rewrite-objc %s -o %t-rw.cpp +// RUN: %clang_cc1 -fsyntax-only -D"__declspec(X)=" %t-rw.cpp +// rdar://11124775 + +typedef signed char BOOL; + +BOOL yes() { + return __objc_yes; +} + +BOOL no() { + return __objc_no; +} + +BOOL which (int flag) { + return flag ? yes() : no(); +} + +int main() { + which (__objc_yes); + which (__objc_no); + return __objc_yes; +}