1  #include "analyzer-decls.h"
       2  
       3  typedef unsigned char u8;
       4  typedef unsigned __INT16_TYPE__ u16;
       5  typedef unsigned __INT32_TYPE__ u32;
       6  
       7  struct st1
       8  {
       9    u16 nonzero_offset;
      10    unsigned int f0 : 1;
      11    unsigned int f1 : 1;
      12    unsigned int f2 : 1;
      13    unsigned int f3 : 1;
      14    unsigned int f4 : 1;
      15    unsigned int f5 : 1;
      16    unsigned int f6 : 1;
      17    unsigned int f7 : 1;
      18  };
      19  
      20  void test_1 (void)
      21  {
      22    struct st1 s;
      23    s.f0 = 0;
      24    __analyzer_eval (s.f0 == 0); /* { dg-warning "TRUE" } */
      25    s.f0 = 1;
      26    __analyzer_eval (s.f0 == 1); /* { dg-warning "TRUE" } */
      27  
      28    s.f1 = 0;
      29    __analyzer_eval (s.f1 == 0); /* { dg-warning "TRUE" } */
      30    s.f1 = 1;
      31    __analyzer_eval (s.f1 == 1); /* { dg-warning "TRUE" } */
      32  
      33    /* etc  */
      34  
      35    s.f6 = 0;
      36    __analyzer_eval (s.f6 == 0); /* { dg-warning "TRUE" } */
      37    s.f6 = 1;
      38    __analyzer_eval (s.f6 == 1); /* { dg-warning "TRUE" } */
      39  
      40    s.f7 = 0;
      41    __analyzer_eval (s.f7 == 0); /* { dg-warning "TRUE" } */
      42    s.f7 = 1;
      43    __analyzer_eval (s.f7 == 1); /* { dg-warning "TRUE" } */
      44  };
      45  
      46  void test_2 (_Bool v0, _Bool v1, _Bool v2, _Bool v3,
      47  	     _Bool v4, _Bool v5, _Bool v6, _Bool v7)
      48  {
      49    struct st1 s;
      50    s.f0 = v0;
      51    s.f1 = v1;
      52    s.f2 = v2;
      53    s.f3 = v3;
      54    s.f4 = v4;
      55    s.f5 = v5;
      56    s.f6 = v6;
      57    s.f7 = v7;
      58  
      59    __analyzer_eval (s.f0 == v0); /* { dg-warning "TRUE" } */
      60    __analyzer_eval (s.f1 == v1); /* { dg-warning "TRUE" } */
      61    __analyzer_eval (s.f2 == v2); /* { dg-warning "TRUE" } */
      62    __analyzer_eval (s.f3 == v3); /* { dg-warning "TRUE" } */
      63    __analyzer_eval (s.f4 == v4); /* { dg-warning "TRUE" } */
      64    __analyzer_eval (s.f5 == v5); /* { dg-warning "TRUE" } */
      65    __analyzer_eval (s.f6 == v6); /* { dg-warning "TRUE" } */
      66    __analyzer_eval (s.f7 == v7); /* { dg-warning "TRUE" } */
      67  };
      68  
      69  struct st3
      70  {
      71    unsigned int f01 : 2;
      72    unsigned int f23 : 2;
      73    unsigned int f34 : 2;
      74    unsigned int f56 : 2;
      75  };
      76  
      77  void test_3 (void)
      78  {
      79    struct st3 s;
      80    s.f01 = 0;
      81    __analyzer_eval (s.f01 == 0); /* { dg-warning "TRUE" } */
      82    s.f01 = 1;
      83    __analyzer_eval (s.f01 == 1); /* { dg-warning "TRUE" } */
      84    s.f01 = 2;
      85    __analyzer_eval (s.f01 == 2); /* { dg-warning "TRUE" } */
      86    s.f01 = 3;
      87    __analyzer_eval (s.f01 == 3); /* { dg-warning "TRUE" } */
      88  
      89    /* etc  */
      90  
      91    s.f56 = 0;
      92    __analyzer_eval (s.f56 == 0); /* { dg-warning "TRUE" } */
      93    s.f56 = 1;
      94    __analyzer_eval (s.f56 == 1); /* { dg-warning "TRUE" } */
      95    s.f56 = 2;
      96    __analyzer_eval (s.f56 == 2); /* { dg-warning "TRUE" } */
      97    s.f56 = 3;
      98    __analyzer_eval (s.f56 == 3); /* { dg-warning "TRUE" } */
      99  };
     100  
     101  /* A signed bitfield.  */
     102  
     103  struct st4
     104  {
     105    signed int f012 : 3;
     106    signed int f345 : 3;
     107  };
     108  
     109  void test_4 (void)
     110  {
     111    struct st4 s;
     112    s.f345 = -4;
     113    __analyzer_eval (s.f345 == -4); /* { dg-warning "TRUE" } */
     114    s.f345 = -3;
     115    __analyzer_eval (s.f345 == -3); /* { dg-warning "TRUE" } */
     116    s.f345 = -2;
     117    __analyzer_eval (s.f345 == -2); /* { dg-warning "TRUE" } */
     118    s.f345 = -1;
     119    __analyzer_eval (s.f345 == -1); /* { dg-warning "TRUE" } */
     120    s.f345 = 0;
     121    __analyzer_eval (s.f345 == 0); /* { dg-warning "TRUE" } */
     122    s.f345 = 1;
     123    __analyzer_eval (s.f345 == 1); /* { dg-warning "TRUE" } */
     124    s.f345 = 2;
     125    __analyzer_eval (s.f345 == 2); /* { dg-warning "TRUE" } */
     126    s.f345 = 3;
     127    __analyzer_eval (s.f345 == 3); /* { dg-warning "TRUE" } */
     128  };
     129  
     130  /* A zero bitfield to break up padding.  */
     131  
     132  struct st5
     133  {
     134    unsigned f0 : 5;
     135    unsigned :0;
     136    unsigned f1 : 16;
     137  };
     138  
     139  void test_5 (void)
     140  {
     141    struct st5 s;
     142    s.f1 = 0xcafe;
     143    __analyzer_eval (s.f1 == 0xcafe); /* { dg-warning "TRUE" } */
     144  }