bool-assignment.c revision 7e6b564d59df6c0594bc3a577f33536850290dec
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
6void test_stdbool_initialization(int y) {
7  if (y < 0) {
8    bool x = y; // expected-warning {{Assignment of a non-Boolean value}}
9    return;
10  }
11  if (y > 1) {
12    bool x = y; // expected-warning {{Assignment of a non-Boolean value}}
13    return;
14  }
15  bool x = y; // no-warning
16}
17
18void test_stdbool_assignment(int y) {
19  bool x = 0; // no-warning
20  if (y < 0) {
21    x = y; // expected-warning {{Assignment of a non-Boolean value}}
22    return;
23  }
24  if (y > 1) {
25    x = y; // expected-warning {{Assignment of a non-Boolean value}}
26    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) {
66  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}
89