111
|
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 }
|