(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
pr35635.c
       1  /* PR 35635 */
       2  /* { dg-do compile } */
       3  /* { dg-options "-Wconversion -Wsign-conversion" } */
       4  
       5  struct unsigned_bit {
       6    unsigned int x:1;
       7  } unsigned_bit;
       8  struct signed_bit {
       9    int x:1;
      10  } signed_bit;
      11  int bar;
      12  int bar2;
      13  
      14  void func1()
      15  {
      16    /* The result of boolean operators fits in unsiged int:1, thus do
      17       not warn.  */
      18    unsigned_bit.x = (bar != 0); /* { dg-bogus "conversion" } */
      19    unsigned_bit.x = (bar == 0); /* { dg-bogus "conversion" } */
      20    unsigned_bit.x = (bar <= 0); /* { dg-bogus "conversion" } */
      21    unsigned_bit.x = (bar >= 0); /* { dg-bogus "conversion" } */
      22    unsigned_bit.x = (bar < 0);  /* { dg-bogus "conversion" } */
      23    unsigned_bit.x = (bar > 0);  /* { dg-bogus "conversion" } */
      24    unsigned_bit.x = !bar;       /* { dg-bogus "conversion" } */
      25    unsigned_bit.x = (bar || bar2); /* { dg-bogus "conversion" } */
      26    unsigned_bit.x = (bar && bar2); /* { dg-bogus "conversion" } */
      27  
      28    /* Both branches of ? fit in the destination, thus do not warn.  */
      29    unsigned_bit.x = bar != 0 ? 1 : 0; /* { dg-bogus "conversion" } */
      30    unsigned_bit.x = bar != 0 ? 1.0 : 0.0;  /* { dg-bogus "conversion" } */
      31  
      32    /* At least one branch of ? does not fit in the destination, thus
      33       warn.  */
      34    unsigned_bit.x = bar != 0 ? 2 : 0; /* { dg-warning "conversion" } */
      35    unsigned_bit.x = bar != 0 ? 0 : -1; /* { dg-warning "-Wsign-conversion" } */
      36  }
      37  
      38  void func2()
      39  {
      40    signed char schar_x;
      41  
      42    /* Both branches of ? fit in the destination, thus do not warn.  */
      43    schar_x = bar != 0 ? 1 : 0; /* { dg-bogus "conversion" } */
      44    schar_x = bar != 0 ? 2.0 : 10; /* { dg-bogus "conversion" } */
      45  
      46    /* At least one branch of ? does not fit in the destination, thus
      47       warn.  */
      48    schar_x = bar != 0 ? 2.1 : 10; /* { dg-warning "conversion" } */
      49    schar_x = bar != 0 ? (signed char) 1024: -1024; /* { dg-warning "conversion" } */
      50  }
      51  
      52  
      53  
      54  void func3()
      55  {
      56    unsigned char uchar_x;
      57  
      58    /* Both branches of ? fit in the destination, thus do not warn.  */
      59    uchar_x = bar != 0 ? 1 : 0;
      60    uchar_x = bar != 0 ? 2.0 : 10;
      61  
      62    /* At least one branch of ? does not fit in the destination, thus
      63       warn.  */
      64    uchar_x = bar != 0 ? 2.1 : 10; /* { dg-warning "conversion" } */
      65    uchar_x = bar != 0  /* { dg-warning "-Wsign-conversion" } */
      66      ? (unsigned char) 1024 
      67      : -1;
      68  }
      69  
      70  void func4()
      71  {
      72    signed_bit.x = -1; /* { dg-bogus "conversion" } */
      73    signed_bit.x = bar != 0 ? -1.0 : 0.0;  /* { dg-bogus "conversion" } */
      74    signed_bit.x = bar != 0 ? -1 : 0; /* { dg-bogus "conversion" } */
      75  
      76    
      77    signed_bit.x = 1;          /* { dg-warning "conversion" } */
      78    signed_bit.x = (bar != 0); /* { dg-warning "conversion" } */
      79    signed_bit.x = (bar == 0); /* { dg-warning "conversion" } */
      80    signed_bit.x = (bar <= 0); /* { dg-warning "conversion" } */
      81    signed_bit.x = (bar >= 0); /* { dg-warning "conversion" } */
      82    signed_bit.x = (bar < 0);  /* { dg-warning "conversion" } */
      83    signed_bit.x = (bar > 0);  /* { dg-warning "conversion" } */
      84    signed_bit.x = !bar;       /* { dg-warning "conversion" } */
      85    signed_bit.x = (bar || bar2); /* { dg-warning "conversion" } */
      86    signed_bit.x = (bar && bar2); /* { dg-warning "conversion" } */
      87    signed_bit.x = bar != 0 ? 1 : 0; /* { dg-warning "conversion" } */
      88    signed_bit.x = bar != 0 ? 2 : 0; /* { dg-warning "conversion" } */
      89  }
      90