1ed6847ee6944757dfc4911abb29c6fc2d7cf9d79Jordan Rose// RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.core.BoolAssignment -analyzer-store=region -verify -std=c99 -Dbool=_Bool %s
2ed6847ee6944757dfc4911abb29c6fc2d7cf9d79Jordan Rose// RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.core.BoolAssignment -analyzer-store=region -verify -x c++ %s
3b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes
4112344ab7f96cf482bce80530676712c282756d5Jordan Rose// Test C++'s bool and C's _Bool.
5112344ab7f96cf482bce80530676712c282756d5Jordan Rose// FIXME: We stopped warning on these when SValBuilder got smarter about
6112344ab7f96cf482bce80530676712c282756d5Jordan Rose// casts to bool. Arguably, however, these conversions are okay; the result
7112344ab7f96cf482bce80530676712c282756d5Jordan Rose// is always 'true' or 'false'.
8b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes
9ed6847ee6944757dfc4911abb29c6fc2d7cf9d79Jordan Rosevoid test_stdbool_initialization(int y) {
10112344ab7f96cf482bce80530676712c282756d5Jordan Rose  bool constant = 2; // no-warning
11b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes  if (y < 0) {
12112344ab7f96cf482bce80530676712c282756d5Jordan Rose    bool x = y; // no-warning
13b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes    return;
14b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes  }
15b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes  if (y > 1) {
16112344ab7f96cf482bce80530676712c282756d5Jordan Rose    bool x = y; // no-warning
17b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes    return;
18b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes  }
19b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes  bool x = y; // no-warning
20b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes}
21b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes
22ed6847ee6944757dfc4911abb29c6fc2d7cf9d79Jordan Rosevoid test_stdbool_assignment(int y) {
23b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes  bool x = 0; // no-warning
24b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes  if (y < 0) {
25112344ab7f96cf482bce80530676712c282756d5Jordan Rose    x = y; // no-warning
26b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes    return;
27b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes  }
28b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes  if (y > 1) {
29112344ab7f96cf482bce80530676712c282756d5Jordan Rose    x = y; // no-warning
30b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes    return;
31b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes  }
32b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes  x = y; // no-warning
33b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes}
34b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes
35b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes// Test Objective-C's BOOL
36b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes
37b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostestypedef signed char BOOL;
38b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes
39b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostesvoid test_BOOL_initialization(int y) {
40112344ab7f96cf482bce80530676712c282756d5Jordan Rose  BOOL constant = 2; // expected-warning {{Assignment of a non-Boolean value}}
41b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes  if (y < 0) {
42b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes    BOOL x = y; // expected-warning {{Assignment of a non-Boolean value}}
43b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes    return;
44b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes  }
45b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes  if (y > 1) {
46b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes    BOOL x = y; // expected-warning {{Assignment of a non-Boolean value}}
47b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes    return;
48b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes  }
49b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes  BOOL x = y; // no-warning
50b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes}
51b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes
52b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostesvoid test_BOOL_assignment(int y) {
53b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes  BOOL x = 0; // no-warning
54b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes  if (y < 0) {
55b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes    x = y; // expected-warning {{Assignment of a non-Boolean value}}
56b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes    return;
57b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes  }
58b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes  if (y > 1) {
59b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes    x = y; // expected-warning {{Assignment of a non-Boolean value}}
60b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes    return;
61b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes  }
62b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes  x = y; // no-warning
63b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes}
64b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes
65b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes
66b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes// Test MacTypes.h's Boolean
67b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes
68b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostestypedef unsigned char Boolean;
69b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes
70b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostesvoid test_Boolean_initialization(int y) {
71112344ab7f96cf482bce80530676712c282756d5Jordan Rose  Boolean constant = 2; // expected-warning {{Assignment of a non-Boolean value}}
72b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes  if (y < 0) {
73b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes    Boolean x = y; // expected-warning {{Assignment of a non-Boolean value}}
74b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes    return;
75b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes  }
76b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes  if (y > 1) {
77b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes    Boolean x = y; // expected-warning {{Assignment of a non-Boolean value}}
78b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes    return;
79b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes  }
80b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes  Boolean x = y; // no-warning
81b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes}
82b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes
83b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostesvoid test_Boolean_assignment(int y) {
84b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes  Boolean x = 0; // no-warning
85b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes  if (y < 0) {
86b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes    x = y; // expected-warning {{Assignment of a non-Boolean value}}
87b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes    return;
88b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes  }
89b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes  if (y > 1) {
90b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes    x = y; // expected-warning {{Assignment of a non-Boolean value}}
91b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes    return;
92b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes  }
93b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes  x = y; // no-warning
94b141b285d17934a08d1cb0f5f0a5a4d65b2caab2Ryan Govostes}
95