1 /* { dg-do compile } */
2 /* { dg-options "-O -fdiagnostics-show-caret -fpermissive" } */
4 /* This is a collection of unittests to verify that we're correctly
5 capturing the source code ranges of various kinds of expression.
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.
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. */
18 extern void __emit_expression_range (int dummy, ...);
22 void test_global (void)
24 __emit_expression_range (0, global); /* { dg-warning "range" } */
25 /* { dg-begin-multiline-output "" }
26 __emit_expression_range (0, global);
28 { dg-end-multiline-output "" } */
31 void test_param (int param)
33 __emit_expression_range (0, param); /* { dg-warning "range" } */
34 /* { dg-begin-multiline-output "" }
35 __emit_expression_range (0, param);
37 { dg-end-multiline-output "" } */
40 void test_local (void)
44 __emit_expression_range (0, local); /* { dg-warning "range" } */
45 /* { dg-begin-multiline-output "" }
46 __emit_expression_range (0, local);
48 { dg-end-multiline-output "" } */
51 void test_integer_constants (void)
53 __emit_expression_range (0, 1234); /* { dg-warning "range" } */
54 /* { dg-begin-multiline-output "" }
55 __emit_expression_range (0, 1234);
57 { dg-end-multiline-output "" } */
59 /* Ensure that zero works. */
61 __emit_expression_range (0, 0); /* { dg-warning "range" } */
62 /* { dg-begin-multiline-output "" }
63 __emit_expression_range (0, 0);
65 { dg-end-multiline-output "" } */
68 void test_character_constants (void)
70 __emit_expression_range (0, 'a'); /* { dg-warning "range" } */
71 /* { dg-begin-multiline-output "" }
72 __emit_expression_range (0, 'a');
74 { dg-end-multiline-output "" } */
77 void test_floating_constants (void)
79 __emit_expression_range (0, 98.6); /* { dg-warning "range" } */
80 /* { dg-begin-multiline-output "" }
81 __emit_expression_range (0, 98.6);
83 { dg-end-multiline-output "" } */
85 __emit_expression_range (0, .6); /* { dg-warning "range" } */
86 /* { dg-begin-multiline-output "" }
87 __emit_expression_range (0, .6);
89 { dg-end-multiline-output "" } */
91 __emit_expression_range (0, 98.); /* { dg-warning "range" } */
92 /* { dg-begin-multiline-output "" }
93 __emit_expression_range (0, 98.);
95 { dg-end-multiline-output "" } */
97 __emit_expression_range (0, 6.022140857e23 ); /* { dg-warning "range" } */
98 /* { dg-begin-multiline-output "" }
99 __emit_expression_range (0, 6.022140857e23 );
101 { dg-end-multiline-output "" } */
103 __emit_expression_range (0, 98.6f ); /* { dg-warning "range" } */
104 /* { dg-begin-multiline-output "" }
105 __emit_expression_range (0, 98.6f );
107 { dg-end-multiline-output "" } */
109 __emit_expression_range (0, 6.022140857e23l ); /* { dg-warning "range" } */
110 /* { dg-begin-multiline-output "" }
111 __emit_expression_range (0, 6.022140857e23l );
113 { dg-end-multiline-output "" } */
120 void test_enumeration_constant (void)
122 __emit_expression_range (0, TEST_ENUM_VALUE ); /* { dg-warning "range" } */
123 /* { dg-begin-multiline-output "" }
124 __emit_expression_range (0, TEST_ENUM_VALUE );
126 { dg-end-multiline-output "" } */
129 void test_parentheses (int a, int b)
131 __emit_expression_range (0, (a + b) ); /* { dg-warning "range" } */
132 /* { dg-begin-multiline-output "" }
133 __emit_expression_range (0, (a + b) );
135 { dg-end-multiline-output "" } */
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) );
141 { dg-end-multiline-output "" } */
143 __emit_expression_range (0, !(a && b) ); /* { dg-warning "range" } */
144 /* { dg-begin-multiline-output "" }
145 __emit_expression_range (0, !(a && b) );
147 { dg-end-multiline-output "" } */
150 /* Postfix expressions. ************************************************/
152 void test_array_reference (int *arr)
154 __emit_expression_range (0, arr[100] ); /* { dg-warning "range" } */
155 /* { dg-begin-multiline-output "" }
156 __emit_expression_range (0, arr[100] );
158 { dg-end-multiline-output "" } */
161 int test_function_call (int p, int q, int r)
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 "" } */
176 void test_structure_references (struct test_struct *ptr)
178 struct test_struct local;
181 __emit_expression_range (0, local.field ); /* { dg-warning "range" } */
182 /* { dg-begin-multiline-output "" }
183 __emit_expression_range (0, local.field );
185 { dg-end-multiline-output "" } */
187 __emit_expression_range (0, ptr->field ); /* { dg-warning "range" } */
188 /* { dg-begin-multiline-output "" }
189 __emit_expression_range (0, ptr->field );
191 { dg-end-multiline-output "" } */
194 void test_postfix_incdec (int i)
196 __emit_expression_range (0, i++ ); /* { dg-warning "range" } */
197 /* { dg-begin-multiline-output "" }
198 __emit_expression_range (0, i++ );
200 { dg-end-multiline-output "" } */
202 __emit_expression_range (0, i-- ); /* { dg-warning "range" } */
203 /* { dg-begin-multiline-output "" }
204 __emit_expression_range (0, i-- );
206 { dg-end-multiline-output "" } */
209 /* Unary operators. ****************************************************/
211 void test_sizeof (int i)
213 __emit_expression_range (0, sizeof i ); /* { dg-warning "range" } */
214 /* { dg-begin-multiline-output "" }
215 __emit_expression_range (0, sizeof i );
217 { dg-end-multiline-output "" } */
219 __emit_expression_range (0, sizeof (char) ); /* { dg-warning "range" } */
220 /* { dg-begin-multiline-output "" }
221 __emit_expression_range (0, sizeof (char) );
223 { dg-end-multiline-output "" } */
226 void test_alignof (int i)
228 __emit_expression_range (0, alignof(int)); /* { dg-warning "range" } */
229 /* { dg-begin-multiline-output "" }
230 __emit_expression_range (0, alignof(int));
232 { dg-end-multiline-output "" } */
234 __emit_expression_range (0, __alignof__(int)); /* { dg-warning "range" } */
235 /* { dg-begin-multiline-output "" }
236 __emit_expression_range (0, __alignof__(int));
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);
243 { dg-end-multiline-output "" } */
246 void test_prefix_incdec (int i)
248 __emit_expression_range (0, ++i ); /* { dg-warning "range" } */
249 /* { dg-begin-multiline-output "" }
250 __emit_expression_range (0, ++i );
252 { dg-end-multiline-output "" } */
254 __emit_expression_range (0, --i ); /* { dg-warning "range" } */
255 /* { dg-begin-multiline-output "" }
256 __emit_expression_range (0, --i );
258 { dg-end-multiline-output "" } */
261 void test_address_operator (void)
263 __emit_expression_range (0, &global ); /* { dg-warning "range" } */
264 /* { dg-begin-multiline-output "" }
265 __emit_expression_range (0, &global );
267 { dg-end-multiline-output "" } */
270 void test_indirection (int *ptr)
272 __emit_expression_range (0, *ptr ); /* { dg-warning "range" } */
273 /* { dg-begin-multiline-output "" }
274 __emit_expression_range (0, *ptr );
276 { dg-end-multiline-output "" } */
279 void test_unary_plus (int i)
281 __emit_expression_range (0, +i ); /* { dg-warning "range" } */
282 /* { dg-begin-multiline-output "" }
283 __emit_expression_range (0, +i );
285 { dg-end-multiline-output "" } */
288 void test_unary_minus (int i)
290 __emit_expression_range (0, -i ); /* { dg-warning "range" } */
291 /* { dg-begin-multiline-output "" }
292 __emit_expression_range (0, -i );
294 { dg-end-multiline-output "" } */
297 void test_ones_complement (int i)
299 __emit_expression_range (0, ~i ); /* { dg-warning "range" } */
300 /* { dg-begin-multiline-output "" }
301 __emit_expression_range (0, ~i );
303 { dg-end-multiline-output "" } */
306 void test_logical_negation (int flag)
308 __emit_expression_range (0, !flag ); /* { dg-warning "range" } */
309 /* { dg-begin-multiline-output "" }
310 __emit_expression_range (0, !flag );
312 { dg-end-multiline-output "" } */
315 /* Casts. ****************************************************/
317 void test_cast (void *ptr)
319 __emit_expression_range (0, (int *)ptr ); /* { dg-warning "range" } */
320 /* { dg-begin-multiline-output "" }
321 __emit_expression_range (0, (int *)ptr );
323 { dg-end-multiline-output "" } */
325 __emit_expression_range (0, *(int *)0xdeadbeef ); /* { dg-warning "range" } */
326 /* { dg-begin-multiline-output "" }
327 __emit_expression_range (0, *(int *)0xdeadbeef );
329 { dg-end-multiline-output "" } */
333 /* Binary operators. *******************************************/
335 void test_multiplicative_operators (int lhs, int rhs)
337 __emit_expression_range (0, lhs * rhs ); /* { dg-warning "range" } */
338 /* { dg-begin-multiline-output "" }
339 __emit_expression_range (0, lhs * rhs );
341 { dg-end-multiline-output "" } */
343 __emit_expression_range (0, lhs / rhs ); /* { dg-warning "range" } */
344 /* { dg-begin-multiline-output "" }
345 __emit_expression_range (0, lhs / rhs );
347 { dg-end-multiline-output "" } */
349 __emit_expression_range (0, lhs % rhs ); /* { dg-warning "range" } */
350 /* { dg-begin-multiline-output "" }
351 __emit_expression_range (0, lhs % rhs );
353 { dg-end-multiline-output "" } */
356 void test_additive_operators (int lhs, int rhs)
358 __emit_expression_range (0, lhs + rhs ); /* { dg-warning "range" } */
359 /* { dg-begin-multiline-output "" }
360 __emit_expression_range (0, lhs + rhs );
362 { dg-end-multiline-output "" } */
364 __emit_expression_range (0, lhs - rhs ); /* { dg-warning "range" } */
365 /* { dg-begin-multiline-output "" }
366 __emit_expression_range (0, lhs - rhs );
368 { dg-end-multiline-output "" } */
371 void test_shift_operators (int lhs, int rhs)
373 __emit_expression_range (0, lhs << rhs ); /* { dg-warning "range" } */
374 /* { dg-begin-multiline-output "" }
375 __emit_expression_range (0, lhs << rhs );
377 { dg-end-multiline-output "" } */
379 __emit_expression_range (0, lhs >> rhs ); /* { dg-warning "range" } */
380 /* { dg-begin-multiline-output "" }
381 __emit_expression_range (0, lhs >> rhs );
383 { dg-end-multiline-output "" } */
386 void test_relational_operators (int lhs, int rhs)
388 __emit_expression_range (0, lhs < rhs ); /* { dg-warning "range" } */
389 /* { dg-begin-multiline-output "" }
390 __emit_expression_range (0, lhs < rhs );
392 { dg-end-multiline-output "" } */
394 __emit_expression_range (0, lhs > rhs ); /* { dg-warning "range" } */
395 /* { dg-begin-multiline-output "" }
396 __emit_expression_range (0, lhs > rhs );
398 { dg-end-multiline-output "" } */
400 __emit_expression_range (0, lhs <= rhs ); /* { dg-warning "range" } */
401 /* { dg-begin-multiline-output "" }
402 __emit_expression_range (0, lhs <= rhs );
404 { dg-end-multiline-output "" } */
406 __emit_expression_range (0, lhs >= rhs ); /* { dg-warning "range" } */
407 /* { dg-begin-multiline-output "" }
408 __emit_expression_range (0, lhs >= rhs );
410 { dg-end-multiline-output "" } */
413 void test_equality_operators (int lhs, int rhs)
415 __emit_expression_range (0, lhs == rhs ); /* { dg-warning "range" } */
416 /* { dg-begin-multiline-output "" }
417 __emit_expression_range (0, lhs == rhs );
419 { dg-end-multiline-output "" } */
421 __emit_expression_range (0, lhs != rhs ); /* { dg-warning "range" } */
422 /* { dg-begin-multiline-output "" }
423 __emit_expression_range (0, lhs != rhs );
425 { dg-end-multiline-output "" } */
428 void test_bitwise_binary_operators (int lhs, int rhs)
430 __emit_expression_range (0, lhs & rhs ); /* { dg-warning "range" } */
431 /* { dg-begin-multiline-output "" }
432 __emit_expression_range (0, lhs & rhs );
434 { dg-end-multiline-output "" } */
436 __emit_expression_range (0, lhs ^ rhs ); /* { dg-warning "range" } */
437 /* { dg-begin-multiline-output "" }
438 __emit_expression_range (0, lhs ^ rhs );
440 { dg-end-multiline-output "" } */
442 __emit_expression_range (0, lhs | rhs ); /* { dg-warning "range" } */
443 /* { dg-begin-multiline-output "" }
444 __emit_expression_range (0, lhs | rhs );
446 { dg-end-multiline-output "" } */
449 void test_logical_operators (int lhs, int rhs)
451 __emit_expression_range (0, lhs && rhs ); /* { dg-warning "range" } */
452 /* { dg-begin-multiline-output "" }
453 __emit_expression_range (0, lhs && rhs );
455 { dg-end-multiline-output "" } */
457 __emit_expression_range (0, lhs || rhs ); /* { dg-warning "range" } */
458 /* { dg-begin-multiline-output "" }
459 __emit_expression_range (0, lhs || rhs );
461 { dg-end-multiline-output "" } */
464 /* Conditional operator. *******************************************/
466 void test_conditional_operators (int flag, int on_true, int on_false)
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 "" } */
475 /* Assignment expressions. *******************************************/
477 void test_assignment_expressions (int dest, int other)
479 __emit_expression_range (0, dest = other ); /* { dg-warning "range" } */
480 /* { dg-begin-multiline-output "" }
481 __emit_expression_range (0, dest = other );
483 { dg-end-multiline-output "" } */
485 __emit_expression_range (0, dest *= other ); /* { dg-warning "range" } */
486 /* { dg-begin-multiline-output "" }
487 __emit_expression_range (0, dest *= other );
489 { dg-end-multiline-output "" } */
491 __emit_expression_range (0, dest /= other ); /* { dg-warning "range" } */
492 /* { dg-begin-multiline-output "" }
493 __emit_expression_range (0, dest /= other );
495 { dg-end-multiline-output "" } */
497 __emit_expression_range (0, dest %= other ); /* { dg-warning "range" } */
498 /* { dg-begin-multiline-output "" }
499 __emit_expression_range (0, dest %= other );
501 { dg-end-multiline-output "" } */
503 __emit_expression_range (0, dest += other ); /* { dg-warning "range" } */
504 /* { dg-begin-multiline-output "" }
505 __emit_expression_range (0, dest += other );
507 { dg-end-multiline-output "" } */
509 __emit_expression_range (0, dest -= other ); /* { dg-warning "range" } */
510 /* { dg-begin-multiline-output "" }
511 __emit_expression_range (0, dest -= other );
513 { dg-end-multiline-output "" } */
515 __emit_expression_range (0, dest <<= other ); /* { dg-warning "range" } */
516 /* { dg-begin-multiline-output "" }
517 __emit_expression_range (0, dest <<= other );
519 { dg-end-multiline-output "" } */
521 __emit_expression_range (0, dest >>= other ); /* { dg-warning "range" } */
522 /* { dg-begin-multiline-output "" }
523 __emit_expression_range (0, dest >>= other );
525 { dg-end-multiline-output "" } */
527 __emit_expression_range (0, dest &= other ); /* { dg-warning "range" } */
528 /* { dg-begin-multiline-output "" }
529 __emit_expression_range (0, dest &= other );
531 { dg-end-multiline-output "" } */
533 __emit_expression_range (0, dest ^= other ); /* { dg-warning "range" } */
534 /* { dg-begin-multiline-output "" }
535 __emit_expression_range (0, dest ^= other );
537 { dg-end-multiline-output "" } */
539 __emit_expression_range (0, dest |= other ); /* { dg-warning "range" } */
540 /* { dg-begin-multiline-output "" }
541 __emit_expression_range (0, dest |= other );
543 { dg-end-multiline-output "" } */
546 /* Comma operator. *******************************************/
548 void test_comma_operator (int a, int b)
550 __emit_expression_range (0, (a++, a + b) ); /* { dg-warning "range" } */
551 /* { dg-begin-multiline-output "" }
552 __emit_expression_range (0, (a++, a + b) );
554 { dg-end-multiline-output "" } */
557 /* Literals. **************************************************/
559 void test_string_literals ()
561 __emit_expression_range (0, "0123456789"); /* { dg-warning "range" } */
562 /* { dg-begin-multiline-output "" }
563 __emit_expression_range (0, "0123456789");
565 { dg-end-multiline-output "" } */
567 __emit_expression_range (0, "foo" "bar" ); /* { dg-warning "range" } */
568 /* { dg-begin-multiline-output "" }
569 __emit_expression_range (0, "foo" "bar" );
571 { dg-end-multiline-output "" } */
574 void test_numeric_literals (int i)
576 __emit_expression_range (0, 42 ); /* { dg-warning "range" } */
577 /* { dg-begin-multiline-output "" }
578 __emit_expression_range (0, 42 );
580 { dg-end-multiline-output "" } */
582 /* Verify locations of negative literals (via folding of
585 __emit_expression_range (0, -42 ); /* { dg-warning "range" } */
586 /* { dg-begin-multiline-output "" }
587 __emit_expression_range (0, -42 );
589 { dg-end-multiline-output "" } */
591 __emit_expression_range (0, i ? 0 : -1 ); /* { dg-warning "range" } */
592 /* { dg-begin-multiline-output "" }
593 __emit_expression_range (0, i ? 0 : -1 );
595 { dg-end-multiline-output "" } */
598 /* Braced initializers. ***************************************/
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. */
605 #define vector(elcount, type) \
606 __attribute__((vector_size((elcount)*sizeof(type)))) type
608 void test_braced_init (void)
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);
615 { dg-end-multiline-output "" } */
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 "" } */
625 /* Statement expressions. ***************************************/
627 void test_statement_expression (void)
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 "" } */
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 "" } */
642 /* Other expressions. */
644 void test_address_of_label (void)
647 __emit_expression_range (0, &&label ); /* { dg-warning "range" } */
648 /* { dg-begin-multiline-output "" }
649 __emit_expression_range (0, &&label );
651 { dg-end-multiline-output "" } */
654 void test_transaction_expressions (void)
657 i = __transaction_atomic (42); /* { dg-error "without transactional memory support enabled" } */
658 /* { dg-begin-multiline-output "" }
659 i = __transaction_atomic (42);
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 "" } */
669 void test_keywords (int i)
671 __emit_expression_range (0, __FUNCTION__[i] ); /* { dg-warning "range" } */
672 /* { dg-begin-multiline-output "" }
673 __emit_expression_range (0, __FUNCTION__[i] );
675 { dg-end-multiline-output "" } */
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 "" } */
683 __emit_expression_range (0, __func__[i] ); /* { dg-warning "range" } */
684 /* { dg-begin-multiline-output "" }
685 __emit_expression_range (0, __func__[i] );
687 { dg-end-multiline-output "" } */
690 void test_builtin_va_arg (__builtin_va_list v)
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 "" } */
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 "" } */
705 struct s { int i; float f; };
707 void test_builtin_offsetof (int i)
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 "" } */
716 /* Examples of non-trivial expressions. ****************************/
718 extern double sqrt (double x);
720 void test_quadratic (double a, double b, double c)
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 );
726 { dg-end-multiline-output "" } */
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 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
736 { dg-end-multiline-output "" } */
741 void test_combinations (int a)
743 __emit_expression_range (0, bar (a) > a ); /* { dg-warning "range" } */
744 /* { dg-begin-multiline-output "" }
745 __emit_expression_range (0, bar (a) > a );
747 { dg-end-multiline-output "" } */
750 /* C++-specific expresssions. ****************************************/
752 void test_cp_literal_keywords (int a, int b)
754 this; /* { dg-error "invalid use of 'this' in non-member function" } */
755 /* { dg-begin-multiline-output "" }
758 { dg-end-multiline-output "" } */
771 class derived : public base { ~derived (); };
773 void test_cp_casts (base *ptr)
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 "" } */
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 "" } */
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 "" } */
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 "" } */
800 void test_functional_casts (int i, float f)
802 __emit_expression_range (0, float(i)); /* { dg-warning "range" } */
803 /* { dg-begin-multiline-output "" }
804 __emit_expression_range (0, float(i));
806 { dg-end-multiline-output "" } */
808 __emit_expression_range (0, int(f)); /* { dg-warning "range" } */
809 /* { dg-begin-multiline-output "" }
810 __emit_expression_range (0, int(f));
812 { dg-end-multiline-output "" } */
814 __emit_expression_range (0, s{i, f}); /* { dg-warning "range" } */
815 /* { dg-begin-multiline-output "" }
816 __emit_expression_range (0, s{i, f});
818 { dg-end-multiline-output "" } */
821 template <typename TYPENAME>
822 class example_template
825 example_template (TYPENAME v);
828 void test_template_id (void)
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 "" } */
839 __emit_expression_range (0, ::new base); /* { dg-warning "range" } */
840 /* { dg-begin-multiline-output "" }
841 __emit_expression_range (0, ::new base);
843 { dg-end-multiline-output "" } */
845 __emit_expression_range (0, new base); /* { dg-warning "range" } */
846 /* { dg-begin-multiline-output "" }
847 __emit_expression_range (0, new base);
849 { dg-end-multiline-output "" } */
851 __emit_expression_range (0, new (base)); /* { dg-warning "range" } */
852 /* { dg-begin-multiline-output "" }
853 __emit_expression_range (0, new (base));
855 { dg-end-multiline-output "" } */
857 __emit_expression_range (0, new base (42)); /* { dg-warning "range" } */
858 /* { dg-begin-multiline-output "" }
859 __emit_expression_range (0, new base (42));
861 { dg-end-multiline-output "" } */
863 __emit_expression_range (0, new (base) (42)); /* { dg-warning "range" } */
864 /* { dg-begin-multiline-output "" }
865 __emit_expression_range (0, new (base) (42));
867 { dg-end-multiline-output "" } */
869 /* TODO: placement new. */
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 "" } */
880 __emit_expression_range (0, ((base *)1)->pub () ); /* { dg-warning "range" } */
881 /* { dg-begin-multiline-output "" }
882 __emit_expression_range (0, ((base *)1)->pub () );
884 { dg-end-multiline-output "" } */
886 ((base *)1)->priv (); // { dg-error " is private " }
887 /* { dg-begin-multiline-output "" }
888 ((base *)1)->priv ();
890 { dg-end-multiline-output "" }
891 { dg-begin-multiline-output "" }
894 { dg-end-multiline-output "" } */
900 void test_method_calls ();
901 int some_method () const;
905 tests::test_method_calls ()
907 __emit_expression_range (0, this->some_method () ); /* { dg-warning "range" } */
908 /* { dg-begin-multiline-output "" }
909 __emit_expression_range (0, this->some_method () );
911 { dg-end-multiline-output "" } */
916 class type_info { public: int foo; };
919 void test_typeid (int i)
921 __emit_expression_range (0, typeid(i)); /* { dg-warning "range" } */
922 /* { dg-begin-multiline-output "" }
923 __emit_expression_range (0, typeid(i));
925 { dg-end-multiline-output "" } */
927 __emit_expression_range (0, typeid(int)); /* { dg-warning "range" } */
928 /* { dg-begin-multiline-output "" }
929 __emit_expression_range (0, typeid(int));
931 { dg-end-multiline-output "" } */
933 __emit_expression_range (0, typeid(i * 2)); /* { dg-warning "range" } */
934 /* { dg-begin-multiline-output "" }
935 __emit_expression_range (0, typeid(i * 2));
937 { dg-end-multiline-output "" } */
940 /* Various tests of locations involving macros. */
942 void test_within_macro_1 (int lhs, int rhs)
944 #define MACRO_1(EXPR) EXPR
946 __emit_expression_range (0, MACRO_1 (lhs == rhs));
948 /* { dg-warning "range" "" { target *-*-* } .-2 } */
949 /* { dg-begin-multiline-output "" }
950 __emit_expression_range (0, MACRO_1 (lhs == rhs));
952 { dg-end-multiline-output "" } */
953 /* { dg-begin-multiline-output "" }
954 #define MACRO_1(EXPR) EXPR
956 { dg-end-multiline-output "" } */
961 void test_within_macro_2 (int lhs, int rhs)
963 #define MACRO_2(EXPR) EXPR
965 __emit_expression_range (0, MACRO_2 (MACRO_2 (lhs == rhs)));
967 /* { dg-warning "range" "" { target *-*-* } .-2 } */
968 /* { dg-begin-multiline-output "" }
969 __emit_expression_range (0, MACRO_2 (MACRO_2 (lhs == rhs)));
971 { dg-end-multiline-output "" } */
972 /* { dg-begin-multiline-output "" }
973 __emit_expression_range (0, MACRO_2 (MACRO_2 (lhs == rhs)));
975 { dg-end-multiline-output "" } */
976 /* { dg-begin-multiline-output "" }
977 #define MACRO_2(EXPR) EXPR
979 { dg-end-multiline-output "" } */
984 void test_within_macro_3 (int lhs, int rhs)
986 #define MACRO_3(EXPR) EXPR
988 __emit_expression_range (0, MACRO_3 (lhs) == MACRO_3 (rhs));
990 /* { dg-warning "range" "" { target *-*-* } .-2 } */
991 /* { dg-begin-multiline-output "" }
992 __emit_expression_range (0, MACRO_3 (lhs) == MACRO_3 (rhs));
994 { dg-end-multiline-output "" } */
999 void test_within_macro_4 (int lhs, int rhs)
1001 #define MACRO_4(EXPR) EXPR
1003 __emit_expression_range (0, MACRO_4 (MACRO_4 (lhs) == MACRO_4 (rhs)));
1005 /* { dg-warning "range" "" { target *-*-* } .-2 } */
1006 /* { dg-begin-multiline-output "" }
1007 __emit_expression_range (0, MACRO_4 (MACRO_4 (lhs) == MACRO_4 (rhs)));
1009 { dg-end-multiline-output "" } */
1010 /* { dg-begin-multiline-output "" }
1011 #define MACRO_4(EXPR) EXPR
1013 { dg-end-multiline-output "" } */