| /* PR tree-optimization/105604 - ICE: in tree_to_shwi with vla in struct |
| and sprintf |
| { dg-do compile } |
| { dg-options "-O2 -Wall -Wrestrict" } */ |
| |
| extern int sprintf (char*, const char*, ...); |
| |
| void* sink (void*); |
| |
| |
| void sprintf_S_a8_an_bn (int n, int i, int j) |
| { |
| struct { |
| char a8[8], an[n], bn[n]; |
| } *p = sink (0); |
| |
| { |
| char *d = p->a8 + i; |
| char *s = p->a8; |
| sprintf (d, "%s", s); // { dg-warning "argument 3 may overlap" } |
| sink (p); |
| } |
| |
| { |
| char *d = p->a8; |
| char *s = p->a8 + j; |
| sprintf (d, "%s", s); // { dg-warning "argument 3 may overlap" } |
| sink (p); |
| } |
| |
| { |
| char *d = p->a8 + i; |
| char *s = p->a8 + j; |
| sprintf (d, "%s", s); // { dg-warning "argument 3 may overlap" } |
| sink (p); |
| } |
| |
| { |
| char *d = p->a8 + i; |
| char *s = p->an; |
| sprintf (d, "%s", s); |
| sink (p); |
| } |
| |
| { |
| char *d = p->a8; |
| char *s = p->an + j; |
| sprintf (d, "%s", s); |
| sink (p); |
| } |
| |
| { |
| char *d = p->a8 + i; |
| char *s = p->an + j; |
| sprintf (d, "%s", s); |
| sink (p); |
| } |
| |
| { |
| /* The IL makes it impossible to rule out an overlap between |
| p->a8 + i and p->bn + i so the "may overlap" warning triggers. */ |
| char *d = p->a8 + i; |
| char *s = p->bn; |
| sprintf (d, "%s", s); // { dg-bogus "-Wrestrict" "pr??????" { xfail *-*-* } } |
| sink (p); |
| } |
| |
| { |
| char *d = p->a8; |
| char *s = p->bn + j; |
| sprintf (d, "%s", s); // { dg-bogus "-Wrestrict" "pr??????" { xfail *-*-* } } |
| sink (p); |
| } |
| |
| { |
| char *d = p->a8 + i; |
| char *s = p->bn + j; |
| sprintf (d, "%s", s); // { dg-bogus "-Wrestrict" "pr??????" { xfail *-*-* } } |
| sink (p); |
| } |
| |
| { |
| char *d = p->an + i; |
| char *s = p->bn; |
| sprintf (d, "%s", s); |
| sink (p); |
| } |
| |
| { |
| char *d = p->an; |
| char *s = p->bn + j; |
| sprintf (d, "%s", s); |
| sink (p); |
| } |
| |
| { |
| char *d = p->an + i; |
| char *s = p->bn + j; |
| sprintf (d, "%s", s); |
| sink (p); |
| } |
| |
| { |
| char *d = p->an + i; |
| char *s = p->a8; |
| sprintf (d, "%s", s); |
| sink (p); |
| } |
| |
| { |
| char *d = p->an; |
| char *s = p->a8 + j; |
| sprintf (d, "%s", s); |
| sink (p); |
| } |
| |
| { |
| char *d = p->an + i; |
| char *s = p->a8 + j; |
| sprintf (d, "%s", s); |
| sink (p); |
| } |
| |
| { |
| char *d = p->bn + i; |
| char *s = p->a8; |
| sprintf (d, "%s", s); // { dg-bogus "-Wrestrict" "pr??????" { xfail *-*-* } } |
| sink (p); |
| } |
| |
| { |
| char *d = p->bn; |
| char *s = p->a8 + j; |
| sprintf (d, "%s", s); // { dg-bogus "-Wrestrict" "pr??????" { xfail *-*-* } } |
| sink (p); |
| } |
| |
| { |
| char *d = p->bn + i; |
| char *s = p->a8 + j; |
| sprintf (d, "%s", s); // { dg-bogus "-Wrestrict" "pr??????" { xfail *-*-* } } |
| sink (p); |
| } |
| |
| { |
| char *d = p->bn + i; |
| char *s = p->bn; |
| sprintf (d, "%s", s); // { dg-warning "may overlap" } |
| sink (p); |
| } |
| |
| { |
| char *d = p->bn; |
| char *s = p->bn + j; |
| sprintf (d, "%s", s); // { dg-warning "may overlap" } |
| sink (p); |
| } |
| |
| { |
| char *d = p->bn + i; |
| char *s = p->bn + j; |
| sprintf (d, "%s", s); // { dg-warning "may overlap" } |
| sink (p); |
| } |
| } |