blob: 86a581def64e5afd2b50a5dcfe8cd16230a558f5 [file] [log] [blame]
Jordan Roseed6847e2013-04-26 21:42:47 +00001// 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
Ryan Govostesb141b282012-02-11 16:32:09 +00003
Jordan Rose7e6b5642013-04-29 17:23:03 +00004// Test C++'s bool and C's _Bool
Ryan Govostesb141b282012-02-11 16:32:09 +00005
Jordan Roseed6847e2013-04-26 21:42:47 +00006void test_stdbool_initialization(int y) {
Ryan Govostesb141b282012-02-11 16:32:09 +00007 if (y < 0) {
Jordan Rose7e6b5642013-04-29 17:23:03 +00008 bool x = y; // expected-warning {{Assignment of a non-Boolean value}}
Ryan Govostesb141b282012-02-11 16:32:09 +00009 return;
10 }
11 if (y > 1) {
Jordan Rose7e6b5642013-04-29 17:23:03 +000012 bool x = y; // expected-warning {{Assignment of a non-Boolean value}}
Ryan Govostesb141b282012-02-11 16:32:09 +000013 return;
14 }
15 bool x = y; // no-warning
16}
17
Jordan Roseed6847e2013-04-26 21:42:47 +000018void test_stdbool_assignment(int y) {
Ryan Govostesb141b282012-02-11 16:32:09 +000019 bool x = 0; // no-warning
20 if (y < 0) {
Jordan Rose7e6b5642013-04-29 17:23:03 +000021 x = y; // expected-warning {{Assignment of a non-Boolean value}}
Ryan Govostesb141b282012-02-11 16:32:09 +000022 return;
23 }
24 if (y > 1) {
Jordan Rose7e6b5642013-04-29 17:23:03 +000025 x = y; // expected-warning {{Assignment of a non-Boolean value}}
Ryan Govostesb141b282012-02-11 16:32:09 +000026 return;
27 }
28 x = y; // no-warning
29}
30
31// Test Objective-C's BOOL
32
33typedef signed char BOOL;
34
35void test_BOOL_initialization(int y) {
36 if (y < 0) {
37 BOOL x = y; // expected-warning {{Assignment of a non-Boolean value}}
38 return;
39 }
40 if (y > 1) {
41 BOOL x = y; // expected-warning {{Assignment of a non-Boolean value}}
42 return;
43 }
44 BOOL x = y; // no-warning
45}
46
47void test_BOOL_assignment(int y) {
48 BOOL x = 0; // no-warning
49 if (y < 0) {
50 x = y; // expected-warning {{Assignment of a non-Boolean value}}
51 return;
52 }
53 if (y > 1) {
54 x = y; // expected-warning {{Assignment of a non-Boolean value}}
55 return;
56 }
57 x = y; // no-warning
58}
59
60
61// Test MacTypes.h's Boolean
62
63typedef unsigned char Boolean;
64
65void test_Boolean_initialization(int y) {
Ryan Govostesb141b282012-02-11 16:32:09 +000066 if (y < 0) {
67 Boolean x = y; // expected-warning {{Assignment of a non-Boolean value}}
68 return;
69 }
70 if (y > 1) {
71 Boolean x = y; // expected-warning {{Assignment of a non-Boolean value}}
72 return;
73 }
74 Boolean x = y; // no-warning
75}
76
77void test_Boolean_assignment(int y) {
78 Boolean x = 0; // no-warning
79 if (y < 0) {
80 x = y; // expected-warning {{Assignment of a non-Boolean value}}
81 return;
82 }
83 if (y > 1) {
84 x = y; // expected-warning {{Assignment of a non-Boolean value}}
85 return;
86 }
87 x = y; // no-warning
88}