Home | History | Annotate | Download | only in Analysis
      1 // RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.core.BoolAssignment -analyzer-store=region -verify %s
      2 
      3 // Test C++'s bool
      4 
      5 void test_cppbool_initialization(int y) {
      6   if (y < 0) {
      7     bool x = y; // expected-warning {{Assignment of a non-Boolean value}}
      8     return;
      9   }
     10   if (y > 1) {
     11     bool x = y; // expected-warning {{Assignment of a non-Boolean value}}
     12     return;
     13   }
     14   bool x = y; // no-warning
     15 }
     16 
     17 void test_cppbool_assignment(int y) {
     18   bool x = 0; // no-warning
     19   if (y < 0) {
     20     x = y; // expected-warning {{Assignment of a non-Boolean value}}
     21     return;
     22   }
     23   if (y > 1) {
     24     x = y; // expected-warning {{Assignment of a non-Boolean value}}
     25     return;
     26   }
     27   x = y; // no-warning
     28 }
     29 
     30 // Test Objective-C's BOOL
     31 
     32 typedef signed char BOOL;
     33 
     34 void test_BOOL_initialization(int y) {
     35   if (y < 0) {
     36     BOOL x = y; // expected-warning {{Assignment of a non-Boolean value}}
     37     return;
     38   }
     39   if (y > 1) {
     40     BOOL x = y; // expected-warning {{Assignment of a non-Boolean value}}
     41     return;
     42   }
     43   BOOL x = y; // no-warning
     44 }
     45 
     46 void test_BOOL_assignment(int y) {
     47   BOOL x = 0; // no-warning
     48   if (y < 0) {
     49     x = y; // expected-warning {{Assignment of a non-Boolean value}}
     50     return;
     51   }
     52   if (y > 1) {
     53     x = y; // expected-warning {{Assignment of a non-Boolean value}}
     54     return;
     55   }
     56   x = y; // no-warning
     57 }
     58 
     59 
     60 // Test MacTypes.h's Boolean
     61 
     62 typedef unsigned char Boolean;
     63 
     64 void test_Boolean_initialization(int y) {
     65   if (y < 0) {
     66     Boolean x = y; // expected-warning {{Assignment of a non-Boolean value}}
     67     return;
     68   }
     69   if (y > 1) {
     70     Boolean x = y; // expected-warning {{Assignment of a non-Boolean value}}
     71     return;
     72   }
     73   Boolean x = y; // no-warning
     74 }
     75 
     76 void test_Boolean_assignment(int y) {
     77   Boolean x = 0; // no-warning
     78   if (y < 0) {
     79     x = y; // expected-warning {{Assignment of a non-Boolean value}}
     80     return;
     81   }
     82   if (y > 1) {
     83     x = y; // expected-warning {{Assignment of a non-Boolean value}}
     84     return;
     85   }
     86   x = y; // no-warning
     87 }
     88