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