1 // RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.core.BoolAssignment -analyzer-store=region -verify %s
2
3 // Test C++'s bool
4
test_cppbool_initialization(int y)5 void test_cppbool_initialization(int y) {
6 if (y < 0) {
7 bool x = y; // expected-warning {{Assignment of a non-Boolean value}}
8 return;
9 }
10 if (y > 1) {
11 bool x = y; // expected-warning {{Assignment of a non-Boolean value}}
12 return;
13 }
14 bool x = y; // no-warning
15 }
16
test_cppbool_assignment(int y)17 void test_cppbool_assignment(int y) {
18 bool x = 0; // no-warning
19 if (y < 0) {
20 x = y; // expected-warning {{Assignment of a non-Boolean value}}
21 return;
22 }
23 if (y > 1) {
24 x = y; // expected-warning {{Assignment of a non-Boolean value}}
25 return;
26 }
27 x = y; // no-warning
28 }
29
30 // Test Objective-C's BOOL
31
32 typedef signed char BOOL;
33
test_BOOL_initialization(int y)34 void test_BOOL_initialization(int y) {
35 if (y < 0) {
36 BOOL x = y; // expected-warning {{Assignment of a non-Boolean value}}
37 return;
38 }
39 if (y > 1) {
40 BOOL x = y; // expected-warning {{Assignment of a non-Boolean value}}
41 return;
42 }
43 BOOL x = y; // no-warning
44 }
45
test_BOOL_assignment(int y)46 void test_BOOL_assignment(int y) {
47 BOOL x = 0; // no-warning
48 if (y < 0) {
49 x = y; // expected-warning {{Assignment of a non-Boolean value}}
50 return;
51 }
52 if (y > 1) {
53 x = y; // expected-warning {{Assignment of a non-Boolean value}}
54 return;
55 }
56 x = y; // no-warning
57 }
58
59
60 // Test MacTypes.h's Boolean
61
62 typedef unsigned char Boolean;
63
test_Boolean_initialization(int y)64 void test_Boolean_initialization(int y) {
65 if (y < 0) {
66 Boolean x = y; // expected-warning {{Assignment of a non-Boolean value}}
67 return;
68 }
69 if (y > 1) {
70 Boolean x = y; // expected-warning {{Assignment of a non-Boolean value}}
71 return;
72 }
73 Boolean x = y; // no-warning
74 }
75
test_Boolean_assignment(int y)76 void test_Boolean_assignment(int y) {
77 Boolean x = 0; // no-warning
78 if (y < 0) {
79 x = y; // expected-warning {{Assignment of a non-Boolean value}}
80 return;
81 }
82 if (y > 1) {
83 x = y; // expected-warning {{Assignment of a non-Boolean value}}
84 return;
85 }
86 x = y; // no-warning
87 }
88