1 /* PR tree-optimization/35503 - Warning about restricted pointers?
3 { dg-options "-O2 -Wno-format-overflow -Wrestrict -ftrack-macro-expansion=0" }
8 #define S10 "0123456789"
10 extern char a2
[2][22];
12 #define T(d, ...) do { \
14 sink (__builtin_sprintf ((d), __VA_ARGS__)); \
17 void test_ptr (char *d
, int i
)
19 T (d
, "%s", d
); /* { dg-warning "argument 3 overlaps destination object 'd'" } */
20 T (d
, "%s", d
+ 0); /* { dg-warning "overlaps" } */
22 /* The following only overlaps if d[1] is non-zero. */
23 T (d
, "%s", d
+ 1); /* { dg-warning "may overlap" } */
24 T (d
, "%s", d
+ 2); /* { dg-warning "may overlap" } */
25 T (d
, "%s", d
+ i
); /* { dg-warning "may overlap" } */
27 T (d
, "%s", &d
[0]); /* { dg-warning "overlaps" } */
28 T (d
, "%s", &d
[1]); /* { dg-warning "may overlap" } */
29 T (d
, "%s", &d
[2]); /* { dg-warning "may overlap" } */
30 T (d
, "%s", &d
[i
]); /* { dg-warning "may overlap" } */
32 T (d
+ 0, "%s", d
); /* { dg-warning "overlaps" } */
33 T (d
+ 1, "%s", d
); /* { dg-warning "may overlap" } */
34 T (d
+ 2, "%s", d
); /* { dg-warning "may overlap" } */
35 T (d
+ i
, "%s", d
); /* { dg-warning "may overlap" } */
37 T (&d
[0], "%s", d
); /* { dg-warning "overlaps" } */
38 T (&d
[1], "%s", d
); /* { dg-warning "may overlap" } */
39 T (&d
[2], "%s", d
); /* { dg-warning "may overlap" } */
40 T (&d
[i
], "%s", d
); /* { dg-warning "may overlap" } */
44 T (d
, "%s", s
); /* { dg-warning "overlaps" } */
45 T (d
, "%s", s
+ 1); /* { dg-warning "may overlap" } */
46 T (d
, "%s", s
+ 2); /* { dg-warning "may overlap" } */
47 T (d
, "%s", s
+ i
); /* { dg-warning "may overlap" } */
50 void test_ptr_plus (char *d
, int i
)
54 T (d
, "%s", s
++); /* { dg-warning "overlaps" } */
55 T (d
, "%s", s
++); /* { dg-warning "may overlap" } */
56 T (d
, "%s", s
++); /* { dg-warning "may overlap" } */
57 T (d
, "%s", s
++); /* { dg-warning "may overlap" } */
60 T (d
, "%s", s
); /* { dg-warning "may overlap" } */
63 void test_array_1_dim (int i
)
65 T (a
, "%s", a
); /* { dg-warning "overlaps" } */
66 T (a
, "%s", a
+ 0); /* { dg-warning "overlaps" } */
67 T (a
, "%s", a
+ 1); /* { dg-warning "overlaps" } */
68 T (a
, "%s", a
+ 2); /* { dg-warning "overlaps" } */
69 T (a
, "%s", a
+ i
); /* { dg-warning "may overlap" } */
71 T (a
, "%s", &a
[0]); /* { dg-warning "overlaps" } */
72 T (a
, "%s", &a
[1]); /* { dg-warning "overlaps" } */
73 T (a
, "%s", &a
[2]); /* { dg-warning "overlaps" } */
74 T (a
, "%s", &a
[i
]); /* { dg-warning "may overlap" } */
76 T (a
+ 0, "%s", a
); /* { dg-warning "overlaps" } */
77 T (a
+ 1, "%s", a
); /* { dg-warning "overlaps" } */
78 T (a
+ 2, "%s", a
); /* { dg-warning "overlaps" } */
79 T (a
+ i
, "%s", a
); /* { dg-warning "may overlap" } */
81 T (&a
[0], "%s", a
); /* { dg-warning "overlaps" } */
82 T (&a
[1], "%s", a
); /* { dg-warning "overlaps" } */
83 T (&a
[2], "%s", a
); /* { dg-warning "overlaps" } */
84 T (&a
[i
], "%s", a
); /* { dg-warning "may overlap" } */
88 void test_array_2_dim (int i
)
90 T (a2
[0], "%s", a2
[0]); /* { dg-warning "overlaps" } */
91 T (a2
[0], "%s", a2
[0] + 0); /* { dg-warning "overlaps" } */
92 T (a2
[0], "%s", a2
[0] + 1); /* { dg-warning "may overlap" } */
93 T (a2
[0], "%s", a2
[0] + 2); /* { dg-warning "may overlap" } */
94 T (a2
[0], "%s", a2
[0] + i
); /* { dg-warning "may overlap" } */
96 T (a2
[0], "%s", &a2
[0][0]); /* { dg-warning "overlaps" } */
97 T (a2
[0], "%s", &a2
[0][1]); /* { dg-warning "may overlap" } */
98 T (a2
[0], "%s", &a2
[0][2]); /* { dg-warning "may overlap" } */
99 T (a2
[0], "%s", &a2
[0][i
]); /* { dg-warning "may overlap" } */
101 T (a2
[0] + 0, "%s", a2
[0]); /* { dg-warning "overlaps" } */
102 T (a2
[0] + 1, "%s", a2
[0]); /* { dg-warning "may overlap" } */
103 T (a2
[0] + 2, "%s", a2
[0]); /* { dg-warning "may overlap" } */
104 T (a2
[0] + i
, "%s", a2
[0]); /* { dg-warning "may overlap" } */
106 T (&a2
[0][0], "%s", a2
[0]); /* { dg-warning "overlaps" } */
107 T (&a2
[0][1], "%s", a2
[0]); /* { dg-warning "may overlap" } */
108 T (&a2
[0][2], "%s", a2
[0]); /* { dg-warning "may overlap" } */
109 T (&a2
[0][i
], "%s", a2
[0]); /* { dg-warning "may overlap" } */
112 T (a2
[0], "%s", a2
[1]);
113 T (a2
[0], "%s", a2
[1] + 0);
114 T (a2
[0], "%s", a2
[1] + 1);
115 T (a2
[0], "%s", a2
[1] + 2);
116 T (a2
[0], "%s", a2
[1] + i
);
118 T (a2
[0], "%s", &a2
[1][0]);
119 T (a2
[0], "%s", &a2
[1][1]);
120 T (a2
[0], "%s", &a2
[1][2]);
122 /* a2[0] is represented as &a in Gimple, and &a2[1][i] as &a + _2,
123 with _1 defined to something like 10 + _1, and _1 to i. That
124 makes it virtually impossible to reliably determine that the
125 two pointers refer to distinct sub-arrays of the same multi-
126 dimensional array. */
127 T (a2
[0], "%s", &a2
[1][i
]); /* { dg-bogus "overlap" "" { xfail *-*-* } } */
129 T (a2
[0] + 0, "%s", a2
[1]);
130 T (a2
[0] + 1, "%s", a2
[1]);
131 T (a2
[0] + 2, "%s", a2
[1]);
132 T (a2
[0] + i
, "%s", a2
[1]);
134 T (&a2
[0][0], "%s", a2
[1]);
135 T (&a2
[0][1], "%s", a2
[1]);
136 T (&a2
[0][2], "%s", a2
[1]);
137 T (&a2
[0][i
], "%s", a2
[1]);
140 T (a2
[1], "%s", a2
[0]);
141 T (a2
[1], "%s", a2
[0] + 0);
142 T (a2
[1], "%s", a2
[0] + 1);
143 T (a2
[1], "%s", a2
[0] + 2);
144 T (a2
[1], "%s", a2
[0] + i
);
146 T (a2
[1], "%s", &a2
[0][0]);
147 T (a2
[1], "%s", &a2
[0][1]);
148 T (a2
[1], "%s", &a2
[0][2]);
149 T (a2
[1], "%s", &a2
[0][i
]);
151 T (a2
[1] + 0, "%s", a2
[0]);
152 T (a2
[1] + 1, "%s", a2
[0]);
153 T (a2
[1] + 2, "%s", a2
[0]);
154 T (a2
[1] + i
, "%s", a2
[0]);
156 T (&a2
[1][0], "%s", a2
[0]);
157 T (&a2
[1][1], "%s", a2
[0]);
158 T (&a2
[1][2], "%s", a2
[0]);
159 T (&a2
[1][i
], "%s", a2
[0]); /* { dg-bogus "overlap" "" { xfail *-*-* } } */
162 T (a2
[1], "%s", a2
[1]); /* { dg-warning "overlaps" } */
163 T (a2
[1], "%s", a2
[1] + 0); /* { dg-warning "overlaps" } */
164 T (a2
[1], "%s", a2
[1] + 1); /* { dg-warning "may overlap" } */
165 T (a2
[1], "%s", a2
[1] + 2); /* { dg-warning "may overlap" } */
166 T (a2
[1], "%s", a2
[1] + i
); /* { dg-warning "may overlap" } */
168 T (a2
[1], "%s", &a2
[1][0]); /* { dg-warning "overlaps" } */
169 T (a2
[1], "%s", &a2
[1][1]); /* { dg-warning "may overlap" } */
170 T (a2
[1], "%s", &a2
[1][2]); /* { dg-warning "may overlap" } */
171 T (a2
[1], "%s", &a2
[1][i
]); /* { dg-warning "may overlap" "" { xfail *-*-* } } */
173 T (a2
[1] + 0, "%s", a2
[1]); /* { dg-warning "overlaps" } */
174 T (a2
[1] + 1, "%s", a2
[1]); /* { dg-warning "may overlap" } */
175 T (a2
[1] + 2, "%s", a2
[1]); /* { dg-warning "may overlap" } */
176 T (a2
[1] + i
, "%s", a2
[1]); /* { dg-warning "may overlap" } */
178 T (&a2
[1][0], "%s", a2
[1]); /* { dg-warning "overlaps" } */
179 T (&a2
[1][1], "%s", a2
[1]); /* { dg-warning "may overlap" } */
180 T (&a2
[1][2], "%s", a2
[1]); /* { dg-warning "may overlap" } */
181 T (&a2
[1][i
], "%s", a2
[1]); /* { dg-warning "may overlap" "" { xfail *-*-* } } */
210 void test_struct_member_array (struct S3
*s3
, int i
)
212 char *d
= s3
->s2_1
.s_1
.a
;
214 T (d
, "%s", d
); /* { dg-warning "overlaps" } */
215 T (d
, "%s", d
+ 0); /* { dg-warning "overlaps" } */
216 T (d
, "%s", d
+ 1); /* { dg-warning "may overlap" } */
217 /* Since d below points to char[4], strlen(d + 2) must be at most 1
218 and so the call cannot overlap. */
220 T (d
, "%s", d
+ i
); /* { dg-warning "may overlap" } */
222 T (d
, "%s", &d
[0]); /* { dg-warning "overlaps" } */
223 T (d
, "%s", &d
[1]); /* { dg-warning "may overlap" } */
225 T (d
, "%s", &d
[i
]); /* { dg-warning "may overlap" } */
227 T (d
+ 0, "%s", d
); /* { dg-warning "overlaps" } */
228 T (d
+ 1, "%s", d
); /* { dg-warning "may overlap" } */
229 T (d
+ 2, "%s", d
); /* { dg-warning "may overlap" } */
230 T (d
+ i
, "%s", d
); /* { dg-warning "may overlap" } */
232 T (&d
[0], "%s", d
); /* { dg-warning "overlaps" } */
233 T (&d
[1], "%s", d
); /* { dg-warning "may overlap" } */
234 T (&d
[2], "%s", d
); /* { dg-warning "may overlap" } */
235 T (&d
[i
], "%s", d
); /* { dg-warning "may overlap" } */
239 T (d
, "%s", s
); /* { dg-warning "overlaps" } */
240 T (d
, "%s", s
+ 1); /* { dg-warning "may overlap" } */
242 T (d
, "%s", s
+ i
); /* { dg-warning "may overlap" } */
327 T (d
, "%s", s
); /* { dg-warning "overlaps" } */
328 T (d
, "%s", s
+ 1); /* { dg-warning "may overlap" } */
330 T (d
, "%s", s
+ i
); /* { dg-warning "may overlap" } */
371 T (d
, "%s", s
); /* { dg-warning "overlaps" } */
372 T (d
, "%s", s
+ 1); /* { dg-warning "may overlap" } */
374 T (d
, "%s", s
+ i
); /* { dg-warning "may overlap" } */
391 void test_struct_member_array_array (struct S3
*s3
, int i
)
393 char *d
= s3
->s2_1
.sa3
[0].a
;
394 char *s
= s3
->s2_1
.sa3
[0].a
;
396 T (d
, "%s", s
); /* { dg-warning "overlaps" } */
397 T (d
, "%s", s
+ 0); /* { dg-warning "overlaps" } */
398 T (d
, "%s", s
+ 1); /* { dg-warning "may overlap" } */
400 T (d
, "%s", s
+ i
); /* { dg-warning "may overlap" } */
402 T (d
, "%s", &s
[0]); /* { dg-warning "overlaps" } */
403 T (d
, "%s", &s
[1]); /* { dg-warning "may overlap" } */
405 T (d
, "%s", &s
[i
]); /* { dg-warning "may overlap" } */
407 T (d
+ 0, "%s", s
); /* { dg-warning "overlaps" } */
408 T (d
+ 1, "%s", s
); /* { dg-warning "may overlap" } */
409 T (d
+ 2, "%s", s
); /* { dg-warning "may overlap" } */
410 T (d
+ i
, "%s", s
); /* { dg-warning "may overlap" } */
412 T (&d
[0], "%s", s
); /* { dg-warning "overlaps" } */
413 T (&d
[1], "%s", s
); /* { dg-warning "may overlap" } */
414 T (&d
[2], "%s", s
); /* { dg-warning "may overlap" } */
415 T (&d
[i
], "%s", s
); /* { dg-warning "may overlap" } */
417 s
= s3
->s2_1
.sa3
[0].b
;
441 void test_struct_member_nested_array (struct S3
*s3
, int i
)
443 #define PFX(sfx) s3->a_3[i3_0][i3_1][i3_2] \
448 T (PFX (d), "%s", PFX (s)); \
449 T (PFX (d), "%s", &PFX (s)[0]); \
450 T (PFX (d), "%s", &PFX (s)[1]); \
451 T (PFX (d), "%s", &PFX (s)[2]); \
452 T (PFX (d), "%s", &PFX (s)[i]) \
458 TT (sa_3[0].a, sa_3[0].b); TT (sa_3[0].b, sa_3[0].a); \
460 TT (sa_3[0].a, sa_3[1].a); TT (sa_3[0].a, sa_3[1].b); \
461 TT (sa_3[0].b, sa_3[1].a); TT (sa_3[0].b, sa_3[1].b); \
463 TT (sa_3[0].a, sa_3[2].a); TT (sa_3[0].a, sa_3[2].b); \
464 TT (sa_3[0].b, sa_3[2].a); TT (sa_3[0].b, sa_3[2].b); \
466 TT (sa_3[1].a, sa_3[0].a); TT (sa_3[1].a, sa_3[0].b); \
467 TT (sa_3[1].b, sa_3[0].a); TT (sa_3[1].b, sa_3[0].b); \
469 TT (sa_3[1].a, sa_3[1].b); TT (sa_3[1].b, sa_3[1].a); \
471 TT (sa_3[1].a, sa_3[2].a); TT (sa_3[1].a, sa_3[2].b); \
472 TT (sa_3[1].b, sa_3[2].a); TT (sa_3[1].b, sa_3[2].b); \
475 #define T2(i0, i1) do \
477 enum { i2_0 = i0, i2_1 = i1 }; \
478 T1 (0); T1 (1); T1 (2); \
481 #define T3(i0, i1, i2) do \
483 enum { i3_0 = i0, i3_1 = i1, i3_2 = i2 }; \
484 T2 (0, 0); T2 (0, 1); T2 (0, 2); \
485 T2 (1, 0); T2 (1, 1); T2 (1, 2); \
486 T2 (2, 0); T2 (2, 1); T2 (2, 2); \
490 /* These tests take forever and a day to compile. Enable them only
491 during the development of this feature but leave them otherwise
492 disabled to avoid slowing everything down for others. */
493 T3 (0, 0, 0); T3 (0, 0, 1); T3 (0, 0, 2);
494 T3 (0, 1, 0); T3 (0, 1, 1); T3 (0, 1, 2);
495 T3 (0, 2, 0); T3 (0, 2, 1); T3 (0, 2, 2);
497 T3 (1, 0, 0); T3 (1, 0, 1); T3 (1, 0, 2);
498 T3 (1, 1, 0); T3 (1, 1, 1); T3 (1, 1, 2);
499 T3 (1, 2, 0); T3 (1, 2, 1); T3 (1, 2, 2);
501 T3 (2, 0, 0); T3 (2, 0, 1); T3 (2, 0, 2);
502 T3 (2, 1, 0); T3 (2, 1, 1); T3 (2, 1, 2);
503 T3 (2, 2, 0); T3 (2, 2, 1); T3 (2, 2, 2);
507 void test_struct_member_flexarray (struct S3
*s3
, int i
, int j
)
512 T (d
, "%s", s
); /* { dg-warning "overlaps" } */
513 T (d
, "%s", s
+ 0); /* { dg-warning "overlaps" } */
514 T (d
, "%s", s
+ 1); /* { dg-warning "may overlap" } */
515 T (d
, "%s", s
+ 2); /* { dg-warning "may overlap" } */
516 T (d
, "%s", s
+ i
); /* { dg-warning "may overlap" } */
518 T (d
, "%s", &s
[0]); /* { dg-warning "overlaps" } */
519 T (d
, "%s", &s
[1]); /* { dg-warning "may overlap" } */
520 T (d
, "%s", &s
[2]); /* { dg-warning "may overlap" } */
521 T (d
, "%s", &s
[i
]); /* { dg-warning "may overlap" } */
523 T (d
+ 0, "%s", s
); /* { dg-warning "overlaps" } */
524 T (d
+ 1, "%s", s
); /* { dg-warning "may overlap" } */
525 T (d
+ 2, "%s", s
); /* { dg-warning "may overlap" } */
526 T (d
+ i
, "%s", s
); /* { dg-warning "may overlap" } */
528 T (&d
[0], "%s", s
); /* { dg-warning "overlaps" } */
529 T (&d
[1], "%s", s
); /* { dg-warning "may overlap" } */
530 T (&d
[2], "%s", s
); /* { dg-warning "may overlap" } */
531 T (&d
[i
], "%s", s
); /* { dg-warning "may overlap" } */
536 T (d
, "%s", s
); /* { dg-warning "may overlap" } */
537 T (d
, "%s", s
+ 0); /* { dg-warning "may overlap" } */
538 T (d
, "%s", s
+ 1); /* { dg-warning "may overlap" } */
539 T (d
, "%s", s
+ 2); /* { dg-warning "may overlap" } */
540 T (d
, "%s", s
+ i
); /* { dg-warning "may overlap" } */
542 T (d
, "%s", &s
[0]); /* { dg-warning "may overlap" } */
543 T (d
, "%s", &s
[1]); /* { dg-warning "may overlap" } */
544 T (d
, "%s", &s
[2]); /* { dg-warning "may overlap" } */
545 T (d
, "%s", &s
[i
]); /* { dg-warning "may overlap" } */
547 T (d
+ 0, "%s", s
); /* { dg-warning "may overlap" } */
548 T (d
+ 1, "%s", s
); /* { dg-warning "may overlap" } */
549 T (d
+ 2, "%s", s
); /* { dg-warning "may overlap" } */
550 T (d
+ j
, "%s", s
); /* { dg-warning "may overlap" } */
552 T (&d
[0], "%s", s
); /* { dg-warning "may overlap" } */
553 T (&d
[1], "%s", s
); /* { dg-warning "may overlap" } */
554 T (&d
[2], "%s", s
); /* { dg-warning "may overlap" } */
555 T (&d
[j
], "%s", s
); /* { dg-warning "may overlap" } */
564 void test_union_member_array (union U
*un
, int i
)
566 char *d
= un
->s2_1
.s_1
.a
;
568 T (d
, "%s", d
); /* { dg-warning "overlaps" } */
569 T (d
, "%s", d
+ 0); /* { dg-warning "overlaps" } */
570 T (d
, "%s", d
+ 1); /* { dg-warning "may overlap" } */
572 T (d
, "%s", d
+ i
); /* { dg-warning "may overlap" } */
574 T (d
, "%s", &d
[0]); /* { dg-warning "overlaps" } */
575 T (d
, "%s", &d
[1]); /* { dg-warning "may overlap" } */
577 T (d
, "%s", &d
[i
]); /* { dg-warning "may overlap" } */
579 T (d
+ 0, "%s", d
); /* { dg-warning "overlaps" } */
580 T (d
+ 1, "%s", d
); /* { dg-warning "may overlap" } */
581 T (d
+ 2, "%s", d
); /* { dg-warning "may overlap" } */
582 T (d
+ i
, "%s", d
); /* { dg-warning "may overlap" } */
584 T (&d
[0], "%s", d
); /* { dg-warning "overlaps" } */
585 T (&d
[1], "%s", d
); /* { dg-warning "may overlap" } */
586 T (&d
[2], "%s", d
); /* { dg-warning "may overlap" } */
587 T (&d
[i
], "%s", d
); /* { dg-warning "may overlap" } */
591 T (d
, "%s", s
); /* { dg-warning "overlaps" } */
592 T (d
, "%s", s
+ 1); /* { dg-warning "may overlap" } */
594 T (d
, "%s", s
+ i
); /* { dg-warning "may overlap" } */
619 T (d
, "%s", s
); /* { dg-warning "overlaps" } */
620 T (d
, "%s", s
+ 1); /* { dg-warning "may overlap" } */
622 T (d
, "%s", s
+ i
); /* { dg-warning "may overlap" } */
632 void test_multiple_overlap (int i
)
635 char a
[3] = ""; /* { dg-message "declared here" } */
637 /* Both a3 and a4 definitely overlap the output even if the are
638 empty because of the terminating nul. */
643 T (d
, "%s%s", a3
, a4
); /* { dg-warning "arguments 3, 4 overlap destination object .a." }*/
649 /* There is no overlap here because the length of a3 is at most 1
650 and a4 is necessarily the empty string. */
655 T (d
, "%s%s", a3
, a4
);
659 char a
[5]; /* { dg-message "declared here" } */
661 /* a3 and a4 may overlap the output. They will only not overlap
662 it when a3 is empty, and a4 is at most 1 character long. */
667 T (d
, "%s%s", a3
, a4
); /* { dg-warning "arguments 3, 4 may overlap destination object .a." }*/
671 char a
[5]; /* { dg-message "declared here" } */
673 /* a3 certaibly overlaps the output, but a4 may or may not depending
674 in the value of i. */
679 T (d
, "%s%s", a3
, a4
); /* { dg-warning "arguments 3 and maybe 4 overlap destination object .a." }*/
683 void test_overlap_with_precision (char *d
, int i
, int j
)
685 /* None of the following is diagnosed because no copying takes place
686 between the %s argument and the destination. */
687 T (d
, "%.0s", d
+ 0);
688 T (d
, "%.0s", d
+ 1);
689 T (d
, "%.0s", d
+ 2);
690 T (d
, "%.0s", d
+ i
);
692 T (d
, "%.1s", d
+ 0); /* { dg-warning "overlaps" } */
693 /* Unlike the %.0s case the following deserves a warning because
694 when d[1] isn't nul, it will be overwritten by the terminating
695 nul added by sprintf. */
696 T (d
, "%.1s", d
+ 1); /* { dg-warning "may overlap" } */
697 T (d
, "%.1s", d
+ 2);
698 T (d
, "%.1s", d
+ i
); /* { dg-warning "may overlap" } */
700 T (d
+ 1, "%.0s", d
);
701 T (d
+ 2, "%.0s", d
);
703 T (d
+ 1, "%.1s", d
); /* { dg-warning "may overlap" } */
704 T (d
+ 2, "%.1s", d
);
706 T (d
+ 2, "%.1s", d
+ 1); /* { dg-warning "may overlap" } */
707 T (d
+ 2, "%.1s", d
+ i
); /* { dg-warning "may overlap" } */
709 /* The following should be "overlaps" but tracking that the offset
710 is the same variable doesn't seem worth the effort. */
711 T (d
+ i
, "%.1s", d
+ i
); /* { dg-warning "overlap" } */
713 T (d
+ i
, "%.1s", d
+ j
); /* { dg-warning "may overlap" } */
715 /* Exercise overlap with precison in the range [0, 1]. */
719 T (d
, "%.*s", i
, d
+ 0); /* { dg-warning "may overlap" } */
720 T (d
, "%.*s", i
, d
+ 1); /* { dg-warning "may overlap" } */
721 T (d
, "%.*s", i
, d
+ 2);
722 T (d
, "%.*s", i
, d
+ i
); /* { dg-warning "may overlap" } */