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