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