(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
c99-bool-1.c
       1  /* Test for _Bool and <stdbool.h> in C99.  */
       2  /* Origin: Joseph Myers <jsm28@cam.ac.uk> */
       3  /* { dg-do run } */
       4  /* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
       5  
       6  /* _Bool must be a builtin type.  */
       7  
       8  _Bool foo;
       9  
      10  #include <stdbool.h>
      11  
      12  /* Three macros must be integer constant expressions suitable for use
      13     in #if.
      14  */
      15  
      16  #if !defined(true) || (true != 1)
      17  #error "bad stdbool true" /* { dg-bogus "#error" "bad stdbool.h" } */
      18  #endif
      19  
      20  #if !defined(false) || (false != 0)
      21  #error "bad stdbool false" /* { dg-bogus "#error" "bad stdbool.h" } */
      22  #endif
      23  
      24  #if !defined(__bool_true_false_are_defined) || (__bool_true_false_are_defined != 1)
      25  #error "bad stdbool __bool_true_false_are_defined" /* { dg-bogus "#error" "bad stdbool.h" } */
      26  #endif
      27  
      28  int a = true;
      29  int b = false;
      30  int c = __bool_true_false_are_defined;
      31  
      32  struct foo
      33  {
      34    _Bool a : 1;
      35  } sf;
      36  
      37  #define str(x) xstr(x)
      38  #define xstr(x) #x
      39  
      40  
      41  extern void abort (void);
      42  extern void exit (int);
      43  extern int strcmp (const char *, const char *);
      44  
      45  int
      46  main (void)
      47  {
      48    /* The macro `bool' must expand to _Bool.  */
      49    const char *t = str (bool);
      50    _Bool u, v;
      51    if (strcmp (t, "_Bool"))
      52      abort ();
      53    if (a != 1 || b != 0 || c != 1)
      54      abort ();
      55    /* Casts to _Bool have a specified behavior.  */
      56    if ((int)(_Bool)2 != 1)
      57      abort ();
      58    if ((int)(_Bool)0.2 != 1)
      59      abort ();
      60    /* Pointers may be assigned to _Bool.  */
      61    if ((u = t) != 1)
      62      abort ();
      63    /* _Bool may be used to subscript arrays.  */
      64    u = 0;
      65    if (t[u] != '_')
      66      abort ();
      67    if (u[t] != '_')
      68      abort ();
      69    u = 1;
      70    if (t[u] != 'B')
      71      abort ();
      72    if (u[t] != 'B')
      73      abort ();
      74    /* Test increment and decrement operators.  */
      75    u = 0;
      76    if (u++ != 0)
      77      abort ();
      78    if (u != 1)
      79      abort ();
      80    if (u++ != 1)
      81      abort ();
      82    if (u != 1)
      83      abort ();
      84    u = 0;
      85    if (++u != 1)
      86      abort ();
      87    if (u != 1)
      88      abort ();
      89    if (++u != 1)
      90      abort ();
      91    if (u != 1)
      92      abort ();
      93    u = 0;
      94    if (u-- != 0)
      95      abort ();
      96    if (u != 1)
      97      abort ();
      98    if (u-- != 1)
      99      abort ();
     100    if (u != 0)
     101      abort ();
     102    u = 0;
     103    if (--u != 1)
     104      abort ();
     105    if (u != 1)
     106      abort ();
     107    if (--u != 0)
     108      abort ();
     109    if (u != 0)
     110      abort ();
     111    /* Test unary + - ~ !.  */
     112    u = 0;
     113    if (+u != 0)
     114      abort ();
     115    if (-u != 0)
     116      abort ();
     117    u = 1;
     118    if (+u != 1)
     119      abort ();
     120    if (-u != -1)
     121      abort ();
     122    u = 2;
     123    if (+u != 1)
     124      abort ();
     125    if (-u != -1)
     126      abort ();
     127    u = 0;
     128    if (~u != ~(int)0)
     129      abort ();
     130    u = 1;
     131    if (~u != ~(int)1)
     132      abort ();
     133    u = 0;
     134    if (!u != 1)
     135      abort ();
     136    u = 1;
     137    if (!u != 0)
     138      abort ();
     139    /* Test arithmetic * / % + - (which all apply promotions).  */
     140    u = 0;
     141    if (u + 2 != 2)
     142      abort ();
     143    u = 1;
     144    if (u * 4 != 4)
     145      abort ();
     146    if (u % 3 != 1)
     147      abort ();
     148    if (u / 1 != 1)
     149      abort ();
     150    if (4 / u != 4)
     151      abort ();
     152    if (u - 7 != -6)
     153      abort ();
     154    /* Test bitwise shift << >>.  */
     155    u = 1;
     156    if (u << 1 != 2)
     157      abort ();
     158    if (u >> 1 != 0)
     159      abort ();
     160    /* Test relational and equality operators < > <= >= == !=.  */
     161    u = 0;
     162    v = 0;
     163    if (u < v || u > v || !(u <= v) || !(u >= v) || !(u == v) || u != v)
     164      abort ();
     165    u = 0;
     166    v = 1;
     167    if (!(u < v) || u > v || !(u <= v) || u >= v || u == v || !(u != v))
     168      abort ();
     169    /* Test bitwise operators & ^ |.  */
     170    u = 1;
     171    if ((u | 2) != 3)
     172      abort ();
     173    if ((u ^ 3) != 2)
     174      abort ();
     175    if ((u & 1) != 1)
     176      abort ();
     177    if ((u & 0) != 0)
     178      abort ();
     179    /* Test logical && ||.  */
     180    u = 0;
     181    v = 1;
     182    if (!(u || v))
     183      abort ();
     184    if (!(v || u))
     185      abort ();
     186    if (u && v)
     187      abort ();
     188    if (v && u)
     189      abort ();
     190    u = 1;
     191    v = 1;
     192    if (!(u && v))
     193      abort ();
     194    /* Test conditional ? :.  */
     195    u = 0;
     196    if ((u ? 4 : 7) != 7)
     197      abort ();
     198    u = 1;
     199    v = 0;
     200    if ((1 ? u : v) != 1)
     201      abort ();
     202    if ((1 ? 4 : u) != 4)
     203      abort ();
     204    /* Test assignment operators = *= /= %= += -= <<= >>= &= ^= |=.  */
     205    if ((u = 2) != 1)
     206      abort ();
     207    if (u != 1)
     208      abort ();
     209    if ((u *= -1) != 1)
     210      abort ();
     211    if (u != 1)
     212      abort ();
     213    if ((u /= 2) != 0)
     214      abort ();
     215    if ((u += 3) != 1)
     216      abort ();
     217    if ((u -= 1) != 0)
     218      abort ();
     219    u = 1;
     220    if ((u <<= 4) != 1)
     221      abort ();
     222    if ((u >>= 1) != 0)
     223      abort ();
     224    u = 1;
     225    if ((u &= 0) != 0)
     226      abort ();
     227    if ((u |= 2) != 1)
     228      abort ();
     229    if ((u ^= 3) != 1)
     230      abort ();
     231    /* Test comma expressions.  */
     232    u = 1;
     233    if ((4, u) != 1)
     234      abort ();
     235    /* Test bitfields.  */
     236    {
     237      int i;
     238      for (i = 0; i < sizeof (struct foo); i++)
     239        *((unsigned char *)&sf + i) = (unsigned char) -1;
     240      sf.a = 1;
     241      if (sf.a != 1)
     242        abort ();
     243      sf.a = 0;
     244      if (sf.a != 0)
     245        abort ();
     246    }
     247    exit (0);
     248  }