Fix location of sizeof/alignof (PR c++/80016)
[official-gcc.git] / gcc / testsuite / g++.dg / plugin / diagnostic-test-expressions-1.C
blob2c004f306206f763824d34050f73621cf5b612a8
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, ...);
20 int global;
22 void test_parentheses (int a, int b)
24   __emit_expression_range (0, (a + b) ); /* { dg-warning "range" } */
25 /* { dg-begin-multiline-output "" }
26    __emit_expression_range (0, (a + b) );
27                                ~~~^~~~
28    { dg-end-multiline-output "" } */
30   __emit_expression_range (0, (a + b) * (a - b) ); /* { dg-warning "range" } */
31 /* { dg-begin-multiline-output "" }
32    __emit_expression_range (0, (a + b) * (a - b) );
33                                ~~~~~~~~^~~~~~~~~
34    { dg-end-multiline-output "" } */
36   __emit_expression_range (0, !(a && b) ); /* { dg-warning "range" } */
37 /* { dg-begin-multiline-output "" }
38    __emit_expression_range (0, !(a && b) );
39                                ^~~~~~~~~
40    { dg-end-multiline-output "" } */
43 /* Postfix expressions.  ************************************************/
45 void test_array_reference (int *arr)
47   __emit_expression_range (0, arr[100] ); /* { dg-warning "range" } */
48 /* { dg-begin-multiline-output "" }
49    __emit_expression_range (0, arr[100] );
50                                ~~~~~~~^
51    { dg-end-multiline-output "" } */
54 int test_function_call (int p, int q, int r)
56   __emit_expression_range (0, test_function_call (p, q, r) ); /* { dg-warning "range" } */
57 /* { dg-begin-multiline-output "" }
58    __emit_expression_range (0, test_function_call (p, q, r) );
59                                ~~~~~~~~~~~~~~~~~~~^~~~~~~~~
60    { dg-end-multiline-output "" } */
61   return 0;
64 struct test_struct
66   int field;
69 int test_structure_references (struct test_struct *ptr)
71   struct test_struct local;
72   local.field = 42;
74   __emit_expression_range (0, local.field ); /* { dg-warning "range" } */
75 /* { dg-begin-multiline-output "" }
76    __emit_expression_range (0, local.field );
77                                ~~~~~~^~~~~
78    { dg-end-multiline-output "" } */
80   __emit_expression_range (0, ptr->field ); /* { dg-warning "range" } */
81 /* { dg-begin-multiline-output "" }
82    __emit_expression_range (0, ptr->field );
83                                ~~~~~^~~~~
84    { dg-end-multiline-output "" } */
87 int test_postfix_incdec (int i)
89   __emit_expression_range (0, i++ ); /* { dg-warning "range" } */
90 /* { dg-begin-multiline-output "" }
91    __emit_expression_range (0, i++ );
92                                ~^~
93    { dg-end-multiline-output "" } */
95   __emit_expression_range (0, i-- ); /* { dg-warning "range" } */
96 /* { dg-begin-multiline-output "" }
97    __emit_expression_range (0, i-- );
98                                ~^~
99    { dg-end-multiline-output "" } */
102 /* Unary operators.  ****************************************************/
104 int test_sizeof (int i)
106   __emit_expression_range (0, sizeof(int) + i); /* { dg-warning "range" } */
107 /* { dg-begin-multiline-output "" }
108    __emit_expression_range (0, sizeof(int) + i);
109                                ~~~~~~~~~~~~^~~
110    { dg-end-multiline-output "" } */
112   __emit_expression_range (0, i + sizeof(int)); /* { dg-warning "range" } */
113 /* { dg-begin-multiline-output "" }
114    __emit_expression_range (0, i + sizeof(int));
115                                ~~^~~~~~~~~~~~~
116    { dg-end-multiline-output "" } */
118   __emit_expression_range (0, sizeof i + i); /* { dg-warning "range" } */
119 /* { dg-begin-multiline-output "" }
120    __emit_expression_range (0, sizeof i + i);
121                                ~~~~~~~~~^~~
122    { dg-end-multiline-output "" } */
124   __emit_expression_range (0, i + sizeof i); /* { dg-warning "range" } */
125 /* { dg-begin-multiline-output "" }
126    __emit_expression_range (0, i + sizeof i);
127                                ~~^~~~~~~~~~
128    { dg-end-multiline-output "" } */
131 int test_alignof (int i)
133   __emit_expression_range (0, alignof(int) + i); /* { dg-warning "range" } */
134 /* { dg-begin-multiline-output "" }
135    __emit_expression_range (0, alignof(int) + i);
136                                ~~~~~~~~~~~~~^~~
137    { dg-end-multiline-output "" } */
139   __emit_expression_range (0, i + alignof(int)); /* { dg-warning "range" } */
140 /* { dg-begin-multiline-output "" }
141    __emit_expression_range (0, i + alignof(int));
142                                ~~^~~~~~~~~~~~~~
143    { dg-end-multiline-output "" } */
145   __emit_expression_range (0, __alignof__(int) + i); /* { dg-warning "range" } */
146 /* { dg-begin-multiline-output "" }
147    __emit_expression_range (0, __alignof__(int) + i);
148                                ~~~~~~~~~~~~~~~~~^~~
149    { dg-end-multiline-output "" } */
151   __emit_expression_range (0, i + __alignof__(int)); /* { dg-warning "range" } */
152 /* { dg-begin-multiline-output "" }
153    __emit_expression_range (0, i + __alignof__(int));
154                                ~~^~~~~~~~~~~~~~~~~~
155    { dg-end-multiline-output "" } */
157   __emit_expression_range (0, __alignof__ i + i); /* { dg-warning "range" } */
158 /* { dg-begin-multiline-output "" }
159    __emit_expression_range (0, __alignof__ i + i);
160                                ~~~~~~~~~~~~~~^~~
161    { dg-end-multiline-output "" } */
163   __emit_expression_range (0, i + __alignof__ i); /* { dg-warning "range" } */
164 /* { dg-begin-multiline-output "" }
165    __emit_expression_range (0, i + __alignof__ i);
166                                ~~^~~~~~~~~~~~~~~
167    { dg-end-multiline-output "" } */
170 int test_prefix_incdec (int i)
172   __emit_expression_range (0, ++i ); /* { dg-warning "range" } */
173 /* { dg-begin-multiline-output "" }
174    __emit_expression_range (0, ++i );
175                                ^~~
176    { dg-end-multiline-output "" } */
178   __emit_expression_range (0, --i ); /* { dg-warning "range" } */
179 /* { dg-begin-multiline-output "" }
180    __emit_expression_range (0, --i );
181                                ^~~
182    { dg-end-multiline-output "" } */
185 void test_address_operator (void)
187   __emit_expression_range (0, &global ); /* { dg-warning "range" } */
188 /* { dg-begin-multiline-output "" }
189    __emit_expression_range (0, &global );
190                                ^~~~~~~
191    { dg-end-multiline-output "" } */
194 void test_indirection (int *ptr)
196   __emit_expression_range (0, *ptr ); /* { dg-warning "range" } */
197 /* { dg-begin-multiline-output "" }
198    __emit_expression_range (0, *ptr );
199                                ^~~~
200    { dg-end-multiline-output "" } */
203 void test_unary_minus (int i)
205   __emit_expression_range (0, -i ); /* { dg-warning "range" } */
206 /* { dg-begin-multiline-output "" }
207    __emit_expression_range (0, -i );
208                                ^~
209    { dg-end-multiline-output "" } */
212 void test_ones_complement (int i)
214   __emit_expression_range (0, ~i ); /* { dg-warning "range" } */
215 /* { dg-begin-multiline-output "" }
216    __emit_expression_range (0, ~i );
217                                ^~
218    { dg-end-multiline-output "" } */
221 void test_logical_negation (int flag)
223   __emit_expression_range (0, !flag ); /* { dg-warning "range" } */
224 /* { dg-begin-multiline-output "" }
225    __emit_expression_range (0, !flag );
226                                ^~~~~
227    { dg-end-multiline-output "" } */
230 /* Casts.  ****************************************************/
232 void test_cast (void *ptr)
234   __emit_expression_range (0, (int *)ptr ); /* { dg-warning "range" } */
235 /* { dg-begin-multiline-output "" }
236    __emit_expression_range (0, (int *)ptr );
237                                ^~~~~~~~~~
238    { dg-end-multiline-output "" } */
240   __emit_expression_range (0, *(int *)0xdeadbeef ); /* { dg-warning "range" } */
241 /* { dg-begin-multiline-output "" }
242    __emit_expression_range (0, *(int *)0xdeadbeef );
243                                ^~~~~~~~~~~~~~~~~~
244    { dg-end-multiline-output "" } */
248 /* Binary operators.  *******************************************/
250 void test_multiplicative_operators (int lhs, int rhs)
252   __emit_expression_range (0, lhs * rhs ); /* { dg-warning "range" } */
253 /* { dg-begin-multiline-output "" }
254    __emit_expression_range (0, lhs * rhs );
255                                ~~~~^~~~~
256    { dg-end-multiline-output "" } */
258   __emit_expression_range (0, lhs / rhs ); /* { dg-warning "range" } */
259 /* { dg-begin-multiline-output "" }
260    __emit_expression_range (0, lhs / rhs );
261                                ~~~~^~~~~
262    { dg-end-multiline-output "" } */
264   __emit_expression_range (0, lhs % rhs ); /* { dg-warning "range" } */
265 /* { dg-begin-multiline-output "" }
266    __emit_expression_range (0, lhs % rhs );
267                                ~~~~^~~~~
268    { dg-end-multiline-output "" } */
271 void test_additive_operators (int lhs, int rhs)
273   __emit_expression_range (0, lhs + rhs ); /* { dg-warning "range" } */
274 /* { dg-begin-multiline-output "" }
275    __emit_expression_range (0, lhs + rhs );
276                                ~~~~^~~~~
277    { dg-end-multiline-output "" } */
279   __emit_expression_range (0, lhs - rhs ); /* { dg-warning "range" } */
280 /* { dg-begin-multiline-output "" }
281    __emit_expression_range (0, lhs - rhs );
282                                ~~~~^~~~~
283    { dg-end-multiline-output "" } */
286 void test_shift_operators (int lhs, int rhs)
288   __emit_expression_range (0, lhs << rhs ); /* { dg-warning "range" } */
289 /* { dg-begin-multiline-output "" }
290    __emit_expression_range (0, lhs << rhs );
291                                ~~~~^~~~~~
292    { dg-end-multiline-output "" } */
294   __emit_expression_range (0, lhs >> rhs ); /* { dg-warning "range" } */
295 /* { dg-begin-multiline-output "" }
296    __emit_expression_range (0, lhs >> rhs );
297                                ~~~~^~~~~~
298    { dg-end-multiline-output "" } */
301 void test_relational_operators (int lhs, int rhs)
303   __emit_expression_range (0, lhs < rhs ); /* { dg-warning "range" } */
304 /* { dg-begin-multiline-output "" }
305    __emit_expression_range (0, lhs < rhs );
306                                ~~~~^~~~~
307    { dg-end-multiline-output "" } */
309   __emit_expression_range (0, lhs > rhs ); /* { dg-warning "range" } */
310 /* { dg-begin-multiline-output "" }
311    __emit_expression_range (0, lhs > rhs );
312                                ~~~~^~~~~
313    { dg-end-multiline-output "" } */
315   __emit_expression_range (0, lhs <= rhs ); /* { dg-warning "range" } */
316 /* { dg-begin-multiline-output "" }
317    __emit_expression_range (0, lhs <= rhs );
318                                ~~~~^~~~~~
319    { dg-end-multiline-output "" } */
321   __emit_expression_range (0, lhs >= rhs ); /* { dg-warning "range" } */
322 /* { dg-begin-multiline-output "" }
323    __emit_expression_range (0, lhs >= rhs );
324                                ~~~~^~~~~~
325    { dg-end-multiline-output "" } */
328 void test_equality_operators (int lhs, int rhs)
330   __emit_expression_range (0, lhs == rhs ); /* { dg-warning "range" } */
331 /* { dg-begin-multiline-output "" }
332    __emit_expression_range (0, lhs == rhs );
333                                ~~~~^~~~~~
334    { dg-end-multiline-output "" } */
336   __emit_expression_range (0, lhs != rhs ); /* { dg-warning "range" } */
337 /* { dg-begin-multiline-output "" }
338    __emit_expression_range (0, lhs != rhs );
339                                ~~~~^~~~~~
340    { dg-end-multiline-output "" } */
343 void test_bitwise_binary_operators (int lhs, int rhs)
345   __emit_expression_range (0, lhs & rhs ); /* { dg-warning "range" } */
346 /* { dg-begin-multiline-output "" }
347    __emit_expression_range (0, lhs & rhs );
348                                ~~~~^~~~~
349    { dg-end-multiline-output "" } */
351   __emit_expression_range (0, lhs ^ rhs ); /* { dg-warning "range" } */
352 /* { dg-begin-multiline-output "" }
353    __emit_expression_range (0, lhs ^ rhs );
354                                ~~~~^~~~~
355    { dg-end-multiline-output "" } */
357   __emit_expression_range (0, lhs | rhs ); /* { dg-warning "range" } */
358 /* { dg-begin-multiline-output "" }
359    __emit_expression_range (0, lhs | rhs );
360                                ~~~~^~~~~
361    { dg-end-multiline-output "" } */
364 void test_logical_operators (int lhs, int rhs)
366   __emit_expression_range (0, lhs && rhs ); /* { dg-warning "range" } */
367 /* { dg-begin-multiline-output "" }
368    __emit_expression_range (0, lhs && rhs );
369                                ~~~~^~~~~~
370    { dg-end-multiline-output "" } */
372   __emit_expression_range (0, lhs || rhs ); /* { dg-warning "range" } */
373 /* { dg-begin-multiline-output "" }
374    __emit_expression_range (0, lhs || rhs );
375                                ~~~~^~~~~~
376    { dg-end-multiline-output "" } */
379 /* Conditional operator.  *******************************************/
381 void test_conditional_operators (int flag, int on_true, int on_false)
383   __emit_expression_range (0, flag ? on_true : on_false ); /* { dg-warning "range" } */
384 /* { dg-begin-multiline-output "" }
385    __emit_expression_range (0, flag ? on_true : on_false );
386                                ~~~~~^~~~~~~~~~~~~~~~~~~~
387    { dg-end-multiline-output "" } */
390 /* Assignment expressions.  *******************************************/
392 void test_assignment_expressions (int dest, int other)
394   __emit_expression_range (0, dest = other ); /* { dg-warning "range" } */
395 /* { dg-begin-multiline-output "" }
396    __emit_expression_range (0, dest = other );
397                                ~~~~~^~~~~~~
398    { dg-end-multiline-output "" } */
400   __emit_expression_range (0, dest *= other ); /* { dg-warning "range" } */
401 /* { dg-begin-multiline-output "" }
402    __emit_expression_range (0, dest *= other );
403                                ~~~~~^~~~~~~~
404    { dg-end-multiline-output "" } */
406   __emit_expression_range (0, dest /= other ); /* { dg-warning "range" } */
407 /* { dg-begin-multiline-output "" }
408    __emit_expression_range (0, dest /= other );
409                                ~~~~~^~~~~~~~
410    { dg-end-multiline-output "" } */
412   __emit_expression_range (0, dest %= other ); /* { dg-warning "range" } */
413 /* { dg-begin-multiline-output "" }
414    __emit_expression_range (0, dest %= other );
415                                ~~~~~^~~~~~~~
416    { dg-end-multiline-output "" } */
418   __emit_expression_range (0, dest += other ); /* { dg-warning "range" } */
419 /* { dg-begin-multiline-output "" }
420    __emit_expression_range (0, dest += other );
421                                ~~~~~^~~~~~~~
422    { dg-end-multiline-output "" } */
424   __emit_expression_range (0, dest -= other ); /* { dg-warning "range" } */
425 /* { dg-begin-multiline-output "" }
426    __emit_expression_range (0, dest -= other );
427                                ~~~~~^~~~~~~~
428    { dg-end-multiline-output "" } */
430   __emit_expression_range (0, dest <<= other ); /* { dg-warning "range" } */
431 /* { dg-begin-multiline-output "" }
432    __emit_expression_range (0, dest <<= other );
433                                ~~~~~^~~~~~~~~
434    { dg-end-multiline-output "" } */
436   __emit_expression_range (0, dest >>= other ); /* { dg-warning "range" } */
437 /* { dg-begin-multiline-output "" }
438    __emit_expression_range (0, dest >>= other );
439                                ~~~~~^~~~~~~~~
440    { dg-end-multiline-output "" } */
442   __emit_expression_range (0, dest &= other ); /* { dg-warning "range" } */
443 /* { dg-begin-multiline-output "" }
444    __emit_expression_range (0, dest &= other );
445                                ~~~~~^~~~~~~~
446    { dg-end-multiline-output "" } */
448   __emit_expression_range (0, dest ^= other ); /* { dg-warning "range" } */
449 /* { dg-begin-multiline-output "" }
450    __emit_expression_range (0, dest ^= other );
451                                ~~~~~^~~~~~~~
452    { dg-end-multiline-output "" } */
454   __emit_expression_range (0, dest |= other ); /* { dg-warning "range" } */
455 /* { dg-begin-multiline-output "" }
456    __emit_expression_range (0, dest |= other );
457                                ~~~~~^~~~~~~~
458    { dg-end-multiline-output "" } */
461 /* Comma operator.  *******************************************/
463 void test_comma_operator (int a, int b)
465   __emit_expression_range (0, (a++, a + b) ); /* { dg-warning "range" } */
466 /* { dg-begin-multiline-output "" }
467    __emit_expression_range (0, (a++, a + b) );
468                                ~~~~^~~~~~~~
469    { dg-end-multiline-output "" } */
472 /* Literals.  **************************************************/
474 /* We can't test the ranges of literals directly, since the underlying
475    tree nodes don't retain a location.  However, we can test that they
476    have ranges during parsing by building compound expressions using
477    them, and verifying the ranges of the compound expressions.  */
479 void test_string_literals (int i)
481   __emit_expression_range (0, "foo"[i] ); /* { dg-warning "range" } */
482 /* { dg-begin-multiline-output "" }
483    __emit_expression_range (0, "foo"[i] );
484                                ~~~~~~~^
485    { dg-end-multiline-output "" } */
487   __emit_expression_range (0, &"foo" "bar" ); /* { dg-warning "range" } */
488 /* { dg-begin-multiline-output "" }
489    __emit_expression_range (0, &"foo" "bar" );
490                                ^~~~~~~~~~~~
491    { dg-end-multiline-output "" } */
494 void test_numeric_literals (int i)
496   __emit_expression_range (0, 42 + i ); /* { dg-warning "range" } */
497 /* { dg-begin-multiline-output "" }
498    __emit_expression_range (0, 42 + i );
499                                ~~~^~~
500    { dg-end-multiline-output "" } */
502   __emit_expression_range (0, i + 42 ); /* { dg-warning "range" } */
503 /* { dg-begin-multiline-output "" }
504    __emit_expression_range (0, i + 42 );
505                                ~~^~~~
506    { dg-end-multiline-output "" } */
508   /* Verify locations of negative literals (via folding of
509      unary negation).  */
511   __emit_expression_range (0, -42 + i ); /* { dg-warning "range" } */
512 /* { dg-begin-multiline-output "" }
513    __emit_expression_range (0, -42 + i );
514                                ~~~~^~~
515    { dg-end-multiline-output "" } */
517   __emit_expression_range (0, i + -42 ); /* { dg-warning "range" } */
518 /* { dg-begin-multiline-output "" }
519    __emit_expression_range (0, i + -42 );
520                                ~~^~~~~
521    { dg-end-multiline-output "" } */
523   __emit_expression_range (0, i ? 0 : -1 ); /* { dg-warning "range" } */
524 /* { dg-begin-multiline-output "" }
525    __emit_expression_range (0, i ? 0 : -1 );
526                                ~~^~~~~~~~
527    { dg-end-multiline-output "" } */
530 /* Braced initializers.  ***************************************/
532 /* We can't test the ranges of these directly, since the underlying
533    tree nodes don't retain a location.  However, we can test that they
534    have ranges during parsing by building compound expressions using
535    them, and verifying the ranges of the compound expressions.  */
537 #define vector(elcount, type)  \
538 __attribute__((vector_size((elcount)*sizeof(type)))) type
540 void test_braced_init (void)
542   /* Verify start of range.  */
543   __emit_expression_range (0, (vector(4, float)){2., 2., 2., 2.} + 1); /* { dg-warning "range" } */
544 /* { dg-begin-multiline-output "" }
545    __emit_expression_range (0, (vector(4, float)){2., 2., 2., 2.} + 1);
546                                                  ~~~~~~~~~~~~~~~~~^~~
547    { dg-end-multiline-output "" } */
549   /* Verify end of range.  */
550   __emit_expression_range (0, 1 + (vector(4, float)){2., 2., 2., 2.}); /* { dg-warning "range" } */
551 /* { dg-begin-multiline-output "" }
552    __emit_expression_range (0, 1 + (vector(4, float)){2., 2., 2., 2.});
553                                ~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
554    { dg-end-multiline-output "" } */
557 /* Statement expressions.  ***************************************/
559 void test_statement_expression (void)
561   __emit_expression_range (0, ({ static int a; a; }) + 1);  /* { dg-warning "range" } */
562 /* { dg-begin-multiline-output "" }
563    __emit_expression_range (0, ({ static int a; a; }) + 1);
564                                ~~~~~~~~~~~~~~~~~~~~~~~^~~
565    { dg-end-multiline-output "" } */
567   __emit_expression_range (0, 1 + ({ static int a; a; }) );  /* { dg-warning "range" } */
568 /* { dg-begin-multiline-output "" }
569    __emit_expression_range (0, 1 + ({ static int a; a; }) );
570                                ~~^~~~~~~~~~~~~~~~~~~~~~~~
571    { dg-end-multiline-output "" } */
574 /* Other expressions.  */
576 void test_address_of_label (void)
578  label:
579   __emit_expression_range (0, &&label );  /* { dg-warning "range" } */
580 /* { dg-begin-multiline-output "" }
581    __emit_expression_range (0, &&label );
582                                ^~~~~~~
583    { dg-end-multiline-output "" } */
586 void test_transaction_expressions (void)
588   int i;
589   i = __transaction_atomic (42); /* { dg-error "without transactional memory support enabled" } */
590 /* { dg-begin-multiline-output "" }
591    i = __transaction_atomic (42);
592        ^~~~~~~~~~~~~~~~~~~~
593    { dg-end-multiline-output "" } */
594   i = __transaction_relaxed (42); /* { dg-error "without transactional memory support enabled" } */
595 /* { dg-begin-multiline-output "" }
596    i = __transaction_relaxed (42);
597        ^~~~~~~~~~~~~~~~~~~~~
598    { dg-end-multiline-output "" } */
601 void test_keywords (int i)
603   __emit_expression_range (0, __FUNCTION__[i] );  /* { dg-warning "range" } */
604 /* { dg-begin-multiline-output "" }
605    __emit_expression_range (0, __FUNCTION__[i] );
606                                ~~~~~~~~~~~~~~^
607    { dg-end-multiline-output "" } */
609   __emit_expression_range (0, __PRETTY_FUNCTION__[i] );  /* { dg-warning "range" } */
610 /* { dg-begin-multiline-output "" }
611    __emit_expression_range (0, __PRETTY_FUNCTION__[i] );
612                                ~~~~~~~~~~~~~~~~~~~~~^
613    { dg-end-multiline-output "" } */
615   __emit_expression_range (0, __func__[i] );  /* { dg-warning "range" } */
616 /* { dg-begin-multiline-output "" }
617    __emit_expression_range (0, __func__[i] );
618                                ~~~~~~~~~~^
619    { dg-end-multiline-output "" } */
622 void test_builtin_va_arg (__builtin_va_list v)
624   __emit_expression_range (0,  __builtin_va_arg (v, int) );  /* { dg-warning "range" } */
625 /* { dg-begin-multiline-output "" }
626    __emit_expression_range (0,  __builtin_va_arg (v, int) );
627                                 ~~~~~~~~~~~~~~~~~~~~~^~~~
628    { dg-end-multiline-output "" } */
630   __emit_expression_range (0,  __builtin_va_arg (v, int) + 1 );  /* { dg-warning "range" } */
631 /* { dg-begin-multiline-output "" }
632    __emit_expression_range (0,  __builtin_va_arg (v, int) + 1 );
633                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
634    { dg-end-multiline-output "" } */
637 struct s { int i; float f; };
639 void test_builtin_offsetof (int i)
641   __emit_expression_range (0,  i + __builtin_offsetof (struct s, f) );  /* { dg-warning "range" } */
642 /* { dg-begin-multiline-output "" }
643    __emit_expression_range (0,  i + __builtin_offsetof (struct s, f) );
644                                 ~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
645    { dg-end-multiline-output "" } */
647   __emit_expression_range (0,  __builtin_offsetof (struct s, f) + i );  /* { dg-warning "range" } */
648 /* { dg-begin-multiline-output "" }
649    __emit_expression_range (0,  __builtin_offsetof (struct s, f) + i );
650                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
651    { dg-end-multiline-output "" } */
654 /* Examples of non-trivial expressions.  ****************************/
656 extern double sqrt (double x);
658 void test_quadratic (double a, double b, double c)
660   __emit_expression_range (0, b * b - 4 * a * c ); /* { dg-warning "range" } */
661 /* { dg-begin-multiline-output "" }
662    __emit_expression_range (0, b * b - 4 * a * c );
663                                ~~~~~~^~~~~~~~~~~
664    { dg-end-multiline-output "" } */
666   __emit_expression_range (0,
667      (-b + sqrt (b * b - 4 * a * c))
668      / (2 * a)); /* { dg-warning "range" } */
669 /* { dg-begin-multiline-output "" }
670       (-b + sqrt (b * b - 4 * a * c))
671       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
672       / (2 * a));
673       ^~~~~~~~~
674    { dg-end-multiline-output "" } */
678 int bar (int);
679 void test_combinations (int a)
681   __emit_expression_range (0, bar (a) > a ); /* { dg-warning "range" } */
682 /* { dg-begin-multiline-output "" }
683    __emit_expression_range (0, bar (a) > a );
684                                ~~~~~~~~^~~
685    { dg-end-multiline-output "" } */
688 /* C++-specific expresssions. ****************************************/
690 void test_cp_literal_keywords (int a, int b)
692   this; /* { dg-error "invalid use of 'this' in non-member function" } */
693 /* { dg-begin-multiline-output "" }
694    this;
695    ^~~~
696    { dg-end-multiline-output "" } */
700 class base {
701  public:
702   base ();
703   base (int i);
704   virtual ~base ();
705   int pub ();
706 private:
707   int priv ();
709 class derived : public base { ~derived (); };
711 void test_cp_casts (base *ptr)
713   __emit_expression_range (0, dynamic_cast <derived *> (ptr)); /* { dg-warning "range" } */
714 /* { dg-begin-multiline-output "" }
715    __emit_expression_range (0, dynamic_cast <derived *> (ptr));
716                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
717    { dg-end-multiline-output "" } */
719   __emit_expression_range (0, static_cast <derived *> (ptr)); /* { dg-warning "range" } */
720 /* { dg-begin-multiline-output "" }
721    __emit_expression_range (0, static_cast <derived *> (ptr));
722                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
723    { dg-end-multiline-output "" } */
725   __emit_expression_range (0, reinterpret_cast <int *> (ptr)); /* { dg-warning "range" } */
726 /* { dg-begin-multiline-output "" }
727    __emit_expression_range (0, reinterpret_cast <int *> (ptr));
728                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
729    { dg-end-multiline-output "" } */
731   __emit_expression_range (0, const_cast <base *> (ptr)); /* { dg-warning "range" } */
732 /* { dg-begin-multiline-output "" }
733    __emit_expression_range (0, const_cast <base *> (ptr));
734                                ^~~~~~~~~~~~~~~~~~~~~~~~~
735    { dg-end-multiline-output "" } */
738 void test_functional_casts (int i, float f)
740   __emit_expression_range (0, float(i)); /* { dg-warning "range" } */
741 /* { dg-begin-multiline-output "" }
742    __emit_expression_range (0, float(i));
743                                ^~~~~~~~
744    { dg-end-multiline-output "" } */
746   __emit_expression_range (0, int(f)); /* { dg-warning "range" } */
747 /* { dg-begin-multiline-output "" }
748    __emit_expression_range (0, int(f));
749                                ^~~~~~
750    { dg-end-multiline-output "" } */
752   __emit_expression_range (0, s{i, f}); /* { dg-warning "range" } */
753 /* { dg-begin-multiline-output "" }
754    __emit_expression_range (0, s{i, f});
755                                ^~~~~~~
756    { dg-end-multiline-output "" } */
759 template <typename TYPENAME>
760 class example_template
762 public:
763   example_template (TYPENAME v);
766 void test_template_id (void)
768   example_template <int>; /* { dg-warning "declaration does not declare anything" } */
769 /* { dg-begin-multiline-output "" }
770    example_template <int>;
771    ^~~~~~~~~~~~~~~~~~~~~~
772    { dg-end-multiline-output "" } */
775 void test_new (void)
777   __emit_expression_range (0, ::new base); /* { dg-warning "range" } */
778 /* { dg-begin-multiline-output "" }
779    __emit_expression_range (0, ::new base);
780                                ^~~~~~~~~~
781    { dg-end-multiline-output "" } */
783   __emit_expression_range (0, new base); /* { dg-warning "range" } */
784 /* { dg-begin-multiline-output "" }
785    __emit_expression_range (0, new base);
786                                ^~~~~~~~
787    { dg-end-multiline-output "" } */
789   __emit_expression_range (0, new (base)); /* { dg-warning "range" } */
790 /* { dg-begin-multiline-output "" }
791    __emit_expression_range (0, new (base));
792                                ^~~~~~~~~~
793    { dg-end-multiline-output "" } */
795   __emit_expression_range (0, new base (42)); /* { dg-warning "range" } */
796 /* { dg-begin-multiline-output "" }
797    __emit_expression_range (0, new base (42));
798                                ^~~~~~~~~~~~~
799    { dg-end-multiline-output "" } */
801   __emit_expression_range (0, new (base) (42)); /* { dg-warning "range" } */
802 /* { dg-begin-multiline-output "" }
803    __emit_expression_range (0, new (base) (42));
804                                ^~~~~~~~~~~~~~~
805    { dg-end-multiline-output "" } */
807   /* TODO: placement new.  */
809   __emit_expression_range (0, new example_template<int> (42)); /* { dg-warning "range" } */
810 /* { dg-begin-multiline-output "" }
811    __emit_expression_range (0, new example_template<int> (42));
812                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
813    { dg-end-multiline-output "" } */
816 void test_methods ()
818   __emit_expression_range (0, ((base *)1)->pub () ); /* { dg-warning "range" } */
819 /* { dg-begin-multiline-output "" }
820    __emit_expression_range (0, ((base *)1)->pub () );
821                                ~~~~~~~~~~~~~~~~~^~
822    { dg-end-multiline-output "" } */
824   ((base *)1)->priv (); // { dg-error " is private " }
825 /* { dg-begin-multiline-output "" }
826    ((base *)1)->priv ();
827                       ^
828    { dg-end-multiline-output "" }
829    { dg-begin-multiline-output "" }
830    int priv ();
831        ^~~~
832    { dg-end-multiline-output "" } */
835 class tests
837 public:
838   void test_method_calls ();
839   int some_method () const;
842 void
843 tests::test_method_calls ()
845   __emit_expression_range (0, this->some_method () ); /* { dg-warning "range" } */
846 /* { dg-begin-multiline-output "" }
847    __emit_expression_range (0, this->some_method () );
848                                ~~~~~~~~~~~~~~~~~~^~
849    { dg-end-multiline-output "" } */