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