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 9 void 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 22 void 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 37 typedef signed char BOOL; 38 39 void 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 61 void 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 77 typedef unsigned char Boolean; 78 79 void 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 92 void 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