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