]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/testsuite/g++.dg/plugin/diagnostic-test-expressions-1.C
c08fec4d019dd18957e95b003e862610093002a2
[thirdparty/gcc.git] / gcc / testsuite / g++.dg / plugin / diagnostic-test-expressions-1.C
1 /* { dg-do compile } */
2 /* { dg-options "-O -fdiagnostics-show-caret -fpermissive" } */
3
4 /* This is a collection of unittests to verify that we're correctly
5 capturing the source code ranges of various kinds of expression.
6
7 It uses the various "diagnostic_test_*_expression_range_plugin"
8 plugins which handles "__emit_expression_range" by generating a warning
9 at the given source range of the input argument. Each of the
10 different plugins do this at a different phase of the internal
11 representation (tree, gimple, etc), so we can verify that the
12 source code range information is valid at each phase.
13
14 We want to accept an expression of any type. We use variadic arguments.
15 For compatibility with the C tests we have a dummy argument, since
16 C requires at least one argument before the ellipsis. */
17
18 extern void __emit_expression_range (int dummy, ...);
19
20 int global;
21
22 void test_global (void)
23 {
24 __emit_expression_range (0, global); /* { dg-warning "range" } */
25 /* { dg-begin-multiline-output "" }
26 __emit_expression_range (0, global);
27 ^~~~~~
28 { dg-end-multiline-output "" } */
29 }
30
31 void test_param (int param)
32 {
33 __emit_expression_range (0, param); /* { dg-warning "range" } */
34 /* { dg-begin-multiline-output "" }
35 __emit_expression_range (0, param);
36 ^~~~~
37 { dg-end-multiline-output "" } */
38 }
39
40 void test_local (void)
41 {
42 int local = 5;
43
44 __emit_expression_range (0, local); /* { dg-warning "range" } */
45 /* { dg-begin-multiline-output "" }
46 __emit_expression_range (0, local);
47 ^~~~~
48 { dg-end-multiline-output "" } */
49 }
50
51 void test_integer_constants (void)
52 {
53 __emit_expression_range (0, 1234); /* { dg-warning "range" } */
54 /* { dg-begin-multiline-output "" }
55 __emit_expression_range (0, 1234);
56 ^~~~
57 { dg-end-multiline-output "" } */
58
59 /* Ensure that zero works. */
60
61 __emit_expression_range (0, 0); /* { dg-warning "range" } */
62 /* { dg-begin-multiline-output "" }
63 __emit_expression_range (0, 0);
64 ^
65 { dg-end-multiline-output "" } */
66 }
67
68 void test_character_constants (void)
69 {
70 __emit_expression_range (0, 'a'); /* { dg-warning "range" } */
71 /* { dg-begin-multiline-output "" }
72 __emit_expression_range (0, 'a');
73 ^~~
74 { dg-end-multiline-output "" } */
75 }
76
77 void test_floating_constants (void)
78 {
79 __emit_expression_range (0, 98.6); /* { dg-warning "range" } */
80 /* { dg-begin-multiline-output "" }
81 __emit_expression_range (0, 98.6);
82 ^~~~
83 { dg-end-multiline-output "" } */
84
85 __emit_expression_range (0, .6); /* { dg-warning "range" } */
86 /* { dg-begin-multiline-output "" }
87 __emit_expression_range (0, .6);
88 ^~
89 { dg-end-multiline-output "" } */
90
91 __emit_expression_range (0, 98.); /* { dg-warning "range" } */
92 /* { dg-begin-multiline-output "" }
93 __emit_expression_range (0, 98.);
94 ^~~
95 { dg-end-multiline-output "" } */
96
97 __emit_expression_range (0, 6.022140857e23 ); /* { dg-warning "range" } */
98 /* { dg-begin-multiline-output "" }
99 __emit_expression_range (0, 6.022140857e23 );
100 ^~~~~~~~~~~~~~
101 { dg-end-multiline-output "" } */
102
103 __emit_expression_range (0, 98.6f ); /* { dg-warning "range" } */
104 /* { dg-begin-multiline-output "" }
105 __emit_expression_range (0, 98.6f );
106 ^~~~~
107 { dg-end-multiline-output "" } */
108
109 __emit_expression_range (0, 6.022140857e23l ); /* { dg-warning "range" } */
110 /* { dg-begin-multiline-output "" }
111 __emit_expression_range (0, 6.022140857e23l );
112 ^~~~~~~~~~~~~~~
113 { dg-end-multiline-output "" } */
114 }
115
116 enum test_enum {
117 TEST_ENUM_VALUE
118 };
119
120 void test_enumeration_constant (void)
121 {
122 __emit_expression_range (0, TEST_ENUM_VALUE ); /* { dg-warning "range" } */
123 /* { dg-begin-multiline-output "" }
124 __emit_expression_range (0, TEST_ENUM_VALUE );
125 ^~~~~~~~~~~~~~~
126 { dg-end-multiline-output "" } */
127 }
128
129 void test_parentheses (int a, int b)
130 {
131 __emit_expression_range (0, (a + b) ); /* { dg-warning "range" } */
132 /* { dg-begin-multiline-output "" }
133 __emit_expression_range (0, (a + b) );
134 ~~~^~~~
135 { dg-end-multiline-output "" } */
136
137 __emit_expression_range (0, (a + b) * (a - b) ); /* { dg-warning "range" } */
138 /* { dg-begin-multiline-output "" }
139 __emit_expression_range (0, (a + b) * (a - b) );
140 ~~~~~~~~^~~~~~~~~
141 { dg-end-multiline-output "" } */
142
143 __emit_expression_range (0, !(a && b) ); /* { dg-warning "range" } */
144 /* { dg-begin-multiline-output "" }
145 __emit_expression_range (0, !(a && b) );
146 ^~~~~~~~~
147 { dg-end-multiline-output "" } */
148 }
149
150 /* Postfix expressions. ************************************************/
151
152 void test_array_reference (int *arr)
153 {
154 __emit_expression_range (0, arr[100] ); /* { dg-warning "range" } */
155 /* { dg-begin-multiline-output "" }
156 __emit_expression_range (0, arr[100] );
157 ~~~~~~~^
158 { dg-end-multiline-output "" } */
159 }
160
161 int test_function_call (int p, int q, int r)
162 {
163 __emit_expression_range (0, test_function_call (p, q, r) ); /* { dg-warning "range" } */
164 /* { dg-begin-multiline-output "" }
165 __emit_expression_range (0, test_function_call (p, q, r) );
166 ~~~~~~~~~~~~~~~~~~~^~~~~~~~~
167 { dg-end-multiline-output "" } */
168 return 0;
169 }
170
171 struct test_struct
172 {
173 int field;
174 };
175
176 void test_structure_references (struct test_struct *ptr)
177 {
178 struct test_struct local;
179 local.field = 42;
180
181 __emit_expression_range (0, local.field ); /* { dg-warning "range" } */
182 /* { dg-begin-multiline-output "" }
183 __emit_expression_range (0, local.field );
184 ~~~~~~^~~~~
185 { dg-end-multiline-output "" } */
186
187 __emit_expression_range (0, ptr->field ); /* { dg-warning "range" } */
188 /* { dg-begin-multiline-output "" }
189 __emit_expression_range (0, ptr->field );
190 ~~~~~^~~~~
191 { dg-end-multiline-output "" } */
192 }
193
194 void test_postfix_incdec (int i)
195 {
196 __emit_expression_range (0, i++ ); /* { dg-warning "range" } */
197 /* { dg-begin-multiline-output "" }
198 __emit_expression_range (0, i++ );
199 ~^~
200 { dg-end-multiline-output "" } */
201
202 __emit_expression_range (0, i-- ); /* { dg-warning "range" } */
203 /* { dg-begin-multiline-output "" }
204 __emit_expression_range (0, i-- );
205 ~^~
206 { dg-end-multiline-output "" } */
207 }
208
209 /* Unary operators. ****************************************************/
210
211 void test_sizeof (int i)
212 {
213 __emit_expression_range (0, sizeof i ); /* { dg-warning "range" } */
214 /* { dg-begin-multiline-output "" }
215 __emit_expression_range (0, sizeof i );
216 ^~~~~~~~
217 { dg-end-multiline-output "" } */
218
219 __emit_expression_range (0, sizeof (char) ); /* { dg-warning "range" } */
220 /* { dg-begin-multiline-output "" }
221 __emit_expression_range (0, sizeof (char) );
222 ^~~~~~~~~~~~~
223 { dg-end-multiline-output "" } */
224 }
225
226 void test_alignof (int i)
227 {
228 __emit_expression_range (0, alignof(int)); /* { dg-warning "range" } */
229 /* { dg-begin-multiline-output "" }
230 __emit_expression_range (0, alignof(int));
231 ^~~~~~~~~~~~
232 { dg-end-multiline-output "" } */
233
234 __emit_expression_range (0, __alignof__(int)); /* { dg-warning "range" } */
235 /* { dg-begin-multiline-output "" }
236 __emit_expression_range (0, __alignof__(int));
237 ^~~~~~~~~~~~~~~~
238 { dg-end-multiline-output "" } */
239 __emit_expression_range (0, __alignof__ i); /* { dg-warning "range" } */
240 /* { dg-begin-multiline-output "" }
241 __emit_expression_range (0, __alignof__ i);
242 ^~~~~~~~~~~~~
243 { dg-end-multiline-output "" } */
244 }
245
246 void test_prefix_incdec (int i)
247 {
248 __emit_expression_range (0, ++i ); /* { dg-warning "range" } */
249 /* { dg-begin-multiline-output "" }
250 __emit_expression_range (0, ++i );
251 ^~~
252 { dg-end-multiline-output "" } */
253
254 __emit_expression_range (0, --i ); /* { dg-warning "range" } */
255 /* { dg-begin-multiline-output "" }
256 __emit_expression_range (0, --i );
257 ^~~
258 { dg-end-multiline-output "" } */
259 }
260
261 void test_address_operator (void)
262 {
263 __emit_expression_range (0, &global ); /* { dg-warning "range" } */
264 /* { dg-begin-multiline-output "" }
265 __emit_expression_range (0, &global );
266 ^~~~~~~
267 { dg-end-multiline-output "" } */
268 }
269
270 void test_indirection (int *ptr)
271 {
272 __emit_expression_range (0, *ptr ); /* { dg-warning "range" } */
273 /* { dg-begin-multiline-output "" }
274 __emit_expression_range (0, *ptr );
275 ^~~~
276 { dg-end-multiline-output "" } */
277 }
278
279 void test_unary_plus (int i)
280 {
281 __emit_expression_range (0, +i ); /* { dg-warning "range" } */
282 /* { dg-begin-multiline-output "" }
283 __emit_expression_range (0, +i );
284 ^~
285 { dg-end-multiline-output "" } */
286 }
287
288 void test_unary_minus (int i)
289 {
290 __emit_expression_range (0, -i ); /* { dg-warning "range" } */
291 /* { dg-begin-multiline-output "" }
292 __emit_expression_range (0, -i );
293 ^~
294 { dg-end-multiline-output "" } */
295 }
296
297 void test_ones_complement (int i)
298 {
299 __emit_expression_range (0, ~i ); /* { dg-warning "range" } */
300 /* { dg-begin-multiline-output "" }
301 __emit_expression_range (0, ~i );
302 ^~
303 { dg-end-multiline-output "" } */
304 }
305
306 void test_logical_negation (int flag)
307 {
308 __emit_expression_range (0, !flag ); /* { dg-warning "range" } */
309 /* { dg-begin-multiline-output "" }
310 __emit_expression_range (0, !flag );
311 ^~~~~
312 { dg-end-multiline-output "" } */
313 }
314
315 /* Casts. ****************************************************/
316
317 void test_cast (void *ptr)
318 {
319 __emit_expression_range (0, (int *)ptr ); /* { dg-warning "range" } */
320 /* { dg-begin-multiline-output "" }
321 __emit_expression_range (0, (int *)ptr );
322 ^~~~~~~~~~
323 { dg-end-multiline-output "" } */
324
325 __emit_expression_range (0, *(int *)0xdeadbeef ); /* { dg-warning "range" } */
326 /* { dg-begin-multiline-output "" }
327 __emit_expression_range (0, *(int *)0xdeadbeef );
328 ^~~~~~~~~~~~~~~~~~
329 { dg-end-multiline-output "" } */
330
331 }
332
333 /* Binary operators. *******************************************/
334
335 void test_multiplicative_operators (int lhs, int rhs)
336 {
337 __emit_expression_range (0, lhs * rhs ); /* { dg-warning "range" } */
338 /* { dg-begin-multiline-output "" }
339 __emit_expression_range (0, lhs * rhs );
340 ~~~~^~~~~
341 { dg-end-multiline-output "" } */
342
343 __emit_expression_range (0, lhs / rhs ); /* { dg-warning "range" } */
344 /* { dg-begin-multiline-output "" }
345 __emit_expression_range (0, lhs / rhs );
346 ~~~~^~~~~
347 { dg-end-multiline-output "" } */
348
349 __emit_expression_range (0, lhs % rhs ); /* { dg-warning "range" } */
350 /* { dg-begin-multiline-output "" }
351 __emit_expression_range (0, lhs % rhs );
352 ~~~~^~~~~
353 { dg-end-multiline-output "" } */
354 }
355
356 void test_additive_operators (int lhs, int rhs)
357 {
358 __emit_expression_range (0, lhs + rhs ); /* { dg-warning "range" } */
359 /* { dg-begin-multiline-output "" }
360 __emit_expression_range (0, lhs + rhs );
361 ~~~~^~~~~
362 { dg-end-multiline-output "" } */
363
364 __emit_expression_range (0, lhs - rhs ); /* { dg-warning "range" } */
365 /* { dg-begin-multiline-output "" }
366 __emit_expression_range (0, lhs - rhs );
367 ~~~~^~~~~
368 { dg-end-multiline-output "" } */
369 }
370
371 void test_shift_operators (int lhs, int rhs)
372 {
373 __emit_expression_range (0, lhs << rhs ); /* { dg-warning "range" } */
374 /* { dg-begin-multiline-output "" }
375 __emit_expression_range (0, lhs << rhs );
376 ~~~~^~~~~~
377 { dg-end-multiline-output "" } */
378
379 __emit_expression_range (0, lhs >> rhs ); /* { dg-warning "range" } */
380 /* { dg-begin-multiline-output "" }
381 __emit_expression_range (0, lhs >> rhs );
382 ~~~~^~~~~~
383 { dg-end-multiline-output "" } */
384 }
385
386 void test_relational_operators (int lhs, int rhs)
387 {
388 __emit_expression_range (0, lhs < rhs ); /* { dg-warning "range" } */
389 /* { dg-begin-multiline-output "" }
390 __emit_expression_range (0, lhs < rhs );
391 ~~~~^~~~~
392 { dg-end-multiline-output "" } */
393
394 __emit_expression_range (0, lhs > rhs ); /* { dg-warning "range" } */
395 /* { dg-begin-multiline-output "" }
396 __emit_expression_range (0, lhs > rhs );
397 ~~~~^~~~~
398 { dg-end-multiline-output "" } */
399
400 __emit_expression_range (0, lhs <= rhs ); /* { dg-warning "range" } */
401 /* { dg-begin-multiline-output "" }
402 __emit_expression_range (0, lhs <= rhs );
403 ~~~~^~~~~~
404 { dg-end-multiline-output "" } */
405
406 __emit_expression_range (0, lhs >= rhs ); /* { dg-warning "range" } */
407 /* { dg-begin-multiline-output "" }
408 __emit_expression_range (0, lhs >= rhs );
409 ~~~~^~~~~~
410 { dg-end-multiline-output "" } */
411 }
412
413 void test_equality_operators (int lhs, int rhs)
414 {
415 __emit_expression_range (0, lhs == rhs ); /* { dg-warning "range" } */
416 /* { dg-begin-multiline-output "" }
417 __emit_expression_range (0, lhs == rhs );
418 ~~~~^~~~~~
419 { dg-end-multiline-output "" } */
420
421 __emit_expression_range (0, lhs != rhs ); /* { dg-warning "range" } */
422 /* { dg-begin-multiline-output "" }
423 __emit_expression_range (0, lhs != rhs );
424 ~~~~^~~~~~
425 { dg-end-multiline-output "" } */
426 }
427
428 void test_bitwise_binary_operators (int lhs, int rhs)
429 {
430 __emit_expression_range (0, lhs & rhs ); /* { dg-warning "range" } */
431 /* { dg-begin-multiline-output "" }
432 __emit_expression_range (0, lhs & rhs );
433 ~~~~^~~~~
434 { dg-end-multiline-output "" } */
435
436 __emit_expression_range (0, lhs ^ rhs ); /* { dg-warning "range" } */
437 /* { dg-begin-multiline-output "" }
438 __emit_expression_range (0, lhs ^ rhs );
439 ~~~~^~~~~
440 { dg-end-multiline-output "" } */
441
442 __emit_expression_range (0, lhs | rhs ); /* { dg-warning "range" } */
443 /* { dg-begin-multiline-output "" }
444 __emit_expression_range (0, lhs | rhs );
445 ~~~~^~~~~
446 { dg-end-multiline-output "" } */
447 }
448
449 void test_logical_operators (int lhs, int rhs)
450 {
451 __emit_expression_range (0, lhs && rhs ); /* { dg-warning "range" } */
452 /* { dg-begin-multiline-output "" }
453 __emit_expression_range (0, lhs && rhs );
454 ~~~~^~~~~~
455 { dg-end-multiline-output "" } */
456
457 __emit_expression_range (0, lhs || rhs ); /* { dg-warning "range" } */
458 /* { dg-begin-multiline-output "" }
459 __emit_expression_range (0, lhs || rhs );
460 ~~~~^~~~~~
461 { dg-end-multiline-output "" } */
462 }
463
464 /* Conditional operator. *******************************************/
465
466 void test_conditional_operators (int flag, int on_true, int on_false)
467 {
468 __emit_expression_range (0, flag ? on_true : on_false ); /* { dg-warning "range" } */
469 /* { dg-begin-multiline-output "" }
470 __emit_expression_range (0, flag ? on_true : on_false );
471 ~~~~~^~~~~~~~~~~~~~~~~~~~
472 { dg-end-multiline-output "" } */
473 }
474
475 /* Assignment expressions. *******************************************/
476
477 void test_assignment_expressions (int dest, int other)
478 {
479 __emit_expression_range (0, dest = other ); /* { dg-warning "range" } */
480 /* { dg-begin-multiline-output "" }
481 __emit_expression_range (0, dest = other );
482 ~~~~~^~~~~~~
483 { dg-end-multiline-output "" } */
484
485 __emit_expression_range (0, dest *= other ); /* { dg-warning "range" } */
486 /* { dg-begin-multiline-output "" }
487 __emit_expression_range (0, dest *= other );
488 ~~~~~^~~~~~~~
489 { dg-end-multiline-output "" } */
490
491 __emit_expression_range (0, dest /= other ); /* { dg-warning "range" } */
492 /* { dg-begin-multiline-output "" }
493 __emit_expression_range (0, dest /= other );
494 ~~~~~^~~~~~~~
495 { dg-end-multiline-output "" } */
496
497 __emit_expression_range (0, dest %= other ); /* { dg-warning "range" } */
498 /* { dg-begin-multiline-output "" }
499 __emit_expression_range (0, dest %= other );
500 ~~~~~^~~~~~~~
501 { dg-end-multiline-output "" } */
502
503 __emit_expression_range (0, dest += other ); /* { dg-warning "range" } */
504 /* { dg-begin-multiline-output "" }
505 __emit_expression_range (0, dest += other );
506 ~~~~~^~~~~~~~
507 { dg-end-multiline-output "" } */
508
509 __emit_expression_range (0, dest -= other ); /* { dg-warning "range" } */
510 /* { dg-begin-multiline-output "" }
511 __emit_expression_range (0, dest -= other );
512 ~~~~~^~~~~~~~
513 { dg-end-multiline-output "" } */
514
515 __emit_expression_range (0, dest <<= other ); /* { dg-warning "range" } */
516 /* { dg-begin-multiline-output "" }
517 __emit_expression_range (0, dest <<= other );
518 ~~~~~^~~~~~~~~
519 { dg-end-multiline-output "" } */
520
521 __emit_expression_range (0, dest >>= other ); /* { dg-warning "range" } */
522 /* { dg-begin-multiline-output "" }
523 __emit_expression_range (0, dest >>= other );
524 ~~~~~^~~~~~~~~
525 { dg-end-multiline-output "" } */
526
527 __emit_expression_range (0, dest &= other ); /* { dg-warning "range" } */
528 /* { dg-begin-multiline-output "" }
529 __emit_expression_range (0, dest &= other );
530 ~~~~~^~~~~~~~
531 { dg-end-multiline-output "" } */
532
533 __emit_expression_range (0, dest ^= other ); /* { dg-warning "range" } */
534 /* { dg-begin-multiline-output "" }
535 __emit_expression_range (0, dest ^= other );
536 ~~~~~^~~~~~~~
537 { dg-end-multiline-output "" } */
538
539 __emit_expression_range (0, dest |= other ); /* { dg-warning "range" } */
540 /* { dg-begin-multiline-output "" }
541 __emit_expression_range (0, dest |= other );
542 ~~~~~^~~~~~~~
543 { dg-end-multiline-output "" } */
544 }
545
546 /* Comma operator. *******************************************/
547
548 void test_comma_operator (int a, int b)
549 {
550 __emit_expression_range (0, (a++, a + b) ); /* { dg-warning "range" } */
551 /* { dg-begin-multiline-output "" }
552 __emit_expression_range (0, (a++, a + b) );
553 ~~~~^~~~~~~~
554 { dg-end-multiline-output "" } */
555 }
556
557 /* Literals. **************************************************/
558
559 void test_string_literals ()
560 {
561 __emit_expression_range (0, "0123456789"); /* { dg-warning "range" } */
562 /* { dg-begin-multiline-output "" }
563 __emit_expression_range (0, "0123456789");
564 ^~~~~~~~~~~~
565 { dg-end-multiline-output "" } */
566
567 __emit_expression_range (0, "foo" "bar" ); /* { dg-warning "range" } */
568 /* { dg-begin-multiline-output "" }
569 __emit_expression_range (0, "foo" "bar" );
570 ^~~~~~~~~~~
571 { dg-end-multiline-output "" } */
572 }
573
574 void test_numeric_literals (int i)
575 {
576 __emit_expression_range (0, 42 ); /* { dg-warning "range" } */
577 /* { dg-begin-multiline-output "" }
578 __emit_expression_range (0, 42 );
579 ^~
580 { dg-end-multiline-output "" } */
581
582 /* Verify locations of negative literals (via folding of
583 unary negation). */
584
585 __emit_expression_range (0, -42 ); /* { dg-warning "range" } */
586 /* { dg-begin-multiline-output "" }
587 __emit_expression_range (0, -42 );
588 ^~~
589 { dg-end-multiline-output "" } */
590
591 __emit_expression_range (0, i ? 0 : -1 ); /* { dg-warning "range" } */
592 /* { dg-begin-multiline-output "" }
593 __emit_expression_range (0, i ? 0 : -1 );
594 ~~^~~~~~~~
595 { dg-end-multiline-output "" } */
596 }
597
598 /* Braced initializers. ***************************************/
599
600 /* We can't test the ranges of these directly, since the underlying
601 tree nodes don't retain a location. However, we can test that they
602 have ranges during parsing by building compound expressions using
603 them, and verifying the ranges of the compound expressions. */
604
605 #define vector(elcount, type) \
606 __attribute__((vector_size((elcount)*sizeof(type)))) type
607
608 void test_braced_init (void)
609 {
610 /* Verify start of range. */
611 __emit_expression_range (0, (vector(4, float)){2., 2., 2., 2.} + 1); /* { dg-warning "range" } */
612 /* { dg-begin-multiline-output "" }
613 __emit_expression_range (0, (vector(4, float)){2., 2., 2., 2.} + 1);
614 ~~~~~~~~~~~~~~~~~^~~
615 { dg-end-multiline-output "" } */
616
617 /* Verify end of range. */
618 __emit_expression_range (0, 1 + (vector(4, float)){2., 2., 2., 2.}); /* { dg-warning "range" } */
619 /* { dg-begin-multiline-output "" }
620 __emit_expression_range (0, 1 + (vector(4, float)){2., 2., 2., 2.});
621 ~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
622 { dg-end-multiline-output "" } */
623 }
624
625 /* Statement expressions. ***************************************/
626
627 void test_statement_expression (void)
628 {
629 __emit_expression_range (0, ({ static int a; a; }) + 1); /* { dg-warning "range" } */
630 /* { dg-begin-multiline-output "" }
631 __emit_expression_range (0, ({ static int a; a; }) + 1);
632 ~~~~~~~~~~~~~~~~~~~~~~~^~~
633 { dg-end-multiline-output "" } */
634
635 __emit_expression_range (0, 1 + ({ static int a; a; }) ); /* { dg-warning "range" } */
636 /* { dg-begin-multiline-output "" }
637 __emit_expression_range (0, 1 + ({ static int a; a; }) );
638 ~~^~~~~~~~~~~~~~~~~~~~~~~~
639 { dg-end-multiline-output "" } */
640 }
641
642 /* Other expressions. */
643
644 void test_address_of_label (void)
645 {
646 label:
647 __emit_expression_range (0, &&label ); /* { dg-warning "range" } */
648 /* { dg-begin-multiline-output "" }
649 __emit_expression_range (0, &&label );
650 ^~~~~~~
651 { dg-end-multiline-output "" } */
652 }
653
654 void test_transaction_expressions (void)
655 {
656 int i;
657 i = __transaction_atomic (42); /* { dg-error "without transactional memory support enabled" } */
658 /* { dg-begin-multiline-output "" }
659 i = __transaction_atomic (42);
660 ^~~~~~~~~~~~~~~~~~~~
661 { dg-end-multiline-output "" } */
662 i = __transaction_relaxed (42); /* { dg-error "without transactional memory support enabled" } */
663 /* { dg-begin-multiline-output "" }
664 i = __transaction_relaxed (42);
665 ^~~~~~~~~~~~~~~~~~~~~
666 { dg-end-multiline-output "" } */
667 }
668
669 void test_keywords (int i)
670 {
671 __emit_expression_range (0, __FUNCTION__[i] ); /* { dg-warning "range" } */
672 /* { dg-begin-multiline-output "" }
673 __emit_expression_range (0, __FUNCTION__[i] );
674 ~~~~~~~~~~~~~~^
675 { dg-end-multiline-output "" } */
676
677 __emit_expression_range (0, __PRETTY_FUNCTION__[i] ); /* { dg-warning "range" } */
678 /* { dg-begin-multiline-output "" }
679 __emit_expression_range (0, __PRETTY_FUNCTION__[i] );
680 ~~~~~~~~~~~~~~~~~~~~~^
681 { dg-end-multiline-output "" } */
682
683 __emit_expression_range (0, __func__[i] ); /* { dg-warning "range" } */
684 /* { dg-begin-multiline-output "" }
685 __emit_expression_range (0, __func__[i] );
686 ~~~~~~~~~~^
687 { dg-end-multiline-output "" } */
688 }
689
690 void test_builtin_va_arg (__builtin_va_list v)
691 {
692 __emit_expression_range (0, __builtin_va_arg (v, int) ); /* { dg-warning "range" } */
693 /* { dg-begin-multiline-output "" }
694 __emit_expression_range (0, __builtin_va_arg (v, int) );
695 ~~~~~~~~~~~~~~~~~~~~~^~~~
696 { dg-end-multiline-output "" } */
697
698 __emit_expression_range (0, __builtin_va_arg (v, int) + 1 ); /* { dg-warning "range" } */
699 /* { dg-begin-multiline-output "" }
700 __emit_expression_range (0, __builtin_va_arg (v, int) + 1 );
701 ~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
702 { dg-end-multiline-output "" } */
703 }
704
705 struct s { int i; float f; };
706
707 void test_builtin_offsetof (int i)
708 {
709 __emit_expression_range (0, __builtin_offsetof (struct s, f) ); /* { dg-warning "range" } */
710 /* { dg-begin-multiline-output "" }
711 __emit_expression_range (0, __builtin_offsetof (struct s, f) );
712 ~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~
713 { dg-end-multiline-output "" } */
714 }
715
716 /* Examples of non-trivial expressions. ****************************/
717
718 extern double sqrt (double x);
719
720 void test_quadratic (double a, double b, double c)
721 {
722 __emit_expression_range (0, b * b - 4 * a * c ); /* { dg-warning "range" } */
723 /* { dg-begin-multiline-output "" }
724 __emit_expression_range (0, b * b - 4 * a * c );
725 ~~~~~~^~~~~~~~~~~
726 { dg-end-multiline-output "" } */
727
728 __emit_expression_range (0,
729 (-b + sqrt (b * b - 4 * a * c))
730 / (2 * a)); /* { dg-warning "range" } */
731 /* { dg-begin-multiline-output "" }
732 (-b + sqrt (b * b - 4 * a * c))
733 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
734 / (2 * a));
735 ^~~~~~~~~
736 { dg-end-multiline-output "" } */
737
738 }
739
740 int bar (int);
741 void test_combinations (int a)
742 {
743 __emit_expression_range (0, bar (a) > a ); /* { dg-warning "range" } */
744 /* { dg-begin-multiline-output "" }
745 __emit_expression_range (0, bar (a) > a );
746 ~~~~~~~~^~~
747 { dg-end-multiline-output "" } */
748 }
749
750 /* C++-specific expresssions. ****************************************/
751
752 void test_cp_literal_keywords (int a, int b)
753 {
754 this; /* { dg-error "invalid use of 'this' in non-member function" } */
755 /* { dg-begin-multiline-output "" }
756 this;
757 ^~~~
758 { dg-end-multiline-output "" } */
759
760 }
761
762 class base {
763 public:
764 base ();
765 base (int i);
766 virtual ~base ();
767 int pub ();
768 private:
769 int priv ();
770 };
771 class derived : public base { ~derived (); };
772
773 void test_cp_casts (base *ptr)
774 {
775 __emit_expression_range (0, dynamic_cast <derived *> (ptr)); /* { dg-warning "range" } */
776 /* { dg-begin-multiline-output "" }
777 __emit_expression_range (0, dynamic_cast <derived *> (ptr));
778 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
779 { dg-end-multiline-output "" } */
780
781 __emit_expression_range (0, static_cast <derived *> (ptr)); /* { dg-warning "range" } */
782 /* { dg-begin-multiline-output "" }
783 __emit_expression_range (0, static_cast <derived *> (ptr));
784 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
785 { dg-end-multiline-output "" } */
786
787 __emit_expression_range (0, reinterpret_cast <int *> (ptr)); /* { dg-warning "range" } */
788 /* { dg-begin-multiline-output "" }
789 __emit_expression_range (0, reinterpret_cast <int *> (ptr));
790 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
791 { dg-end-multiline-output "" } */
792
793 __emit_expression_range (0, const_cast <base *> (ptr)); /* { dg-warning "range" } */
794 /* { dg-begin-multiline-output "" }
795 __emit_expression_range (0, const_cast <base *> (ptr));
796 ^~~~~~~~~~~~~~~~~~~~~~~~~
797 { dg-end-multiline-output "" } */
798 }
799
800 void test_functional_casts (int i, float f)
801 {
802 __emit_expression_range (0, float(i)); /* { dg-warning "range" } */
803 /* { dg-begin-multiline-output "" }
804 __emit_expression_range (0, float(i));
805 ^~~~~~~~
806 { dg-end-multiline-output "" } */
807
808 __emit_expression_range (0, int(f)); /* { dg-warning "range" } */
809 /* { dg-begin-multiline-output "" }
810 __emit_expression_range (0, int(f));
811 ^~~~~~
812 { dg-end-multiline-output "" } */
813
814 __emit_expression_range (0, s{i, f}); /* { dg-warning "range" } */
815 /* { dg-begin-multiline-output "" }
816 __emit_expression_range (0, s{i, f});
817 ^~~~~~~
818 { dg-end-multiline-output "" } */
819 }
820
821 template <typename TYPENAME>
822 class example_template
823 {
824 public:
825 example_template (TYPENAME v);
826 };
827
828 void test_template_id (void)
829 {
830 example_template <int>; /* { dg-warning "declaration does not declare anything" } */
831 /* { dg-begin-multiline-output "" }
832 example_template <int>;
833 ^~~~~~~~~~~~~~~~~~~~~~
834 { dg-end-multiline-output "" } */
835 }
836
837 void test_new (void)
838 {
839 __emit_expression_range (0, ::new base); /* { dg-warning "range" } */
840 /* { dg-begin-multiline-output "" }
841 __emit_expression_range (0, ::new base);
842 ^~~~~~~~~~
843 { dg-end-multiline-output "" } */
844
845 __emit_expression_range (0, new base); /* { dg-warning "range" } */
846 /* { dg-begin-multiline-output "" }
847 __emit_expression_range (0, new base);
848 ^~~~~~~~
849 { dg-end-multiline-output "" } */
850
851 __emit_expression_range (0, new (base)); /* { dg-warning "range" } */
852 /* { dg-begin-multiline-output "" }
853 __emit_expression_range (0, new (base));
854 ^~~~~~~~~~
855 { dg-end-multiline-output "" } */
856
857 __emit_expression_range (0, new base (42)); /* { dg-warning "range" } */
858 /* { dg-begin-multiline-output "" }
859 __emit_expression_range (0, new base (42));
860 ^~~~~~~~~~~~~
861 { dg-end-multiline-output "" } */
862
863 __emit_expression_range (0, new (base) (42)); /* { dg-warning "range" } */
864 /* { dg-begin-multiline-output "" }
865 __emit_expression_range (0, new (base) (42));
866 ^~~~~~~~~~~~~~~
867 { dg-end-multiline-output "" } */
868
869 /* TODO: placement new. */
870
871 __emit_expression_range (0, new example_template<int> (42)); /* { dg-warning "range" } */
872 /* { dg-begin-multiline-output "" }
873 __emit_expression_range (0, new example_template<int> (42));
874 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
875 { dg-end-multiline-output "" } */
876 }
877
878 void test_methods ()
879 {
880 __emit_expression_range (0, ((base *)1)->pub () ); /* { dg-warning "range" } */
881 /* { dg-begin-multiline-output "" }
882 __emit_expression_range (0, ((base *)1)->pub () );
883 ~~~~~~~~~~~~~~~~~^~
884 { dg-end-multiline-output "" } */
885
886 ((base *)1)->priv (); // { dg-error " is private " }
887 /* { dg-begin-multiline-output "" }
888 ((base *)1)->priv ();
889 ^
890 { dg-end-multiline-output "" }
891 { dg-begin-multiline-output "" }
892 int priv ();
893 ^~~~
894 { dg-end-multiline-output "" } */
895 }
896
897 class tests
898 {
899 public:
900 void test_method_calls ();
901 int some_method () const;
902 };
903
904 void
905 tests::test_method_calls ()
906 {
907 __emit_expression_range (0, this->some_method () ); /* { dg-warning "range" } */
908 /* { dg-begin-multiline-output "" }
909 __emit_expression_range (0, this->some_method () );
910 ~~~~~~~~~~~~~~~~~~^~
911 { dg-end-multiline-output "" } */
912 }
913
914 namespace std
915 {
916 class type_info { public: int foo; };
917 }
918
919 void test_typeid (int i)
920 {
921 __emit_expression_range (0, typeid(i)); /* { dg-warning "range" } */
922 /* { dg-begin-multiline-output "" }
923 __emit_expression_range (0, typeid(i));
924 ^~~~~~~~~
925 { dg-end-multiline-output "" } */
926
927 __emit_expression_range (0, typeid(int)); /* { dg-warning "range" } */
928 /* { dg-begin-multiline-output "" }
929 __emit_expression_range (0, typeid(int));
930 ^~~~~~~~~~~
931 { dg-end-multiline-output "" } */
932
933 __emit_expression_range (0, typeid(i * 2)); /* { dg-warning "range" } */
934 /* { dg-begin-multiline-output "" }
935 __emit_expression_range (0, typeid(i * 2));
936 ^~~~~~~~~~~~~
937 { dg-end-multiline-output "" } */
938 }
939
940 /* Various tests of locations involving macros. */
941
942 void test_within_macro_1 (int lhs, int rhs)
943 {
944 #define MACRO_1(EXPR) EXPR
945
946 __emit_expression_range (0, MACRO_1 (lhs == rhs));
947
948 /* { dg-warning "range" "" { target *-*-* } .-2 } */
949 /* { dg-begin-multiline-output "" }
950 __emit_expression_range (0, MACRO_1 (lhs == rhs));
951 ~~~~^~~~~~
952 { dg-end-multiline-output "" } */
953 /* { dg-begin-multiline-output "" }
954 #define MACRO_1(EXPR) EXPR
955 ^~~~
956 { dg-end-multiline-output "" } */
957
958 #undef MACRO_1
959 }
960
961 void test_within_macro_2 (int lhs, int rhs)
962 {
963 #define MACRO_2(EXPR) EXPR
964
965 __emit_expression_range (0, MACRO_2 (MACRO_2 (lhs == rhs)));
966
967 /* { dg-warning "range" "" { target *-*-* } .-2 } */
968 /* { dg-begin-multiline-output "" }
969 __emit_expression_range (0, MACRO_2 (MACRO_2 (lhs == rhs)));
970 ~~~~^~~~~~
971 { dg-end-multiline-output "" } */
972 /* { dg-begin-multiline-output "" }
973 __emit_expression_range (0, MACRO_2 (MACRO_2 (lhs == rhs)));
974 ^~~~~~~
975 { dg-end-multiline-output "" } */
976 /* { dg-begin-multiline-output "" }
977 #define MACRO_2(EXPR) EXPR
978 ^~~~
979 { dg-end-multiline-output "" } */
980
981 #undef MACRO_2
982 }
983
984 void test_within_macro_3 (int lhs, int rhs)
985 {
986 #define MACRO_3(EXPR) EXPR
987
988 __emit_expression_range (0, MACRO_3 (lhs) == MACRO_3 (rhs));
989
990 /* { dg-warning "range" "" { target *-*-* } .-2 } */
991 /* { dg-begin-multiline-output "" }
992 __emit_expression_range (0, MACRO_3 (lhs) == MACRO_3 (rhs));
993 ^
994 { dg-end-multiline-output "" } */
995
996 #undef MACRO_3
997 }
998
999 void test_within_macro_4 (int lhs, int rhs)
1000 {
1001 #define MACRO_4(EXPR) EXPR
1002
1003 __emit_expression_range (0, MACRO_4 (MACRO_4 (lhs) == MACRO_4 (rhs)));
1004
1005 /* { dg-warning "range" "" { target *-*-* } .-2 } */
1006 /* { dg-begin-multiline-output "" }
1007 __emit_expression_range (0, MACRO_4 (MACRO_4 (lhs) == MACRO_4 (rhs)));
1008 ^
1009 { dg-end-multiline-output "" } */
1010 /* { dg-begin-multiline-output "" }
1011 #define MACRO_4(EXPR) EXPR
1012 ^~~~
1013 { dg-end-multiline-output "" } */
1014
1015 #undef MACRO_4
1016 }