annotate clang/test/Sema/tautological-constant-compare.c @ 207:2e18cbf3894f

LLVM12
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 08 Jun 2021 06:07:14 +0900
parents 1d019706d866
children c4bab56944e8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1 // RUN: %clang_cc1 -triple x86_64-linux-gnu -fsyntax-only -Wtautological-constant-in-range-compare -DTEST=2 -verify %s
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
2 // RUN: %clang_cc1 -triple x86_64-linux-gnu -fsyntax-only -Wtautological-constant-in-range-compare -DTEST=2 -verify -x c++ %s
150
anatofuz
parents:
diff changeset
3 // RUN: %clang_cc1 -triple x86_64-linux-gnu -fsyntax-only -Wtautological-type-limit-compare -DTEST -verify %s
anatofuz
parents:
diff changeset
4 // RUN: %clang_cc1 -triple x86_64-linux-gnu -fsyntax-only -Wtautological-type-limit-compare -DTEST -verify -x c++ %s
anatofuz
parents:
diff changeset
5 // RUN: %clang_cc1 -triple x86_64-linux-gnu -fsyntax-only -Wtype-limits -DTEST -verify %s
anatofuz
parents:
diff changeset
6 // RUN: %clang_cc1 -triple x86_64-linux-gnu -fsyntax-only -Wtype-limits -DTEST -verify -x c++ %s
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
7 // RUN: %clang_cc1 -triple x86_64-linux-gnu -fsyntax-only -Wextra -Wno-sign-compare -verify=silent %s
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
8 // RUN: %clang_cc1 -triple x86_64-linux-gnu -fsyntax-only -Wextra -Wno-sign-compare -verify=silent -x c++ %s
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
9 // RUN: %clang_cc1 -triple x86_64-linux-gnu -fsyntax-only -Wall -verify=silent %s
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
10 // RUN: %clang_cc1 -triple x86_64-linux-gnu -fsyntax-only -Wall -verify=silent -x c++ %s
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
11 // RUN: %clang_cc1 -triple x86_64-linux-gnu -fsyntax-only -verify=silent %s
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
12 // RUN: %clang_cc1 -triple x86_64-linux-gnu -fsyntax-only -verify=silent -x c++ %s
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
14 #ifndef TEST
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
15 // silent-no-diagnostics
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
16 #endif
150
anatofuz
parents:
diff changeset
17
anatofuz
parents:
diff changeset
18 int value(void);
anatofuz
parents:
diff changeset
19
anatofuz
parents:
diff changeset
20 #define macro(val) val
anatofuz
parents:
diff changeset
21
anatofuz
parents:
diff changeset
22 #ifdef __cplusplus
anatofuz
parents:
diff changeset
23 template<typename T>
anatofuz
parents:
diff changeset
24 void TFunc() {
anatofuz
parents:
diff changeset
25 // Make sure that we do warn for normal variables in template functions !
anatofuz
parents:
diff changeset
26 unsigned char c = value();
anatofuz
parents:
diff changeset
27 #ifdef TEST
anatofuz
parents:
diff changeset
28 if (c > 255) // expected-warning {{comparison 'unsigned char' > 255 is always false}}
anatofuz
parents:
diff changeset
29 return;
anatofuz
parents:
diff changeset
30 #else
anatofuz
parents:
diff changeset
31 if (c > 255)
anatofuz
parents:
diff changeset
32 return;
anatofuz
parents:
diff changeset
33 #endif
anatofuz
parents:
diff changeset
34
anatofuz
parents:
diff changeset
35 if (c > macro(255))
anatofuz
parents:
diff changeset
36 return;
anatofuz
parents:
diff changeset
37
anatofuz
parents:
diff changeset
38 T v = value();
anatofuz
parents:
diff changeset
39 if (v > 255)
anatofuz
parents:
diff changeset
40 return;
anatofuz
parents:
diff changeset
41 if (v > 32767)
anatofuz
parents:
diff changeset
42 return;
anatofuz
parents:
diff changeset
43 }
anatofuz
parents:
diff changeset
44 #endif
anatofuz
parents:
diff changeset
45
anatofuz
parents:
diff changeset
46 int main()
anatofuz
parents:
diff changeset
47 {
anatofuz
parents:
diff changeset
48 #ifdef __cplusplus
anatofuz
parents:
diff changeset
49 TFunc<unsigned char>();
anatofuz
parents:
diff changeset
50 TFunc<signed short>();
anatofuz
parents:
diff changeset
51 #endif
anatofuz
parents:
diff changeset
52
anatofuz
parents:
diff changeset
53 short s = value();
anatofuz
parents:
diff changeset
54
anatofuz
parents:
diff changeset
55 #ifdef TEST
anatofuz
parents:
diff changeset
56 if (s == 32767)
anatofuz
parents:
diff changeset
57 return 0;
anatofuz
parents:
diff changeset
58 if (s != 32767)
anatofuz
parents:
diff changeset
59 return 0;
anatofuz
parents:
diff changeset
60 if (s < 32767)
anatofuz
parents:
diff changeset
61 return 0;
anatofuz
parents:
diff changeset
62 if (s <= 32767) // expected-warning {{comparison 'short' <= 32767 is always true}}
anatofuz
parents:
diff changeset
63 return 0;
anatofuz
parents:
diff changeset
64 if (s > 32767) // expected-warning {{comparison 'short' > 32767 is always false}}
anatofuz
parents:
diff changeset
65 return 0;
anatofuz
parents:
diff changeset
66 if (s >= 32767)
anatofuz
parents:
diff changeset
67 return 0;
anatofuz
parents:
diff changeset
68
anatofuz
parents:
diff changeset
69 if (32767 == s)
anatofuz
parents:
diff changeset
70 return 0;
anatofuz
parents:
diff changeset
71 if (32767 != s)
anatofuz
parents:
diff changeset
72 return 0;
anatofuz
parents:
diff changeset
73 if (32767 < s) // expected-warning {{comparison 32767 < 'short' is always false}}
anatofuz
parents:
diff changeset
74 return 0;
anatofuz
parents:
diff changeset
75 if (32767 <= s)
anatofuz
parents:
diff changeset
76 return 0;
anatofuz
parents:
diff changeset
77 if (32767 > s)
anatofuz
parents:
diff changeset
78 return 0;
anatofuz
parents:
diff changeset
79 if (32767 >= s) // expected-warning {{comparison 32767 >= 'short' is always true}}
anatofuz
parents:
diff changeset
80 return 0;
anatofuz
parents:
diff changeset
81
anatofuz
parents:
diff changeset
82 // FIXME: assumes two's complement
anatofuz
parents:
diff changeset
83 if (s == -32768)
anatofuz
parents:
diff changeset
84 return 0;
anatofuz
parents:
diff changeset
85 if (s != -32768)
anatofuz
parents:
diff changeset
86 return 0;
anatofuz
parents:
diff changeset
87 if (s < -32768) // expected-warning {{comparison 'short' < -32768 is always false}}
anatofuz
parents:
diff changeset
88 return 0;
anatofuz
parents:
diff changeset
89 if (s <= -32768)
anatofuz
parents:
diff changeset
90 return 0;
anatofuz
parents:
diff changeset
91 if (s > -32768)
anatofuz
parents:
diff changeset
92 return 0;
anatofuz
parents:
diff changeset
93 if (s >= -32768) // expected-warning {{comparison 'short' >= -32768 is always true}}
anatofuz
parents:
diff changeset
94 return 0;
anatofuz
parents:
diff changeset
95
anatofuz
parents:
diff changeset
96 if (-32768 == s)
anatofuz
parents:
diff changeset
97 return 0;
anatofuz
parents:
diff changeset
98 if (-32768 != s)
anatofuz
parents:
diff changeset
99 return 0;
anatofuz
parents:
diff changeset
100 if (-32768 < s)
anatofuz
parents:
diff changeset
101 return 0;
anatofuz
parents:
diff changeset
102 if (-32768 <= s) // expected-warning {{comparison -32768 <= 'short' is always true}}
anatofuz
parents:
diff changeset
103 return 0;
anatofuz
parents:
diff changeset
104 if (-32768 > s) // expected-warning {{comparison -32768 > 'short' is always false}}
anatofuz
parents:
diff changeset
105 return 0;
anatofuz
parents:
diff changeset
106 if (-32768 >= s)
anatofuz
parents:
diff changeset
107 return 0;
anatofuz
parents:
diff changeset
108
anatofuz
parents:
diff changeset
109 // Note: both sides are promoted to unsigned long prior to the comparison, so
anatofuz
parents:
diff changeset
110 // it is perfectly possible for a short to compare greater than 32767UL.
anatofuz
parents:
diff changeset
111 if (s == 32767UL)
anatofuz
parents:
diff changeset
112 return 0;
anatofuz
parents:
diff changeset
113 if (s != 32767UL)
anatofuz
parents:
diff changeset
114 return 0;
anatofuz
parents:
diff changeset
115 if (s < 32767UL)
anatofuz
parents:
diff changeset
116 return 0;
anatofuz
parents:
diff changeset
117 if (s <= 32767UL)
anatofuz
parents:
diff changeset
118 return 0;
anatofuz
parents:
diff changeset
119 if (s > 32767UL)
anatofuz
parents:
diff changeset
120 return 0;
anatofuz
parents:
diff changeset
121 if (s >= 32767UL)
anatofuz
parents:
diff changeset
122 return 0;
anatofuz
parents:
diff changeset
123
anatofuz
parents:
diff changeset
124 if (32767UL == s)
anatofuz
parents:
diff changeset
125 return 0;
anatofuz
parents:
diff changeset
126 if (32767UL != s)
anatofuz
parents:
diff changeset
127 return 0;
anatofuz
parents:
diff changeset
128 if (32767UL < s)
anatofuz
parents:
diff changeset
129 return 0;
anatofuz
parents:
diff changeset
130 if (32767UL <= s)
anatofuz
parents:
diff changeset
131 return 0;
anatofuz
parents:
diff changeset
132 if (32767UL > s)
anatofuz
parents:
diff changeset
133 return 0;
anatofuz
parents:
diff changeset
134 if (32767UL >= s)
anatofuz
parents:
diff changeset
135 return 0;
anatofuz
parents:
diff changeset
136
anatofuz
parents:
diff changeset
137 enum { ULONG_MAX = (2UL * (unsigned long)__LONG_MAX__ + 1UL) };
anatofuz
parents:
diff changeset
138 if (s == 2UL * (unsigned long)__LONG_MAX__ + 1UL)
anatofuz
parents:
diff changeset
139 return 0;
anatofuz
parents:
diff changeset
140 if (s != 2UL * (unsigned long)__LONG_MAX__ + 1UL)
anatofuz
parents:
diff changeset
141 return 0;
anatofuz
parents:
diff changeset
142 if (s < 2UL * (unsigned long)__LONG_MAX__ + 1UL)
anatofuz
parents:
diff changeset
143 return 0;
anatofuz
parents:
diff changeset
144 if (s <= 2UL * (unsigned long)__LONG_MAX__ + 1UL) // expected-warning-re {{comparison 'short' <= {{.*}} is always true}}
anatofuz
parents:
diff changeset
145 return 0;
anatofuz
parents:
diff changeset
146 if (s > 2UL * (unsigned long)__LONG_MAX__ + 1UL) // expected-warning-re {{comparison 'short' > {{.*}} is always false}}
anatofuz
parents:
diff changeset
147 return 0;
anatofuz
parents:
diff changeset
148 if (s >= 2UL * (unsigned long)__LONG_MAX__ + 1UL)
anatofuz
parents:
diff changeset
149 return 0;
anatofuz
parents:
diff changeset
150
anatofuz
parents:
diff changeset
151 if (2UL * (unsigned long)__LONG_MAX__ + 1UL == s)
anatofuz
parents:
diff changeset
152 return 0;
anatofuz
parents:
diff changeset
153 if (2UL * (unsigned long)__LONG_MAX__ + 1UL != s)
anatofuz
parents:
diff changeset
154 return 0;
anatofuz
parents:
diff changeset
155 if (2UL * (unsigned long)__LONG_MAX__ + 1UL < s) // expected-warning-re {{comparison {{.*}} < 'short' is always false}}
anatofuz
parents:
diff changeset
156 return 0;
anatofuz
parents:
diff changeset
157 if (2UL * (unsigned long)__LONG_MAX__ + 1UL <= s)
anatofuz
parents:
diff changeset
158 return 0;
anatofuz
parents:
diff changeset
159 if (2UL * (unsigned long)__LONG_MAX__ + 1UL > s)
anatofuz
parents:
diff changeset
160 return 0;
anatofuz
parents:
diff changeset
161 if (2UL * (unsigned long)__LONG_MAX__ + 1UL >= s) // expected-warning-re {{comparison {{.*}} >= 'short' is always true}}
anatofuz
parents:
diff changeset
162 return 0;
anatofuz
parents:
diff changeset
163
anatofuz
parents:
diff changeset
164 // FIXME: assumes two's complement
anatofuz
parents:
diff changeset
165 if (s == -32768L)
anatofuz
parents:
diff changeset
166 return 0;
anatofuz
parents:
diff changeset
167 if (s != -32768L)
anatofuz
parents:
diff changeset
168 return 0;
anatofuz
parents:
diff changeset
169 if (s < -32768L) // expected-warning {{comparison 'short' < -32768 is always false}}
anatofuz
parents:
diff changeset
170 return 0;
anatofuz
parents:
diff changeset
171 if (s <= -32768L)
anatofuz
parents:
diff changeset
172 return 0;
anatofuz
parents:
diff changeset
173 if (s > -32768L)
anatofuz
parents:
diff changeset
174 return 0;
anatofuz
parents:
diff changeset
175 if (s >= -32768L) // expected-warning {{comparison 'short' >= -32768 is always true}}
anatofuz
parents:
diff changeset
176 return 0;
anatofuz
parents:
diff changeset
177
anatofuz
parents:
diff changeset
178 if (-32768L == s)
anatofuz
parents:
diff changeset
179 return 0;
anatofuz
parents:
diff changeset
180 if (-32768L != s)
anatofuz
parents:
diff changeset
181 return 0;
anatofuz
parents:
diff changeset
182 if (-32768L < s)
anatofuz
parents:
diff changeset
183 return 0;
anatofuz
parents:
diff changeset
184 if (-32768L <= s) // expected-warning {{comparison -32768 <= 'short' is always true}}
anatofuz
parents:
diff changeset
185 return 0;
anatofuz
parents:
diff changeset
186 if (-32768L > s) // expected-warning {{comparison -32768 > 'short' is always false}}
anatofuz
parents:
diff changeset
187 return 0;
anatofuz
parents:
diff changeset
188 if (-32768L >= s)
anatofuz
parents:
diff changeset
189 return 0;
anatofuz
parents:
diff changeset
190 #else
anatofuz
parents:
diff changeset
191 if (s == 32767)
anatofuz
parents:
diff changeset
192 return 0;
anatofuz
parents:
diff changeset
193 if (s != 32767)
anatofuz
parents:
diff changeset
194 return 0;
anatofuz
parents:
diff changeset
195 if (s < 32767)
anatofuz
parents:
diff changeset
196 return 0;
anatofuz
parents:
diff changeset
197 if (s <= 32767)
anatofuz
parents:
diff changeset
198 return 0;
anatofuz
parents:
diff changeset
199 if (s > 32767)
anatofuz
parents:
diff changeset
200 return 0;
anatofuz
parents:
diff changeset
201 if (s >= 32767)
anatofuz
parents:
diff changeset
202 return 0;
anatofuz
parents:
diff changeset
203
anatofuz
parents:
diff changeset
204 if (32767 == s)
anatofuz
parents:
diff changeset
205 return 0;
anatofuz
parents:
diff changeset
206 if (32767 != s)
anatofuz
parents:
diff changeset
207 return 0;
anatofuz
parents:
diff changeset
208 if (32767 < s)
anatofuz
parents:
diff changeset
209 return 0;
anatofuz
parents:
diff changeset
210 if (32767 <= s)
anatofuz
parents:
diff changeset
211 return 0;
anatofuz
parents:
diff changeset
212 if (32767 > s)
anatofuz
parents:
diff changeset
213 return 0;
anatofuz
parents:
diff changeset
214 if (32767 >= s)
anatofuz
parents:
diff changeset
215 return 0;
anatofuz
parents:
diff changeset
216
anatofuz
parents:
diff changeset
217 // FIXME: assumes two's complement
anatofuz
parents:
diff changeset
218 if (s == -32768)
anatofuz
parents:
diff changeset
219 return 0;
anatofuz
parents:
diff changeset
220 if (s != -32768)
anatofuz
parents:
diff changeset
221 return 0;
anatofuz
parents:
diff changeset
222 if (s < -32768)
anatofuz
parents:
diff changeset
223 return 0;
anatofuz
parents:
diff changeset
224 if (s <= -32768)
anatofuz
parents:
diff changeset
225 return 0;
anatofuz
parents:
diff changeset
226 if (s > -32768)
anatofuz
parents:
diff changeset
227 return 0;
anatofuz
parents:
diff changeset
228 if (s >= -32768)
anatofuz
parents:
diff changeset
229 return 0;
anatofuz
parents:
diff changeset
230
anatofuz
parents:
diff changeset
231 if (-32768 == s)
anatofuz
parents:
diff changeset
232 return 0;
anatofuz
parents:
diff changeset
233 if (-32768 != s)
anatofuz
parents:
diff changeset
234 return 0;
anatofuz
parents:
diff changeset
235 if (-32768 < s)
anatofuz
parents:
diff changeset
236 return 0;
anatofuz
parents:
diff changeset
237 if (-32768 <= s)
anatofuz
parents:
diff changeset
238 return 0;
anatofuz
parents:
diff changeset
239 if (-32768 > s)
anatofuz
parents:
diff changeset
240 return 0;
anatofuz
parents:
diff changeset
241 if (-32768 >= s)
anatofuz
parents:
diff changeset
242 return 0;
anatofuz
parents:
diff changeset
243
anatofuz
parents:
diff changeset
244 if (s == 32767UL)
anatofuz
parents:
diff changeset
245 return 0;
anatofuz
parents:
diff changeset
246 if (s != 32767UL)
anatofuz
parents:
diff changeset
247 return 0;
anatofuz
parents:
diff changeset
248 if (s < 32767UL)
anatofuz
parents:
diff changeset
249 return 0;
anatofuz
parents:
diff changeset
250 if (s <= 32767UL)
anatofuz
parents:
diff changeset
251 return 0;
anatofuz
parents:
diff changeset
252 if (s > 32767UL)
anatofuz
parents:
diff changeset
253 return 0;
anatofuz
parents:
diff changeset
254 if (s >= 32767UL)
anatofuz
parents:
diff changeset
255 return 0;
anatofuz
parents:
diff changeset
256
anatofuz
parents:
diff changeset
257 if (32767UL == s)
anatofuz
parents:
diff changeset
258 return 0;
anatofuz
parents:
diff changeset
259 if (32767UL != s)
anatofuz
parents:
diff changeset
260 return 0;
anatofuz
parents:
diff changeset
261 if (32767UL < s)
anatofuz
parents:
diff changeset
262 return 0;
anatofuz
parents:
diff changeset
263 if (32767UL <= s)
anatofuz
parents:
diff changeset
264 return 0;
anatofuz
parents:
diff changeset
265 if (32767UL > s)
anatofuz
parents:
diff changeset
266 return 0;
anatofuz
parents:
diff changeset
267 if (32767UL >= s)
anatofuz
parents:
diff changeset
268 return 0;
anatofuz
parents:
diff changeset
269
anatofuz
parents:
diff changeset
270 // FIXME: assumes two's complement
anatofuz
parents:
diff changeset
271 if (s == -32768L)
anatofuz
parents:
diff changeset
272 return 0;
anatofuz
parents:
diff changeset
273 if (s != -32768L)
anatofuz
parents:
diff changeset
274 return 0;
anatofuz
parents:
diff changeset
275 if (s < -32768L)
anatofuz
parents:
diff changeset
276 return 0;
anatofuz
parents:
diff changeset
277 if (s <= -32768L)
anatofuz
parents:
diff changeset
278 return 0;
anatofuz
parents:
diff changeset
279 if (s > -32768L)
anatofuz
parents:
diff changeset
280 return 0;
anatofuz
parents:
diff changeset
281 if (s >= -32768L)
anatofuz
parents:
diff changeset
282 return 0;
anatofuz
parents:
diff changeset
283
anatofuz
parents:
diff changeset
284 if (-32768L == s)
anatofuz
parents:
diff changeset
285 return 0;
anatofuz
parents:
diff changeset
286 if (-32768L != s)
anatofuz
parents:
diff changeset
287 return 0;
anatofuz
parents:
diff changeset
288 if (-32768L < s)
anatofuz
parents:
diff changeset
289 return 0;
anatofuz
parents:
diff changeset
290 if (-32768L <= s)
anatofuz
parents:
diff changeset
291 return 0;
anatofuz
parents:
diff changeset
292 if (-32768L > s)
anatofuz
parents:
diff changeset
293 return 0;
anatofuz
parents:
diff changeset
294 if (-32768L >= s)
anatofuz
parents:
diff changeset
295 return 0;
anatofuz
parents:
diff changeset
296 #endif
anatofuz
parents:
diff changeset
297
anatofuz
parents:
diff changeset
298 if (s == 0)
anatofuz
parents:
diff changeset
299 return 0;
anatofuz
parents:
diff changeset
300 if (s != 0)
anatofuz
parents:
diff changeset
301 return 0;
anatofuz
parents:
diff changeset
302 if (s < 0)
anatofuz
parents:
diff changeset
303 return 0;
anatofuz
parents:
diff changeset
304 if (s <= 0)
anatofuz
parents:
diff changeset
305 return 0;
anatofuz
parents:
diff changeset
306 if (s > 0)
anatofuz
parents:
diff changeset
307 return 0;
anatofuz
parents:
diff changeset
308 if (s >= 0)
anatofuz
parents:
diff changeset
309 return 0;
anatofuz
parents:
diff changeset
310
anatofuz
parents:
diff changeset
311 if (0 == s)
anatofuz
parents:
diff changeset
312 return 0;
anatofuz
parents:
diff changeset
313 if (0 != s)
anatofuz
parents:
diff changeset
314 return 0;
anatofuz
parents:
diff changeset
315 if (0 < s)
anatofuz
parents:
diff changeset
316 return 0;
anatofuz
parents:
diff changeset
317 if (0 <= s)
anatofuz
parents:
diff changeset
318 return 0;
anatofuz
parents:
diff changeset
319 if (0 > s)
anatofuz
parents:
diff changeset
320 return 0;
anatofuz
parents:
diff changeset
321 if (0 >= s)
anatofuz
parents:
diff changeset
322 return 0;
anatofuz
parents:
diff changeset
323
anatofuz
parents:
diff changeset
324 unsigned short us = value();
anatofuz
parents:
diff changeset
325
anatofuz
parents:
diff changeset
326 #ifdef TEST
anatofuz
parents:
diff changeset
327 if (us == 65535)
anatofuz
parents:
diff changeset
328 return 0;
anatofuz
parents:
diff changeset
329 if (us != 65535)
anatofuz
parents:
diff changeset
330 return 0;
anatofuz
parents:
diff changeset
331 if (us < 65535)
anatofuz
parents:
diff changeset
332 return 0;
anatofuz
parents:
diff changeset
333 if (us <= 65535) // expected-warning {{comparison 'unsigned short' <= 65535 is always true}}
anatofuz
parents:
diff changeset
334 return 0;
anatofuz
parents:
diff changeset
335 if (us > 65535) // expected-warning {{comparison 'unsigned short' > 65535 is always false}}
anatofuz
parents:
diff changeset
336 return 0;
anatofuz
parents:
diff changeset
337 if (us >= 65535)
anatofuz
parents:
diff changeset
338 return 0;
anatofuz
parents:
diff changeset
339
anatofuz
parents:
diff changeset
340 if (65535 == us)
anatofuz
parents:
diff changeset
341 return 0;
anatofuz
parents:
diff changeset
342 if (65535 != us)
anatofuz
parents:
diff changeset
343 return 0;
anatofuz
parents:
diff changeset
344 if (65535 < us) // expected-warning {{comparison 65535 < 'unsigned short' is always false}}
anatofuz
parents:
diff changeset
345 return 0;
anatofuz
parents:
diff changeset
346 if (65535 <= us)
anatofuz
parents:
diff changeset
347 return 0;
anatofuz
parents:
diff changeset
348 if (65535 > us)
anatofuz
parents:
diff changeset
349 return 0;
anatofuz
parents:
diff changeset
350 if (65535 >= us) // expected-warning {{comparison 65535 >= 'unsigned short' is always true}}
anatofuz
parents:
diff changeset
351 return 0;
anatofuz
parents:
diff changeset
352
anatofuz
parents:
diff changeset
353 if (us == 65535UL)
anatofuz
parents:
diff changeset
354 return 0;
anatofuz
parents:
diff changeset
355 if (us != 65535UL)
anatofuz
parents:
diff changeset
356 return 0;
anatofuz
parents:
diff changeset
357 if (us < 65535UL)
anatofuz
parents:
diff changeset
358 return 0;
anatofuz
parents:
diff changeset
359 if (us <= 65535UL) // expected-warning {{comparison 'unsigned short' <= 65535 is always true}}
anatofuz
parents:
diff changeset
360 return 0;
anatofuz
parents:
diff changeset
361 if (us > 65535UL) // expected-warning {{comparison 'unsigned short' > 65535 is always false}}
anatofuz
parents:
diff changeset
362 return 0;
anatofuz
parents:
diff changeset
363 if (us >= 65535UL)
anatofuz
parents:
diff changeset
364 return 0;
anatofuz
parents:
diff changeset
365
anatofuz
parents:
diff changeset
366 if (65535UL == us)
anatofuz
parents:
diff changeset
367 return 0;
anatofuz
parents:
diff changeset
368 if (65535UL != us)
anatofuz
parents:
diff changeset
369 return 0;
anatofuz
parents:
diff changeset
370 if (65535UL < us) // expected-warning {{comparison 65535 < 'unsigned short' is always false}}
anatofuz
parents:
diff changeset
371 return 0;
anatofuz
parents:
diff changeset
372 if (65535UL <= us)
anatofuz
parents:
diff changeset
373 return 0;
anatofuz
parents:
diff changeset
374 if (65535UL > us)
anatofuz
parents:
diff changeset
375 return 0;
anatofuz
parents:
diff changeset
376 if (65535UL >= us) // expected-warning {{comparison 65535 >= 'unsigned short' is always true}}
anatofuz
parents:
diff changeset
377 return 0;
anatofuz
parents:
diff changeset
378 #else
anatofuz
parents:
diff changeset
379 if (us == 65535)
anatofuz
parents:
diff changeset
380 return 0;
anatofuz
parents:
diff changeset
381 if (us != 65535)
anatofuz
parents:
diff changeset
382 return 0;
anatofuz
parents:
diff changeset
383 if (us < 65535)
anatofuz
parents:
diff changeset
384 return 0;
anatofuz
parents:
diff changeset
385 if (us <= 65535)
anatofuz
parents:
diff changeset
386 return 0;
anatofuz
parents:
diff changeset
387 if (us > 65535)
anatofuz
parents:
diff changeset
388 return 0;
anatofuz
parents:
diff changeset
389 if (us >= 65535)
anatofuz
parents:
diff changeset
390 return 0;
anatofuz
parents:
diff changeset
391
anatofuz
parents:
diff changeset
392 if (65535 == us)
anatofuz
parents:
diff changeset
393 return 0;
anatofuz
parents:
diff changeset
394 if (65535 != us)
anatofuz
parents:
diff changeset
395 return 0;
anatofuz
parents:
diff changeset
396 if (65535 < us)
anatofuz
parents:
diff changeset
397 return 0;
anatofuz
parents:
diff changeset
398 if (65535 <= us)
anatofuz
parents:
diff changeset
399 return 0;
anatofuz
parents:
diff changeset
400 if (65535 > us)
anatofuz
parents:
diff changeset
401 return 0;
anatofuz
parents:
diff changeset
402 if (65535 >= us)
anatofuz
parents:
diff changeset
403 return 0;
anatofuz
parents:
diff changeset
404
anatofuz
parents:
diff changeset
405 if (us == 65535UL)
anatofuz
parents:
diff changeset
406 return 0;
anatofuz
parents:
diff changeset
407 if (us != 65535UL)
anatofuz
parents:
diff changeset
408 return 0;
anatofuz
parents:
diff changeset
409 if (us < 65535UL)
anatofuz
parents:
diff changeset
410 return 0;
anatofuz
parents:
diff changeset
411 if (us <= 65535UL)
anatofuz
parents:
diff changeset
412 return 0;
anatofuz
parents:
diff changeset
413 if (us > 65535UL)
anatofuz
parents:
diff changeset
414 return 0;
anatofuz
parents:
diff changeset
415 if (us >= 65535UL)
anatofuz
parents:
diff changeset
416 return 0;
anatofuz
parents:
diff changeset
417
anatofuz
parents:
diff changeset
418 if (65535UL == us)
anatofuz
parents:
diff changeset
419 return 0;
anatofuz
parents:
diff changeset
420 if (65535UL != us)
anatofuz
parents:
diff changeset
421 return 0;
anatofuz
parents:
diff changeset
422 if (65535UL < us)
anatofuz
parents:
diff changeset
423 return 0;
anatofuz
parents:
diff changeset
424 if (65535UL <= us)
anatofuz
parents:
diff changeset
425 return 0;
anatofuz
parents:
diff changeset
426 if (65535UL > us)
anatofuz
parents:
diff changeset
427 return 0;
anatofuz
parents:
diff changeset
428 if (65535UL >= us)
anatofuz
parents:
diff changeset
429 return 0;
anatofuz
parents:
diff changeset
430 #endif
anatofuz
parents:
diff changeset
431
anatofuz
parents:
diff changeset
432 if (us == 32767)
anatofuz
parents:
diff changeset
433 return 0;
anatofuz
parents:
diff changeset
434 if (us != 32767)
anatofuz
parents:
diff changeset
435 return 0;
anatofuz
parents:
diff changeset
436 if (us < 32767)
anatofuz
parents:
diff changeset
437 return 0;
anatofuz
parents:
diff changeset
438 if (us <= 32767)
anatofuz
parents:
diff changeset
439 return 0;
anatofuz
parents:
diff changeset
440 if (us > 32767)
anatofuz
parents:
diff changeset
441 return 0;
anatofuz
parents:
diff changeset
442 if (us >= 32767)
anatofuz
parents:
diff changeset
443 return 0;
anatofuz
parents:
diff changeset
444
anatofuz
parents:
diff changeset
445 if (32767 == us)
anatofuz
parents:
diff changeset
446 return 0;
anatofuz
parents:
diff changeset
447 if (32767 != us)
anatofuz
parents:
diff changeset
448 return 0;
anatofuz
parents:
diff changeset
449 if (32767 < us)
anatofuz
parents:
diff changeset
450 return 0;
anatofuz
parents:
diff changeset
451 if (32767 <= us)
anatofuz
parents:
diff changeset
452 return 0;
anatofuz
parents:
diff changeset
453 if (32767 > us)
anatofuz
parents:
diff changeset
454 return 0;
anatofuz
parents:
diff changeset
455 if (32767 >= us)
anatofuz
parents:
diff changeset
456 return 0;
anatofuz
parents:
diff changeset
457
anatofuz
parents:
diff changeset
458 if (us == 32767UL)
anatofuz
parents:
diff changeset
459 return 0;
anatofuz
parents:
diff changeset
460 if (us != 32767UL)
anatofuz
parents:
diff changeset
461 return 0;
anatofuz
parents:
diff changeset
462 if (us < 32767UL)
anatofuz
parents:
diff changeset
463 return 0;
anatofuz
parents:
diff changeset
464 if (us <= 32767UL)
anatofuz
parents:
diff changeset
465 return 0;
anatofuz
parents:
diff changeset
466 if (us > 32767UL)
anatofuz
parents:
diff changeset
467 return 0;
anatofuz
parents:
diff changeset
468 if (us >= 32767UL)
anatofuz
parents:
diff changeset
469 return 0;
anatofuz
parents:
diff changeset
470
anatofuz
parents:
diff changeset
471 if (32767UL == us)
anatofuz
parents:
diff changeset
472 return 0;
anatofuz
parents:
diff changeset
473 if (32767UL != us)
anatofuz
parents:
diff changeset
474 return 0;
anatofuz
parents:
diff changeset
475 if (32767UL < us)
anatofuz
parents:
diff changeset
476 return 0;
anatofuz
parents:
diff changeset
477 if (32767UL <= us)
anatofuz
parents:
diff changeset
478 return 0;
anatofuz
parents:
diff changeset
479 if (32767UL > us)
anatofuz
parents:
diff changeset
480 return 0;
anatofuz
parents:
diff changeset
481 if (32767UL >= us)
anatofuz
parents:
diff changeset
482 return 0;
anatofuz
parents:
diff changeset
483
anatofuz
parents:
diff changeset
484 #if __SIZEOF_INT128__
anatofuz
parents:
diff changeset
485 __int128 i128 = value();
anatofuz
parents:
diff changeset
486 if (i128 == -1) // used to crash
anatofuz
parents:
diff changeset
487 return 0;
anatofuz
parents:
diff changeset
488 #endif
anatofuz
parents:
diff changeset
489
anatofuz
parents:
diff changeset
490
anatofuz
parents:
diff changeset
491 enum E {
anatofuz
parents:
diff changeset
492 yes,
anatofuz
parents:
diff changeset
493 no,
anatofuz
parents:
diff changeset
494 maybe
anatofuz
parents:
diff changeset
495 };
anatofuz
parents:
diff changeset
496 enum E e = (enum E)value();
anatofuz
parents:
diff changeset
497
anatofuz
parents:
diff changeset
498 if (e == yes)
anatofuz
parents:
diff changeset
499 return 0;
anatofuz
parents:
diff changeset
500 if (e != yes)
anatofuz
parents:
diff changeset
501 return 0;
anatofuz
parents:
diff changeset
502 if (e < yes)
anatofuz
parents:
diff changeset
503 return 0;
anatofuz
parents:
diff changeset
504 if (e <= yes)
anatofuz
parents:
diff changeset
505 return 0;
anatofuz
parents:
diff changeset
506 if (e > yes)
anatofuz
parents:
diff changeset
507 return 0;
anatofuz
parents:
diff changeset
508 if (e >= yes)
anatofuz
parents:
diff changeset
509 return 0;
anatofuz
parents:
diff changeset
510
anatofuz
parents:
diff changeset
511 if (yes == e)
anatofuz
parents:
diff changeset
512 return 0;
anatofuz
parents:
diff changeset
513 if (yes != e)
anatofuz
parents:
diff changeset
514 return 0;
anatofuz
parents:
diff changeset
515 if (yes < e)
anatofuz
parents:
diff changeset
516 return 0;
anatofuz
parents:
diff changeset
517 if (yes <= e)
anatofuz
parents:
diff changeset
518 return 0;
anatofuz
parents:
diff changeset
519 if (yes > e)
anatofuz
parents:
diff changeset
520 return 0;
anatofuz
parents:
diff changeset
521 if (yes >= e)
anatofuz
parents:
diff changeset
522 return 0;
anatofuz
parents:
diff changeset
523
anatofuz
parents:
diff changeset
524 if (e == maybe)
anatofuz
parents:
diff changeset
525 return 0;
anatofuz
parents:
diff changeset
526 if (e != maybe)
anatofuz
parents:
diff changeset
527 return 0;
anatofuz
parents:
diff changeset
528 if (e < maybe)
anatofuz
parents:
diff changeset
529 return 0;
anatofuz
parents:
diff changeset
530 if (e <= maybe)
anatofuz
parents:
diff changeset
531 return 0;
anatofuz
parents:
diff changeset
532 if (e > maybe)
anatofuz
parents:
diff changeset
533 return 0;
anatofuz
parents:
diff changeset
534 if (e >= maybe)
anatofuz
parents:
diff changeset
535 return 0;
anatofuz
parents:
diff changeset
536
anatofuz
parents:
diff changeset
537 if (maybe == e)
anatofuz
parents:
diff changeset
538 return 0;
anatofuz
parents:
diff changeset
539 if (maybe != e)
anatofuz
parents:
diff changeset
540 return 0;
anatofuz
parents:
diff changeset
541 if (maybe < e)
anatofuz
parents:
diff changeset
542 return 0;
anatofuz
parents:
diff changeset
543 if (maybe <= e)
anatofuz
parents:
diff changeset
544 return 0;
anatofuz
parents:
diff changeset
545 if (maybe > e)
anatofuz
parents:
diff changeset
546 return 0;
anatofuz
parents:
diff changeset
547 if (maybe >= e)
anatofuz
parents:
diff changeset
548 return 0;
anatofuz
parents:
diff changeset
549
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
550 // We only warn on out-of-range bitfields and expressions with limited range
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
551 // under -Wtantological-in-range-compare, not under -Wtype-limits, because
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
552 // the warning is not based on the type alone.
150
anatofuz
parents:
diff changeset
553 struct A {
anatofuz
parents:
diff changeset
554 int a : 3;
anatofuz
parents:
diff changeset
555 unsigned b : 3;
anatofuz
parents:
diff changeset
556 long c : 3;
anatofuz
parents:
diff changeset
557 unsigned long d : 3;
anatofuz
parents:
diff changeset
558 } a;
anatofuz
parents:
diff changeset
559 if (a.a < 3) {}
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
560 if (a.a < 4) {} // #bitfield1
150
anatofuz
parents:
diff changeset
561 if (a.b < 7) {}
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
562 if (a.b < 8) {} // #bitfield2
150
anatofuz
parents:
diff changeset
563 if (a.c < 3) {}
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
564 if (a.c < 4) {} // #bitfield3
150
anatofuz
parents:
diff changeset
565 if (a.d < 7) {}
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
566 if (a.d < 8) {} // #bitfield4
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
567 #if TEST == 2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
568 // expected-warning@#bitfield1 {{comparison of 3-bit signed value < 4 is always true}}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
569 // expected-warning@#bitfield2 {{comparison of 3-bit unsigned value < 8 is always true}}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
570 // expected-warning@#bitfield3 {{comparison of 3-bit signed value < 4 is always true}}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
571 // expected-warning@#bitfield4 {{comparison of 3-bit unsigned value < 8 is always true}}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
572 #endif
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
573
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
574 if ((s & 0xff) < 0) {} // #valuerange1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
575 if ((s & 0xff) < 1) {}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
576 if ((s & -3) < -4) {}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
577 if ((s & -3) < -3) {}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
578 if ((s & -3) < 4u) {}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
579 if ((s & -3) > 4u) {}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
580 if ((s & -3) == 4u) {}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
581 if ((s & -3) == 3u) {} // FIXME: Impossible.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
582 if ((s & -3) == -5u) {}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
583 if ((s & -3) == -4u) {}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
584 #if TEST == 2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
585 // expected-warning@#valuerange1 {{comparison of 8-bit unsigned value < 0 is always false}}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
586 #endif
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
587
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
588 // FIXME: Our bit-level width tracking comes unstuck here: the second of the
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
589 // conditions below is also tautological, but we can't tell that because we
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
590 // don't track the actual range, only the bit-width.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
591 if ((s ? 1 : 0) + (us ? 1 : 0) > 1) {}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
592 if ((s ? 1 : 0) + (us ? 1 : 0) > 2) {}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
593 if ((s ? 1 : 0) + (us ? 1 : 0) > 3) {} // #addrange1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
594 #if TEST == 2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
595 // expected-warning@#addrange1 {{comparison of 2-bit unsigned value > 3 is always false}}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
596 #endif
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
597
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
598 // FIXME: The second and third comparisons are also tautological; 0x40000000
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
599 // is the greatest value that multiplying two int16s can produce.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
600 if (s * s > 0x3fffffff) {}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
601 if (s * s > 0x40000000) {}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
602 if (s * s > 0x7ffffffe) {}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
603 if (s * s > 0x7fffffff) {} // expected-warning {{result of comparison 'int' > 2147483647 is always false}}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
604
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
605 if ((s & 0x3ff) * (s & 0x1f) > 0x7be0) {}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
606 if ((s & 0x3ff) * (s & 0x1f) > 0x7be1) {} // FIXME
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
607 if ((s & 0x3ff) * (s & 0x1f) > 0x7ffe) {} // FIXME
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
608 if ((s & 0x3ff) * (s & 0x1f) > 0x7fff) {} // #mulrange1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
609 #if TEST == 2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
610 // expected-warning@#mulrange1 {{comparison of 15-bit unsigned value > 32767 is always false}}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
611 #endif
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
612
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
613 if (a.a * a.b > 21) {} // FIXME
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
614 if (a.a * a.b > 31) {} // #mulrange2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
615 #if TEST == 2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
616 // expected-warning@#mulrange2 {{comparison of 6-bit signed value > 31 is always false}}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
617 #endif
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
618
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
619 if (a.a - (s & 1) < -4) {}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
620 if (a.a - (s & 1) < -7) {} // FIXME
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
621 if (a.a - (s & 1) < -8) {} // #subrange1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
622 if (a.a - (s & 1) > 3) {} // FIXME: Can be < -4 but not > 3.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
623 if (a.a - (s & 1) > 7) {} // #subrange2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
624
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
625 if (a.a - (s & 7) < -8) {}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
626 if (a.a - (s & 7) > 7) {} // FIXME: Can be < -8 but not > 7.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
627 if (a.a - (s & 7) < -15) {}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
628 if (a.a - (s & 7) < -16) {} // #subrange3
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
629 if (a.a - (s & 7) > 15) {} // #subrange4
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
630
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
631 if (a.b - (s & 1) > 6) {}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
632 if (a.b - (s & 1) > 7) {} // #subrange5
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
633 if (a.b - (s & 7) < -8) {} // #subrange6
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
634 if (a.b - (s & 15) < -8) {}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
635 if (a.b - (s & 15) < -16) {} // #subrange7
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
636 #if TEST == 2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
637 // expected-warning@#subrange1 {{comparison of 4-bit signed value < -8 is always false}}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
638 // expected-warning@#subrange2 {{comparison of 4-bit signed value > 7 is always false}}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
639 // expected-warning@#subrange3 {{comparison of 5-bit signed value < -16 is always false}}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
640 // expected-warning@#subrange4 {{comparison of 5-bit signed value > 15 is always false}}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
641 // expected-warning@#subrange5 {{comparison of 4-bit signed value > 7 is always false}}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
642 // expected-warning@#subrange6 {{comparison of 4-bit signed value < -8 is always false}}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
643 // expected-warning@#subrange7 {{comparison of 5-bit signed value < -16 is always false}}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
644 #endif
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
645
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
646 // a.a % 3 is in range [-2, 2], which we expand to [-4, 4)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
647 if (a.a % 3 > 2) {}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
648 if (a.a % 3 > 3) {} // #remrange1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
649 if (a.a % 3 == -1) {}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
650 if (a.a % 3 == -2) {}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
651 if (a.a % 3 < -3) {} // FIXME
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
652 if (a.a % 3 < -4) {} // #remrange2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
653
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
654 // a.b % 3 is in range [0, 3), which we expand to [0, 4)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
655 if (a.b % 3 > 2) {}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
656 if (a.b % 3 > 3) {} // #remrange3
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
657 if (a.b % 3 < 0) {} // #remrange4
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
658 #if TEST == 2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
659 // expected-warning@#remrange1 {{comparison of 3-bit signed value > 3 is always false}}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
660 // expected-warning@#remrange2 {{comparison of 3-bit signed value < -4 is always false}}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
661 // expected-warning@#remrange3 {{comparison of 2-bit unsigned value > 3 is always false}}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
662 // expected-warning@#remrange4 {{comparison of 2-bit unsigned value < 0 is always false}}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
663 #endif
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
664
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
665 // Don't warn on non-constant-expression values that end up being a constant
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
666 // 0; we generally only want to warn when one side of the comparison is
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
667 // effectively non-constant.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
668 if ("x"[1] == 0) {}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
669 if (((void)s, 0) == 0) {}
150
anatofuz
parents:
diff changeset
670
anatofuz
parents:
diff changeset
671 return 1;
anatofuz
parents:
diff changeset
672 }