diff --git lib/Sema/SemaChecking.cpp lib/Sema/SemaChecking.cpp
index 0e2eb3c..0464c5a 100644
--- lib/Sema/SemaChecking.cpp
+++ lib/Sema/SemaChecking.cpp
@@ -3986,7 +3986,6 @@ void CheckImplicitConversion(Sema &S, Expr *E, QualType T,
         }
       }
     }
-    return; // Other casts to bool are not checked.
   }
 
   // Strip vector types.
@@ -4095,7 +4094,10 @@ void CheckImplicitConversion(Sema &S, Expr *E, QualType T,
         return;
 
       std::string PrettySourceValue = Value.toString(10);
-      std::string PrettyTargetValue = PrettyPrintInRange(Value, TargetRange);
+      std::string PrettyTargetValue = 
+                                Target->isSpecificBuiltinType(BuiltinType::Bool)
+                                  ? "true"
+                                  : PrettyPrintInRange(Value, TargetRange);
 
       S.DiagRuntimeBehavior(E->getExprLoc(), E,
         S.PDiag(diag::warn_impcast_integer_precision_constant)
diff --git test/CXX/expr/expr.unary/expr.unary.op/p6.cpp test/CXX/expr/expr.unary/expr.unary.op/p6.cpp
index ac11940..0cfc607 100644
--- test/CXX/expr/expr.unary/expr.unary.op/p6.cpp
+++ test/CXX/expr/expr.unary/expr.unary.op/p6.cpp
@@ -6,7 +6,7 @@ bool b = !0;
 
 bool b2 = !1.2;
 
-bool b3 = !4;
+bool b3 = !true;
 
 // -- unscoped enumeration
 enum { E, F };
diff --git test/Parser/switch-recovery.cpp test/Parser/switch-recovery.cpp
index 84ac0c8..372a256 100644
--- test/Parser/switch-recovery.cpp
+++ test/Parser/switch-recovery.cpp
@@ -79,7 +79,7 @@ int test7(int i) {
     case false ? 1 : 2:
     true ? 1 : 2:  // expected-error {{expected 'case' keyword before expression}}
     case 10:
-      14 ? 3 : 4;  // expected-warning {{expression result unused}}
+      true ? 3 : 4;  // expected-warning {{expression result unused}}
     default:
       return 1;
   }
diff --git test/Sema/constant-conversion.c test/Sema/constant-conversion.c
index 1376333..1c8cc84 100644
--- test/Sema/constant-conversion.c
+++ test/Sema/constant-conversion.c
@@ -51,9 +51,7 @@ void test5() {
     _Bool b : 1;
   } a;
 
-  // Don't warn about this implicit conversion to bool, or at least
-  // don't warn about it just because it's a bitfield.
-  a.b = 100;
+  a.b = 100; // expected-warning {{implicit conversion from 'int' to '_Bool' changes value from 100 to true}}
 }
 
 void test6() {
diff --git test/SemaCXX/array-bounds.cpp test/SemaCXX/array-bounds.cpp
index 57a9e3d..9117d37 100644
--- test/SemaCXX/array-bounds.cpp
+++ test/SemaCXX/array-bounds.cpp
@@ -87,7 +87,7 @@ void test_templates() {
 }
 
 #define SIZE 10
-#define ARR_IN_MACRO(flag, arr, idx) flag ? arr[idx] : 1
+#define ARR_IN_MACRO(flag, arr, idx) (flag ? arr[idx] : 1)
 
 int test_no_warn_macro_unreachable() {
   int arr[SIZE]; // expected-note {{array 'arr' declared here}}
diff --git test/SemaCXX/blocks.cpp test/SemaCXX/blocks.cpp
index adbff55..15a59af 100644
--- test/SemaCXX/blocks.cpp
+++ test/SemaCXX/blocks.cpp
@@ -64,7 +64,7 @@ namespace radar8382559 {
     if (hasProperty)
       hasProperty = 1;
     if (has)
-      has = 2;
+      has = true;
     return hasProperty = 1;
   }
 }
diff --git test/SemaCXX/bool.cpp test/SemaCXX/bool.cpp
index 2b3ab68..052767c 100644
--- test/SemaCXX/bool.cpp
+++ test/SemaCXX/bool.cpp
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -fsyntax-only -verify %s 
+// RUN: %clang_cc1 -fsyntax-only -verify -Wno-constant-conversion %s 
 
 // Bool literals can be enum values.
 enum {
diff --git test/SemaCXX/conversion.cpp test/SemaCXX/conversion.cpp
index a64b187..ed01c70 100644
--- test/SemaCXX/conversion.cpp
+++ test/SemaCXX/conversion.cpp
@@ -65,7 +65,7 @@ void test3() {
   int c = ((((NULL)))); // expected-warning {{implicit conversion of NULL constant to 'int'}}
   int d;
   d = ((((NULL)))); // expected-warning {{implicit conversion of NULL constant to 'int'}}
-  bool bl = NULL; // FIXME: this should warn but we currently suppress a bunch of conversion-to-bool warnings including this one
+  bool bl = NULL; // expected-warning {{implicit conversion of NULL constant to 'bool'}}
   char ch = NULL; // expected-warning {{implicit conversion of NULL constant to 'char'}}
   unsigned char uch = NULL; // expected-warning {{implicit conversion of NULL constant to 'unsigned char'}}
   short sh = NULL; // expected-warning {{implicit conversion of NULL constant to 'short'}}
diff --git test/SemaCXX/expressions.cpp test/SemaCXX/expressions.cpp
index 355833e..fdba070 100644
--- test/SemaCXX/expressions.cpp
+++ test/SemaCXX/expressions.cpp
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -fsyntax-only -verify %s 
+// RUN: %clang_cc1 -fsyntax-only -verify -Wno-constant-conversion %s 
 
 void choice(int);
 int choice(bool);
diff --git test/SemaCXX/instantiate-blocks.cpp test/SemaCXX/instantiate-blocks.cpp
index bb0f8d8..15b0297 100644
--- test/SemaCXX/instantiate-blocks.cpp
+++ test/SemaCXX/instantiate-blocks.cpp
@@ -18,7 +18,7 @@ template <typename T, typename T1> void noret(T t, T1 r)
     (void) ^{
     if (1)
       return t;
-    else if (2)
+    else if (1)
       return r;  // expected-error {{return type 'double' must match previous return type 'float' when block literal has unspecified explicit return type}}
   };
 }
diff --git test/SemaCXX/warn-unused-comparison.cpp test/SemaCXX/warn-unused-comparison.cpp
index 0153f21..830dac0 100644
--- test/SemaCXX/warn-unused-comparison.cpp
+++ test/SemaCXX/warn-unused-comparison.cpp
@@ -26,7 +26,7 @@ void test() {
   a != b; // expected-warning {{inequality comparison result unused}} \
           // expected-note {{use '|=' to turn this inequality comparison into an or-assignment}}
   A() == b; // expected-warning {{equality comparison result unused}}
-  if (42) x == 7; // expected-warning {{equality comparison result unused}} \
+  if (true) x == 7; // expected-warning {{equality comparison result unused}} \
                   // expected-note {{use '=' to turn this equality comparison into an assignment}}
   else if (42) x == 7; // expected-warning {{equality comparison result unused}} \
                        // expected-note {{use '=' to turn this equality comparison into an assignment}}
