1 | // RUN: %clang_analyze_cc1 -analyzer-checker=core,alpha.core.BoolAssignment -analyzer-store=region -verify -std=c99 -Dbool=_Bool %s |
2 | // RUN: %clang_analyze_cc1 -analyzer-checker=core,alpha.core.BoolAssignment -analyzer-store=region -verify -x c++ %s |
3 | |
4 | // Test C++'s bool and C's _Bool. |
5 | // FIXME: We stopped warning on these when SValBuilder got smarter about |
6 | // casts to bool. Arguably, however, these conversions are okay; the result |
7 | // is always 'true' or 'false'. |
8 | |
9 | void test_stdbool_initialization(int y) { |
10 | bool constant = 2; // no-warning |
11 | if (y < 0) { |
12 | bool x = y; // no-warning |
13 | return; |
14 | } |
15 | if (y > 1) { |
16 | bool x = y; // no-warning |
17 | return; |
18 | } |
19 | bool x = y; // no-warning |
20 | } |
21 | |
22 | void test_stdbool_assignment(int y) { |
23 | bool x = 0; // no-warning |
24 | if (y < 0) { |
25 | x = y; // no-warning |
26 | return; |
27 | } |
28 | if (y > 1) { |
29 | x = y; // no-warning |
30 | return; |
31 | } |
32 | x = y; // no-warning |
33 | } |
34 | |
35 | // Test Objective-C's BOOL |
36 | |
37 | typedef signed char BOOL; |
38 | |
39 | void test_BOOL_initialization(int y) { |
40 | BOOL constant = 2; // expected-warning {{Assignment of a non-Boolean value}} |
41 | if (y < 0) { |
42 | BOOL x = y; // expected-warning {{Assignment of a non-Boolean value}} |
43 | return; |
44 | } |
45 | if (y > 200 && y < 250) { |
46 | #ifdef ANALYZER_CM_Z3 |
47 | BOOL x = y; // expected-warning {{Assignment of a non-Boolean value}} |
48 | #else |
49 | BOOL x = y; // no-warning |
50 | #endif |
51 | return; |
52 | } |
53 | if (y >= 127 && y < 150) { |
54 | BOOL x = y; // expected-warning{{Assignment of a non-Boolean value}} |
55 | return; |
56 | } |
57 | if (y > 1) { |
58 | BOOL x = y; // expected-warning {{Assignment of a non-Boolean value}} |
59 | return; |
60 | } |
61 | BOOL x = y; // no-warning |
62 | } |
63 | |
64 | void test_BOOL_assignment(int y) { |
65 | BOOL x = 0; // no-warning |
66 | if (y < 0) { |
67 | x = y; // expected-warning {{Assignment of a non-Boolean value}} |
68 | return; |
69 | } |
70 | if (y > 1) { |
71 | x = y; // expected-warning {{Assignment of a non-Boolean value}} |
72 | return; |
73 | } |
74 | x = y; // no-warning |
75 | } |
76 | |
77 | |
78 | // Test MacTypes.h's Boolean |
79 | |
80 | typedef unsigned char Boolean; |
81 | |
82 | void test_Boolean_initialization(int y) { |
83 | Boolean constant = 2; // expected-warning {{Assignment of a non-Boolean value}} |
84 | if (y < 0) { |
85 | Boolean x = y; // expected-warning {{Assignment of a non-Boolean value}} |
86 | return; |
87 | } |
88 | if (y > 1) { |
89 | Boolean x = y; // expected-warning {{Assignment of a non-Boolean value}} |
90 | return; |
91 | } |
92 | Boolean x = y; // no-warning |
93 | } |
94 | |
95 | void test_Boolean_assignment(int y) { |
96 | Boolean x = 0; // no-warning |
97 | if (y < 0) { |
98 | x = y; // expected-warning {{Assignment of a non-Boolean value}} |
99 | return; |
100 | } |
101 | if (y > 1) { |
102 | x = y; // expected-warning {{Assignment of a non-Boolean value}} |
103 | return; |
104 | } |
105 | x = y; // no-warning |
106 | } |
107 | |