[analyzer] New checker for assignment of non-0/1 values to Boolean variables.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150306 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/test/Analysis/bool-assignment.cpp b/test/Analysis/bool-assignment.cpp
new file mode 100644
index 0000000..e573129
--- /dev/null
+++ b/test/Analysis/bool-assignment.cpp
@@ -0,0 +1,87 @@
+// RUN: %clang_cc1 -analyze -analyzer-checker=core,experimental.core.BoolAssignment -analyzer-store=region -verify %s
+
+// Test C++'s bool
+
+void test_cppbool_initialization(int y) {
+  if (y < 0) {
+    bool x = y; // expected-warning {{Assignment of a non-Boolean value}}
+    return;
+  }
+  if (y > 1) {
+    bool x = y; // expected-warning {{Assignment of a non-Boolean value}}
+    return;
+  }
+  bool x = y; // no-warning
+}
+
+void test_cppbool_assignment(int y) {
+  bool x = 0; // no-warning
+  if (y < 0) {
+    x = y; // expected-warning {{Assignment of a non-Boolean value}}
+    return;
+  }
+  if (y > 1) {
+    x = y; // expected-warning {{Assignment of a non-Boolean value}}
+    return;
+  }
+  x = y; // no-warning
+}
+
+// Test Objective-C's BOOL
+
+typedef signed char BOOL;
+
+void test_BOOL_initialization(int y) {
+  if (y < 0) {
+    BOOL x = y; // expected-warning {{Assignment of a non-Boolean value}}
+    return;
+  }
+  if (y > 1) {
+    BOOL x = y; // expected-warning {{Assignment of a non-Boolean value}}
+    return;
+  }
+  BOOL x = y; // no-warning
+}
+
+void test_BOOL_assignment(int y) {
+  BOOL x = 0; // no-warning
+  if (y < 0) {
+    x = y; // expected-warning {{Assignment of a non-Boolean value}}
+    return;
+  }
+  if (y > 1) {
+    x = y; // expected-warning {{Assignment of a non-Boolean value}}
+    return;
+  }
+  x = y; // no-warning
+}
+
+
+// Test MacTypes.h's Boolean
+
+typedef unsigned char Boolean;
+
+void test_Boolean_initialization(int y) {
+  if (y < 0) {
+    Boolean x = y; // expected-warning {{Assignment of a non-Boolean value}}
+    return;
+  }
+  if (y > 1) {
+    Boolean x = y; // expected-warning {{Assignment of a non-Boolean value}}
+    return;
+  }
+  Boolean x = y; // no-warning
+}
+
+void test_Boolean_assignment(int y) {
+  Boolean x = 0; // no-warning
+  if (y < 0) {
+    x = y; // expected-warning {{Assignment of a non-Boolean value}}
+    return;
+  }
+  if (y > 1) {
+    x = y; // expected-warning {{Assignment of a non-Boolean value}}
+    return;
+  }
+  x = y; // no-warning
+}