1 /* { dg-do compile } */
2 /* { dg-options "-O -fdiagnostics-show-caret -Wno-psabi" } */
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.  To do this in C, we
15    use variadic arguments, but C requires at least one argument before
16    the ellipsis, so we have a dummy one.  */
17 
18 extern void __emit_expression_range (int dummy, ...);
19 
20 int global;
21 
test_parentheses(int a,int b)22 void test_parentheses (int a, int b)
23 {
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 "" } */
29 
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 "" } */
35 
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 "" } */
41 }
42 
43 /* Postfix expressions.  ************************************************/
44 
test_array_reference(int * arr)45 void test_array_reference (int *arr)
46 {
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 "" } */
52 }
53 
test_function_call(int p,int q,int r)54 int test_function_call (int p, int q, int r)
55 {
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;
62 }
63 
64 struct test_struct
65 {
66   int field;
67 };
68 
test_structure_references(struct test_struct * ptr)69 int test_structure_references (struct test_struct *ptr)
70 {
71   struct test_struct local;
72   local.field = 42;
73 
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 "" } */
79 
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 "" } */
85 }
86 
test_postfix_incdec(int i)87 int test_postfix_incdec (int i)
88 {
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 "" } */
94 
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 "" } */
100 }
101 
102 /* Unary operators.  ****************************************************/
103 
test_prefix_incdec(int i)104 int test_prefix_incdec (int i)
105 {
106   __emit_expression_range (0, ++i ); /* { dg-warning "range" } */
107 /* { dg-begin-multiline-output "" }
108    __emit_expression_range (0, ++i );
109                                ^~~
110    { dg-end-multiline-output "" } */
111 
112   __emit_expression_range (0, --i ); /* { dg-warning "range" } */
113 /* { dg-begin-multiline-output "" }
114    __emit_expression_range (0, --i );
115                                ^~~
116    { dg-end-multiline-output "" } */
117 }
118 
test_address_operator(void)119 void test_address_operator (void)
120 {
121   __emit_expression_range (0, &global ); /* { dg-warning "range" } */
122 /* { dg-begin-multiline-output "" }
123    __emit_expression_range (0, &global );
124                                ^~~~~~~
125    { dg-end-multiline-output "" } */
126 }
127 
test_indirection(int * ptr)128 void test_indirection (int *ptr)
129 {
130   __emit_expression_range (0, *ptr ); /* { dg-warning "range" } */
131 /* { dg-begin-multiline-output "" }
132    __emit_expression_range (0, *ptr );
133                                ^~~~
134    { dg-end-multiline-output "" } */
135 }
136 
test_unary_minus(int i)137 void test_unary_minus (int i)
138 {
139   __emit_expression_range (0, -i ); /* { dg-warning "range" } */
140 /* { dg-begin-multiline-output "" }
141    __emit_expression_range (0, -i );
142                                ^~
143    { dg-end-multiline-output "" } */
144 }
145 
test_ones_complement(int i)146 void test_ones_complement (int i)
147 {
148   __emit_expression_range (0, ~i ); /* { dg-warning "range" } */
149 /* { dg-begin-multiline-output "" }
150    __emit_expression_range (0, ~i );
151                                ^~
152    { dg-end-multiline-output "" } */
153 }
154 
test_logical_negation(int flag)155 void test_logical_negation (int flag)
156 {
157   __emit_expression_range (0, !flag ); /* { dg-warning "range" } */
158 /* { dg-begin-multiline-output "" }
159    __emit_expression_range (0, !flag );
160                                ^~~~~
161    { dg-end-multiline-output "" } */
162 }
163 
164 /* Casts.  ****************************************************/
165 
test_cast(void * ptr)166 void test_cast (void *ptr)
167 {
168   __emit_expression_range (0, (int *)ptr ); /* { dg-warning "range" } */
169 /* { dg-begin-multiline-output "" }
170    __emit_expression_range (0, (int *)ptr );
171                                ^~~~~~~~~~
172    { dg-end-multiline-output "" } */
173 
174 }
175 
176 /* Binary operators.  *******************************************/
177 
test_multiplicative_operators(int lhs,int rhs)178 void test_multiplicative_operators (int lhs, int rhs)
179 {
180   __emit_expression_range (0, lhs * rhs ); /* { dg-warning "range" } */
181 /* { dg-begin-multiline-output "" }
182    __emit_expression_range (0, lhs * rhs );
183                                ~~~~^~~~~
184    { dg-end-multiline-output "" } */
185 
186   __emit_expression_range (0, lhs / rhs ); /* { dg-warning "range" } */
187 /* { dg-begin-multiline-output "" }
188    __emit_expression_range (0, lhs / rhs );
189                                ~~~~^~~~~
190    { dg-end-multiline-output "" } */
191 
192   __emit_expression_range (0, lhs % rhs ); /* { dg-warning "range" } */
193 /* { dg-begin-multiline-output "" }
194    __emit_expression_range (0, lhs % rhs );
195                                ~~~~^~~~~
196    { dg-end-multiline-output "" } */
197 }
198 
test_additive_operators(int lhs,int rhs)199 void test_additive_operators (int lhs, int rhs)
200 {
201   __emit_expression_range (0, lhs + rhs ); /* { dg-warning "range" } */
202 /* { dg-begin-multiline-output "" }
203    __emit_expression_range (0, lhs + rhs );
204                                ~~~~^~~~~
205    { dg-end-multiline-output "" } */
206 
207   __emit_expression_range (0, lhs - rhs ); /* { dg-warning "range" } */
208 /* { dg-begin-multiline-output "" }
209    __emit_expression_range (0, lhs - rhs );
210                                ~~~~^~~~~
211    { dg-end-multiline-output "" } */
212 }
213 
test_shift_operators(int lhs,int rhs)214 void test_shift_operators (int lhs, int rhs)
215 {
216   __emit_expression_range (0, lhs << rhs ); /* { dg-warning "range" } */
217 /* { dg-begin-multiline-output "" }
218    __emit_expression_range (0, lhs << rhs );
219                                ~~~~^~~~~~
220    { dg-end-multiline-output "" } */
221 
222   __emit_expression_range (0, lhs >> rhs ); /* { dg-warning "range" } */
223 /* { dg-begin-multiline-output "" }
224    __emit_expression_range (0, lhs >> rhs );
225                                ~~~~^~~~~~
226    { dg-end-multiline-output "" } */
227 }
228 
test_relational_operators(int lhs,int rhs)229 void test_relational_operators (int lhs, int rhs)
230 {
231   __emit_expression_range (0, lhs < rhs ); /* { dg-warning "range" } */
232 /* { dg-begin-multiline-output "" }
233    __emit_expression_range (0, lhs < rhs );
234                                ~~~~^~~~~
235    { dg-end-multiline-output "" } */
236 
237   __emit_expression_range (0, lhs > rhs ); /* { dg-warning "range" } */
238 /* { dg-begin-multiline-output "" }
239    __emit_expression_range (0, lhs > rhs );
240                                ~~~~^~~~~
241    { dg-end-multiline-output "" } */
242 
243   __emit_expression_range (0, lhs <= rhs ); /* { dg-warning "range" } */
244 /* { dg-begin-multiline-output "" }
245    __emit_expression_range (0, lhs <= rhs );
246                                ~~~~^~~~~~
247    { dg-end-multiline-output "" } */
248 
249   __emit_expression_range (0, lhs >= rhs ); /* { dg-warning "range" } */
250 /* { dg-begin-multiline-output "" }
251    __emit_expression_range (0, lhs >= rhs );
252                                ~~~~^~~~~~
253    { dg-end-multiline-output "" } */
254 }
255 
test_equality_operators(int lhs,int rhs)256 void test_equality_operators (int lhs, int rhs)
257 {
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 "" } */
263 
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 "" } */
269 }
270 
test_bitwise_binary_operators(int lhs,int rhs)271 void test_bitwise_binary_operators (int lhs, int rhs)
272 {
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 "" } */
278 
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 "" } */
284 
285   __emit_expression_range (0, lhs | rhs ); /* { dg-warning "range" } */
286 /* { dg-begin-multiline-output "" }
287    __emit_expression_range (0, lhs | rhs );
288                                ~~~~^~~~~
289    { dg-end-multiline-output "" } */
290 }
291 
test_logical_operators(int lhs,int rhs)292 void test_logical_operators (int lhs, int rhs)
293 {
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 "" } */
299 
300   __emit_expression_range (0, lhs || rhs ); /* { dg-warning "range" } */
301 /* { dg-begin-multiline-output "" }
302    __emit_expression_range (0, lhs || rhs );
303                                ~~~~^~~~~~
304    { dg-end-multiline-output "" } */
305 }
306 
307 /* Conditional operator.  *******************************************/
308 
test_conditional_operators(int flag,int on_true,int on_false)309 void test_conditional_operators (int flag, int on_true, int on_false)
310 {
311   __emit_expression_range (0, flag ? on_true : on_false ); /* { dg-warning "range" } */
312 /* { dg-begin-multiline-output "" }
313    __emit_expression_range (0, flag ? on_true : on_false );
314                                ~~~~~~~~~~~~~~~^~~~~~~~~~
315    { dg-end-multiline-output "" } */
316 }
317 
318 /* Assignment expressions.  *******************************************/
319 
test_assignment_expressions(int dest,int other)320 void test_assignment_expressions (int dest, int other)
321 {
322   __emit_expression_range (0, dest = other ); /* { dg-warning "range" } */
323 /* { dg-begin-multiline-output "" }
324    __emit_expression_range (0, dest = other );
325                                ~~~~~^~~~~~~
326    { dg-end-multiline-output "" } */
327 
328   __emit_expression_range (0, dest *= other ); /* { dg-warning "range" } */
329 /* { dg-begin-multiline-output "" }
330    __emit_expression_range (0, dest *= other );
331                                ~~~~~^~~~~~~~
332    { dg-end-multiline-output "" } */
333 
334   __emit_expression_range (0, dest /= other ); /* { dg-warning "range" } */
335 /* { dg-begin-multiline-output "" }
336    __emit_expression_range (0, dest /= other );
337                                ~~~~~^~~~~~~~
338    { dg-end-multiline-output "" } */
339 
340   __emit_expression_range (0, dest %= other ); /* { dg-warning "range" } */
341 /* { dg-begin-multiline-output "" }
342    __emit_expression_range (0, dest %= other );
343                                ~~~~~^~~~~~~~
344    { dg-end-multiline-output "" } */
345 
346   __emit_expression_range (0, dest += other ); /* { dg-warning "range" } */
347 /* { dg-begin-multiline-output "" }
348    __emit_expression_range (0, dest += other );
349                                ~~~~~^~~~~~~~
350    { dg-end-multiline-output "" } */
351 
352   __emit_expression_range (0, dest -= other ); /* { dg-warning "range" } */
353 /* { dg-begin-multiline-output "" }
354    __emit_expression_range (0, dest -= other );
355                                ~~~~~^~~~~~~~
356    { dg-end-multiline-output "" } */
357 
358   __emit_expression_range (0, dest <<= other ); /* { dg-warning "range" } */
359 /* { dg-begin-multiline-output "" }
360    __emit_expression_range (0, dest <<= other );
361                                ~~~~~^~~~~~~~~
362    { dg-end-multiline-output "" } */
363 
364   __emit_expression_range (0, dest >>= other ); /* { dg-warning "range" } */
365 /* { dg-begin-multiline-output "" }
366    __emit_expression_range (0, dest >>= other );
367                                ~~~~~^~~~~~~~~
368    { dg-end-multiline-output "" } */
369 
370   __emit_expression_range (0, dest &= other ); /* { dg-warning "range" } */
371 /* { dg-begin-multiline-output "" }
372    __emit_expression_range (0, dest &= other );
373                                ~~~~~^~~~~~~~
374    { dg-end-multiline-output "" } */
375 
376   __emit_expression_range (0, dest ^= other ); /* { dg-warning "range" } */
377 /* { dg-begin-multiline-output "" }
378    __emit_expression_range (0, dest ^= other );
379                                ~~~~~^~~~~~~~
380    { dg-end-multiline-output "" } */
381 
382   __emit_expression_range (0, dest |= other ); /* { dg-warning "range" } */
383 /* { dg-begin-multiline-output "" }
384    __emit_expression_range (0, dest |= other );
385                                ~~~~~^~~~~~~~
386    { dg-end-multiline-output "" } */
387 }
388 
389 /* Comma operator.  *******************************************/
390 
test_comma_operator(int a,int b)391 void test_comma_operator (int a, int b)
392 {
393   __emit_expression_range (0, (a++, a + b) ); /* { dg-warning "range" } */
394 /* { dg-begin-multiline-output "" }
395    __emit_expression_range (0, (a++, a + b) );
396                                ~~~~^~~~~~~~
397    { dg-end-multiline-output "" } */
398 }
399 
400 /* Braced initializers.  ***************************************/
401 
402 /* We can't test the ranges of these directly, since the underlying
403    tree nodes don't retain a location.  However, we can test that they
404    have ranges during parsing by building compound expressions using
405    them, and verifying the ranges of the compound expressions.  */
406 
407 #define vector(elcount, type)  \
408 __attribute__((vector_size((elcount)*sizeof(type)))) type
409 
test_braced_init(void)410 void test_braced_init (void)
411 {
412   /* Verify start of range.  */
413   __emit_expression_range (0, (vector(4, float)){2., 2., 2., 2.} + 1); /* { dg-warning "range" } */
414 /* { dg-begin-multiline-output "" }
415    __emit_expression_range (0, (vector(4, float)){2., 2., 2., 2.} + 1);
416                                                  ~~~~~~~~~~~~~~~~~^~~
417    { dg-end-multiline-output "" } */
418 
419   /* Verify end of range.  */
420   __emit_expression_range (0, &(vector(4, float)){2., 2., 2., 2.}); /* { dg-warning "range" } */
421 /* { dg-begin-multiline-output "" }
422    __emit_expression_range (0, &(vector(4, float)){2., 2., 2., 2.});
423                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
424    { dg-end-multiline-output "" } */
425 }
426 
427 /* Statement expressions.  ***************************************/
428 
test_statement_expression(void)429 void test_statement_expression (void)
430 {
431   __emit_expression_range (0, ({ static int a; a; }) );  /* { dg-warning "range" } */
432 /* { dg-begin-multiline-output "" }
433    __emit_expression_range (0, ({ static int a; a; }) );
434                                ~^~~~~~~~~~~~~~~~~~~~~
435    { dg-end-multiline-output "" } */
436 }
437 
438 /* Other expressions.  */
439 
test_address_of_label(void)440 void test_address_of_label (void)
441 {
442  label:
443   __emit_expression_range (0, &&label );  /* { dg-warning "range" } */
444 /* { dg-begin-multiline-output "" }
445    __emit_expression_range (0, &&label );
446                                ^~~~~~~
447    { dg-end-multiline-output "" } */
448 }
449 
test_transaction_expressions(void)450 void test_transaction_expressions (void)
451 {
452   int i;
453   i = __transaction_atomic (42); /* { dg-error "without transactional memory support enabled" } */
454 /* { dg-begin-multiline-output "" }
455    i = __transaction_atomic (42);
456        ^~~~~~~~~~~~~~~~~~~~
457    { dg-end-multiline-output "" } */
458   i = __transaction_relaxed (42); /* { dg-error "without transactional memory support enabled" } */
459 /* { dg-begin-multiline-output "" }
460    i = __transaction_relaxed (42);
461        ^~~~~~~~~~~~~~~~~~~~~
462    { dg-end-multiline-output "" } */
463 }
464 
test_keywords(int i)465 void test_keywords (int i)
466 {
467   __emit_expression_range (0, __FUNCTION__[i] );  /* { dg-warning "range" } */
468 /* { dg-begin-multiline-output "" }
469    __emit_expression_range (0, __FUNCTION__[i] );
470                                ~~~~~~~~~~~~^~~
471    { dg-end-multiline-output "" } */
472 
473   __emit_expression_range (0, __PRETTY_FUNCTION__ );  /* { dg-warning "range" } */
474 /* { dg-begin-multiline-output "" }
475    __emit_expression_range (0, __PRETTY_FUNCTION__ );
476                                ^~~~~~~~~~~~~~~~~~~
477    { dg-end-multiline-output "" } */
478 
479   __emit_expression_range (0, __func__ );  /* { dg-warning "range" } */
480 /* { dg-begin-multiline-output "" }
481    __emit_expression_range (0, __func__ );
482                                ^~~~~~~~
483    { dg-end-multiline-output "" } */
484 }
485 
test_builtin_va_arg(__builtin_va_list v)486 void test_builtin_va_arg (__builtin_va_list v)
487 {
488   __emit_expression_range (0,  __builtin_va_arg (v, int) );  /* { dg-warning "range" } */
489 /* { dg-begin-multiline-output "" }
490    __emit_expression_range (0,  __builtin_va_arg (v, int) );
491                                 ~~~~~~~~~~~~~~~~~~~~~^~~~
492    { dg-end-multiline-output "" } */
493 
494   __emit_expression_range (0,  __builtin_va_arg (v, int) + 1 );  /* { dg-warning "range" } */
495 /* { dg-begin-multiline-output "" }
496    __emit_expression_range (0,  __builtin_va_arg (v, int) + 1 );
497                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
498    { dg-end-multiline-output "" } */
499 }
500 
501 struct s
502 {
503   int f;
504 };
505 
test_builtin_offsetof(int i)506 void test_builtin_offsetof (int i)
507 {
508   __emit_expression_range (0,  i + __builtin_offsetof (struct s, f) );  /* { dg-warning "range" } */
509 /* { dg-begin-multiline-output "" }
510    __emit_expression_range (0,  i + __builtin_offsetof (struct s, f) );
511                                 ~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
512    { dg-end-multiline-output "" } */
513 
514   __emit_expression_range (0,  __builtin_offsetof (struct s, f) + i );  /* { dg-warning "range" } */
515 /* { dg-begin-multiline-output "" }
516    __emit_expression_range (0,  __builtin_offsetof (struct s, f) + i );
517                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
518    { dg-end-multiline-output "" } */
519 }
520 
test_builtin_choose_expr(int i)521 void test_builtin_choose_expr (int i)
522 {
523   __emit_expression_range (0,  __builtin_choose_expr (1, i, i) + i);  /* { dg-warning "range" } */
524 /* { dg-begin-multiline-output "" }
525    __emit_expression_range (0,  __builtin_choose_expr (1, i, i) + i);
526                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
527    { dg-end-multiline-output "" } */
528 
529   __emit_expression_range (0,  i + __builtin_choose_expr (1, i, i));  /* { dg-warning "range" } */
530 /* { dg-begin-multiline-output "" }
531    __emit_expression_range (0,  i + __builtin_choose_expr (1, i, i));
532                                 ~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
533    { dg-end-multiline-output "" } */
534 }
535 
536 extern int f (int);
537 
test_builtin_types_compatible_p(unsigned long i)538 void test_builtin_types_compatible_p (unsigned long i)
539 {
540   __emit_expression_range (0,
541 			   f (i) + __builtin_types_compatible_p (long, int)); /* { dg-warning "range" } */
542 /* { dg-begin-multiline-output "" }
543        f (i) + __builtin_types_compatible_p (long, int));
544        ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
545    { dg-end-multiline-output "" } */
546 
547   __emit_expression_range (0,
548 			   __builtin_types_compatible_p (long, int) + f (i)); /* { dg-warning "range" } */
549 /* { dg-begin-multiline-output "" }
550        __builtin_types_compatible_p (long, int) + f (i));
551        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~
552    { dg-end-multiline-output "" } */
553 }
554 
test_builtin_call_with_static_chain(int i,void * ptr)555 void test_builtin_call_with_static_chain (int i, void *ptr)
556 {
557   __emit_expression_range (0, __builtin_call_with_static_chain (f (i), ptr));  /* { dg-warning "range" } */
558 /* { dg-begin-multiline-output "" }
559    __emit_expression_range (0, __builtin_call_with_static_chain (f (i), ptr));
560                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~
561    { dg-end-multiline-output "" } */
562 }
563 
test_builtin_complex(float i,float j)564 void test_builtin_complex (float i, float j)
565 {
566   __emit_expression_range (0,  __builtin_complex (i, j) );  /* { dg-warning "range" } */
567 /* { dg-begin-multiline-output "" }
568    __emit_expression_range (0,  __builtin_complex (i, j) );
569                                 ^~~~~~~~~~~~~~~~~~~~~~~~
570    { dg-end-multiline-output "" } */
571 }
572 
573 typedef int v4si __attribute__ ((vector_size (16)));
test_builtin_shuffle(v4si a,v4si b,v4si mask)574 void test_builtin_shuffle (v4si a, v4si b, v4si mask)
575 {
576   __emit_expression_range (0,  __builtin_shuffle (a, mask) );  /* { dg-warning "range" } */
577 /* { dg-begin-multiline-output "" }
578    __emit_expression_range (0,  __builtin_shuffle (a, mask) );
579                                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~
580    { dg-end-multiline-output "" } */
581 
582   __emit_expression_range (0,  __builtin_shuffle (a, b, mask) );  /* { dg-warning "range" } */
583 /* { dg-begin-multiline-output "" }
584    __emit_expression_range (0,  __builtin_shuffle (a, b, mask) );
585                                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
586    { dg-end-multiline-output "" } */
587 }
588 
test_alignof(int param)589 void test_alignof (int param)
590 {
591   __emit_expression_range (0, __alignof__ (int) + param );  /* { dg-warning "range" } */
592 /* { dg-begin-multiline-output "" }
593    __emit_expression_range (0, __alignof__ (int) + param );
594                                ~~~~~~~~~~~~~~~~~~^~~~~~~
595    { dg-end-multiline-output "" } */
596 
597   __emit_expression_range (0,  param + __alignof__ (int) );  /* { dg-warning "range" } */
598 /* { dg-begin-multiline-output "" }
599    __emit_expression_range (0,  param + __alignof__ (int) );
600                                 ~~~~~~^~~~~~~~~~~~~~~~~~~
601    { dg-end-multiline-output "" } */
602 
603   __emit_expression_range (0,  __alignof__ (param) + param );  /* { dg-warning "range" } */
604 /* { dg-begin-multiline-output "" }
605    __emit_expression_range (0,  __alignof__ (param) + param );
606                                 ~~~~~~~~~~~~~~~~~~~~^~~~~~~
607    { dg-end-multiline-output "" } */
608 
609   __emit_expression_range (0,  param + __alignof__ (param) );  /* { dg-warning "range" } */
610 /* { dg-begin-multiline-output "" }
611    __emit_expression_range (0,  param + __alignof__ (param) );
612                                 ~~~~~~^~~~~~~~~~~~~~~~~~~~~
613    { dg-end-multiline-output "" } */
614 }
615 
616 /* Examples of non-trivial expressions.  ****************************/
617 
618 extern double sqrt (double x);
619 
test_quadratic(double a,double b,double c)620 void test_quadratic (double a, double b, double c)
621 {
622   __emit_expression_range (0, b * b - 4 * a * c ); /* { dg-warning "range" } */
623 /* { dg-begin-multiline-output "" }
624    __emit_expression_range (0, b * b - 4 * a * c );
625                                ~~~~~~^~~~~~~~~~~
626    { dg-end-multiline-output "" } */
627 
628   __emit_expression_range (0,
629      (-b + sqrt (b * b - 4 * a * c))
630      / (2 * a)); /* { dg-warning "range" } */
631 /* { dg-begin-multiline-output "" }
632       (-b + sqrt (b * b - 4 * a * c))
633       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
634       / (2 * a));
635       ^~~~~~~~~
636    { dg-end-multiline-output "" } */
637 
638 }
639 
640 /* Reproducer for PR c/68473.  */
641 
642 extern long double fminl (long double __x, long double __y);
643 #define TEST_EQ(FUNC) FUNC##l(xl,xl)
test_macro(long double xl)644 void test_macro (long double xl)
645 {
646   __emit_expression_range (0, TEST_EQ (fmin) ); /* { dg-warning "range" } */
647 /* { dg-begin-multiline-output "" }
648    __emit_expression_range (0, TEST_EQ (fmin) );
649                                         ^
650    { dg-end-multiline-output "" } */
651 /* { dg-begin-multiline-output "" }
652  #define TEST_EQ(FUNC) FUNC##l(xl,xl)
653                        ^~~~
654    { dg-end-multiline-output "" } */
655 }
656 
657 /* Verify that we can underline expressions that span multiple
658    ordinary maps.  */
659 
660 extern int foo (int, ...);
661 
test_multiple_ordinary_maps(void)662 void test_multiple_ordinary_maps (void)
663 {
664   /* The expression
665         foo (0, "very long string...")
666      below contains a transition between ordinary maps due to a very long
667      line (>127 "columns", treating tab characters as 1 column).  */
668   __emit_expression_range (0, foo (0, /* { dg-warning "range" } */
669 				   "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"));
670 
671 /* { dg-begin-multiline-output "" }
672    __emit_expression_range (0, foo (0,
673                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
674         "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"));
675         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
676    { dg-end-multiline-output "" } */
677 
678   /* Another expression that transitions between ordinary maps; this
679      one due to an ordinary map for a very long line transitioning back to
680      one for a very short line.  The policy in linemap_line_start
681      means that we need a transition from >10 bits of column
682      (i.e. 2048 columns) to a line with <= 80 columns.  */
683   __emit_expression_range (0, foo (0, "01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789", /* { dg-warning "range" } */
684 				   0));
685 /* { dg-begin-multiline-output "" }
686    __emit_expression_range (0, foo (0, "01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789",
687                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
688         0));
689         ~~
690    { dg-end-multiline-output "" } */
691 }
692 
693 /* Verify that we correctly handle a token that spans multiple
694    physical lines.  */
695 
test_multiline_token(void)696 const char *test_multiline_token (void)
697 {
698   __emit_expression_range (0, "foo\
699 bar\
700 baz");
701 /* { dg-warning "range" "" { target *-*-* } .-3 } */
702 /* { dg-begin-multiline-output "" }
703    __emit_expression_range (0, "foo\
704                                ^~~~~
705  bar\
706  ~~~~
707  baz");
708  ~~~~
709    { dg-end-multiline-output "" } */
710 }
711 
712 /* Various tests of locations involving macros.  */
713 
test_within_macro_1(int lhs,int rhs)714 void test_within_macro_1 (int lhs, int rhs)
715 {
716 #define MACRO_1(EXPR) EXPR
717 
718   __emit_expression_range (0, MACRO_1 (lhs == rhs));
719 
720 /* { dg-warning "range" "" { target *-*-* } .-2 } */
721 /* { dg-begin-multiline-output "" }
722    __emit_expression_range (0, MACRO_1 (lhs == rhs));
723                                         ~~~~^~~~~~
724    { dg-end-multiline-output "" } */
725 /* { dg-begin-multiline-output "" }
726  #define MACRO_1(EXPR) EXPR
727                        ^~~~
728    { dg-end-multiline-output "" } */
729 
730 #undef MACRO_1
731 }
732 
test_within_macro_2(int lhs,int rhs)733 void test_within_macro_2 (int lhs, int rhs)
734 {
735 #define MACRO_2(EXPR) EXPR
736 
737   __emit_expression_range (0, MACRO_2 (MACRO_2 (lhs == rhs)));
738 
739 /* { dg-warning "range" "" { target *-*-* } .-2 } */
740 /* { dg-begin-multiline-output "" }
741    __emit_expression_range (0, MACRO_2 (MACRO_2 (lhs == rhs)));
742                                                  ~~~~^~~~~~
743    { dg-end-multiline-output "" } */
744 /* { dg-begin-multiline-output "" }
745    __emit_expression_range (0, MACRO_2 (MACRO_2 (lhs == rhs)));
746                                         ^~~~~~~
747    { dg-end-multiline-output "" } */
748 /* { dg-begin-multiline-output "" }
749  #define MACRO_2(EXPR) EXPR
750                        ^~~~
751    { dg-end-multiline-output "" } */
752 
753 #undef MACRO_2
754 }
755 
test_within_macro_3(int lhs,int rhs)756 void test_within_macro_3 (int lhs, int rhs)
757 {
758 #define MACRO_3(EXPR) EXPR
759 
760   __emit_expression_range (0, MACRO_3 (lhs) == MACRO_3 (rhs));
761 
762 /* { dg-warning "range" "" { target *-*-* } .-2 } */
763 /* { dg-begin-multiline-output "" }
764    __emit_expression_range (0, MACRO_3 (lhs) == MACRO_3 (rhs));
765                                              ^
766    { dg-end-multiline-output "" } */
767 
768 #undef MACRO_3
769 }
770 
test_within_macro_4(int lhs,int rhs)771 void test_within_macro_4 (int lhs, int rhs)
772 {
773 #define MACRO_4(EXPR) EXPR
774 
775   __emit_expression_range (0, MACRO_4 (MACRO_4 (lhs) == MACRO_4 (rhs)));
776 
777 /* { dg-warning "range" "" { target *-*-* } .-2 } */
778 /* { dg-begin-multiline-output "" }
779    __emit_expression_range (0, MACRO_4 (MACRO_4 (lhs) == MACRO_4 (rhs)));
780                                                       ^
781    { dg-end-multiline-output "" } */
782 /* { dg-begin-multiline-output "" }
783  #define MACRO_4(EXPR) EXPR
784                        ^~~~
785    { dg-end-multiline-output "" } */
786 
787 #undef MACRO_4
788 }
789 
790