1*67e74705SXin Li // RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.core.BoolAssignment -analyzer-store=region -verify -std=c99 -Dbool=_Bool %s 2*67e74705SXin Li // RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.core.BoolAssignment -analyzer-store=region -verify -x c++ %s 3*67e74705SXin Li 4*67e74705SXin Li // Test C++'s bool and C's _Bool. 5*67e74705SXin Li // FIXME: We stopped warning on these when SValBuilder got smarter about 6*67e74705SXin Li // casts to bool. Arguably, however, these conversions are okay; the result 7*67e74705SXin Li // is always 'true' or 'false'. 8*67e74705SXin Li test_stdbool_initialization(int y)9*67e74705SXin Livoid test_stdbool_initialization(int y) { 10*67e74705SXin Li bool constant = 2; // no-warning 11*67e74705SXin Li if (y < 0) { 12*67e74705SXin Li bool x = y; // no-warning 13*67e74705SXin Li return; 14*67e74705SXin Li } 15*67e74705SXin Li if (y > 1) { 16*67e74705SXin Li bool x = y; // no-warning 17*67e74705SXin Li return; 18*67e74705SXin Li } 19*67e74705SXin Li bool x = y; // no-warning 20*67e74705SXin Li } 21*67e74705SXin Li test_stdbool_assignment(int y)22*67e74705SXin Livoid test_stdbool_assignment(int y) { 23*67e74705SXin Li bool x = 0; // no-warning 24*67e74705SXin Li if (y < 0) { 25*67e74705SXin Li x = y; // no-warning 26*67e74705SXin Li return; 27*67e74705SXin Li } 28*67e74705SXin Li if (y > 1) { 29*67e74705SXin Li x = y; // no-warning 30*67e74705SXin Li return; 31*67e74705SXin Li } 32*67e74705SXin Li x = y; // no-warning 33*67e74705SXin Li } 34*67e74705SXin Li 35*67e74705SXin Li // Test Objective-C's BOOL 36*67e74705SXin Li 37*67e74705SXin Li typedef signed char BOOL; 38*67e74705SXin Li test_BOOL_initialization(int y)39*67e74705SXin Livoid test_BOOL_initialization(int y) { 40*67e74705SXin Li BOOL constant = 2; // expected-warning {{Assignment of a non-Boolean value}} 41*67e74705SXin Li if (y < 0) { 42*67e74705SXin Li BOOL x = y; // expected-warning {{Assignment of a non-Boolean value}} 43*67e74705SXin Li return; 44*67e74705SXin Li } 45*67e74705SXin Li if (y > 200 && y < 250) { 46*67e74705SXin Li // FIXME: Currently we are loosing this warning due to a SymbolCast in RHS. 47*67e74705SXin Li BOOL x = y; // no-warning 48*67e74705SXin Li return; 49*67e74705SXin Li } 50*67e74705SXin Li if (y >= 127 && y < 150) { 51*67e74705SXin Li BOOL x = y; // expected-warning{{Assignment of a non-Boolean value}} 52*67e74705SXin Li return; 53*67e74705SXin Li } 54*67e74705SXin Li if (y > 1) { 55*67e74705SXin Li BOOL x = y; // expected-warning {{Assignment of a non-Boolean value}} 56*67e74705SXin Li return; 57*67e74705SXin Li } 58*67e74705SXin Li BOOL x = y; // no-warning 59*67e74705SXin Li } 60*67e74705SXin Li test_BOOL_assignment(int y)61*67e74705SXin Livoid test_BOOL_assignment(int y) { 62*67e74705SXin Li BOOL x = 0; // no-warning 63*67e74705SXin Li if (y < 0) { 64*67e74705SXin Li x = y; // expected-warning {{Assignment of a non-Boolean value}} 65*67e74705SXin Li return; 66*67e74705SXin Li } 67*67e74705SXin Li if (y > 1) { 68*67e74705SXin Li x = y; // expected-warning {{Assignment of a non-Boolean value}} 69*67e74705SXin Li return; 70*67e74705SXin Li } 71*67e74705SXin Li x = y; // no-warning 72*67e74705SXin Li } 73*67e74705SXin Li 74*67e74705SXin Li 75*67e74705SXin Li // Test MacTypes.h's Boolean 76*67e74705SXin Li 77*67e74705SXin Li typedef unsigned char Boolean; 78*67e74705SXin Li test_Boolean_initialization(int y)79*67e74705SXin Livoid test_Boolean_initialization(int y) { 80*67e74705SXin Li Boolean constant = 2; // expected-warning {{Assignment of a non-Boolean value}} 81*67e74705SXin Li if (y < 0) { 82*67e74705SXin Li Boolean x = y; // expected-warning {{Assignment of a non-Boolean value}} 83*67e74705SXin Li return; 84*67e74705SXin Li } 85*67e74705SXin Li if (y > 1) { 86*67e74705SXin Li Boolean x = y; // expected-warning {{Assignment of a non-Boolean value}} 87*67e74705SXin Li return; 88*67e74705SXin Li } 89*67e74705SXin Li Boolean x = y; // no-warning 90*67e74705SXin Li } 91*67e74705SXin Li test_Boolean_assignment(int y)92*67e74705SXin Livoid test_Boolean_assignment(int y) { 93*67e74705SXin Li Boolean x = 0; // no-warning 94*67e74705SXin Li if (y < 0) { 95*67e74705SXin Li x = y; // expected-warning {{Assignment of a non-Boolean value}} 96*67e74705SXin Li return; 97*67e74705SXin Li } 98*67e74705SXin Li if (y > 1) { 99*67e74705SXin Li x = y; // expected-warning {{Assignment of a non-Boolean value}} 100*67e74705SXin Li return; 101*67e74705SXin Li } 102*67e74705SXin Li x = y; // no-warning 103*67e74705SXin Li } 104