1// RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.core.BoolAssignment -analyzer-store=region -verify -std=c99 -Dbool=_Bool %s
2// RUN: %clang_cc1 -analyze -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
9void 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
22void 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
37typedef signed char BOOL;
38
39void 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    // FIXME: Currently we are loosing this warning due to a SymbolCast in RHS.
47    BOOL x = y; // no-warning
48    return;
49  }
50  if (y >= 127 && y < 150) {
51    BOOL x = y; // expected-warning{{Assignment of a non-Boolean value}}
52    return;
53  }
54  if (y > 1) {
55    BOOL x = y; // expected-warning {{Assignment of a non-Boolean value}}
56    return;
57  }
58  BOOL x = y; // no-warning
59}
60
61void test_BOOL_assignment(int y) {
62  BOOL x = 0; // no-warning
63  if (y < 0) {
64    x = y; // expected-warning {{Assignment of a non-Boolean value}}
65    return;
66  }
67  if (y > 1) {
68    x = y; // expected-warning {{Assignment of a non-Boolean value}}
69    return;
70  }
71  x = y; // no-warning
72}
73
74
75// Test MacTypes.h's Boolean
76
77typedef unsigned char Boolean;
78
79void test_Boolean_initialization(int y) {
80  Boolean constant = 2; // expected-warning {{Assignment of a non-Boolean value}}
81  if (y < 0) {
82    Boolean x = y; // expected-warning {{Assignment of a non-Boolean value}}
83    return;
84  }
85  if (y > 1) {
86    Boolean x = y; // expected-warning {{Assignment of a non-Boolean value}}
87    return;
88  }
89  Boolean x = y; // no-warning
90}
91
92void test_Boolean_assignment(int y) {
93  Boolean x = 0; // no-warning
94  if (y < 0) {
95    x = y; // expected-warning {{Assignment of a non-Boolean value}}
96    return;
97  }
98  if (y > 1) {
99    x = y; // expected-warning {{Assignment of a non-Boolean value}}
100    return;
101  }
102  x = y; // no-warning
103}
104