(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
Wrestrict-25.c
       1  /* PR tree-optimization/105604  - ICE: in tree_to_shwi with vla in struct
       2     and sprintf
       3     { dg-do compile }
       4     { dg-options "-O2 -Wall -Wrestrict" } */
       5  
       6  extern int sprintf (char*, const char*, ...);
       7  
       8  void* sink (void*);
       9  
      10  
      11  void sprintf_S_a8_an_bn (int n, int i, int j)
      12  {
      13    struct {
      14      char a8[8], an[n], bn[n];
      15    } *p = sink (0);
      16  
      17    {
      18      char *d = p->a8 + i;
      19      char *s = p->a8;
      20      sprintf (d, "%s", s);       // { dg-warning "argument 3 may overlap" }
      21      sink (p);
      22    }
      23  
      24    {
      25      char *d = p->a8;
      26      char *s = p->a8 + j;
      27      sprintf (d, "%s", s);       // { dg-warning "argument 3 may overlap" }
      28      sink (p);
      29    }
      30  
      31    {
      32      char *d = p->a8 + i;
      33      char *s = p->a8 + j;
      34      sprintf (d, "%s", s);       // { dg-warning "argument 3 may overlap" }
      35      sink (p);
      36    }
      37  
      38    {
      39      char *d = p->a8 + i;
      40      char *s = p->an;
      41      sprintf (d, "%s", s);
      42      sink (p);
      43    }
      44  
      45    {
      46      char *d = p->a8;
      47      char *s = p->an + j;
      48      sprintf (d, "%s", s);
      49      sink (p);
      50    }
      51  
      52    {
      53      char *d = p->a8 + i;
      54      char *s = p->an + j;
      55      sprintf (d, "%s", s);
      56      sink (p);
      57    }
      58  
      59    {
      60      /* The IL makes it impossible to rule out an overlap between
      61         p->a8 + i and p->bn + i so the "may overlap" warning triggers.  */
      62      char *d = p->a8 + i;
      63      char *s = p->bn;
      64      sprintf (d, "%s", s);       // { dg-bogus "-Wrestrict" "pr??????" { xfail *-*-* } }
      65      sink (p);
      66    }
      67  
      68    {
      69      char *d = p->a8;
      70      char *s = p->bn + j;
      71      sprintf (d, "%s", s);       // { dg-bogus "-Wrestrict" "pr??????" { xfail *-*-* } }
      72      sink (p);
      73    }
      74  
      75    {
      76      char *d = p->a8 + i;
      77      char *s = p->bn + j;
      78      sprintf (d, "%s", s);       // { dg-bogus "-Wrestrict" "pr??????" { xfail *-*-* } }
      79      sink (p);
      80    }
      81  
      82    {
      83      char *d = p->an + i;
      84      char *s = p->bn;
      85      sprintf (d, "%s", s);
      86      sink (p);
      87    }
      88  
      89    {
      90      char *d = p->an;
      91      char *s = p->bn + j;
      92      sprintf (d, "%s", s);
      93      sink (p);
      94    }
      95  
      96    {
      97      char *d = p->an + i;
      98      char *s = p->bn + j;
      99      sprintf (d, "%s", s);
     100      sink (p);
     101    }
     102  
     103    {
     104      char *d = p->an + i;
     105      char *s = p->a8;
     106      sprintf (d, "%s", s);
     107      sink (p);
     108    }
     109  
     110    {
     111      char *d = p->an;
     112      char *s = p->a8 + j;
     113      sprintf (d, "%s", s);
     114      sink (p);
     115    }
     116  
     117    {
     118      char *d = p->an + i;
     119      char *s = p->a8 + j;
     120      sprintf (d, "%s", s);
     121      sink (p);
     122    }
     123  
     124    {
     125      char *d = p->bn + i;
     126      char *s = p->a8;
     127      sprintf (d, "%s", s);       // { dg-bogus "-Wrestrict" "pr??????" { xfail *-*-* } }
     128      sink (p);
     129    }
     130  
     131    {
     132      char *d = p->bn;
     133      char *s = p->a8 + j;
     134      sprintf (d, "%s", s);       // { dg-bogus "-Wrestrict" "pr??????" { xfail *-*-* } }
     135      sink (p);
     136    }
     137  
     138    {
     139      char *d = p->bn + i;
     140      char *s = p->a8 + j;
     141      sprintf (d, "%s", s);       // { dg-bogus "-Wrestrict" "pr??????" { xfail *-*-* } }
     142      sink (p);
     143    }
     144  
     145    {
     146      char *d = p->bn + i;
     147      char *s = p->bn;
     148      sprintf (d, "%s", s);       // { dg-warning "may overlap" }
     149      sink (p);
     150    }
     151  
     152    {
     153      char *d = p->bn;
     154      char *s = p->bn + j;
     155      sprintf (d, "%s", s);       // { dg-warning "may overlap" }
     156      sink (p);
     157    }
     158  
     159    {
     160      char *d = p->bn + i;
     161      char *s = p->bn + j;
     162      sprintf (d, "%s", s);       // { dg-warning "may overlap" }
     163      sink (p);
     164    }
     165  }