(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
Wstringop-overflow-88.c
       1  /* PR middle-end/101475 - missing -Wstringop-overflow storing a compound
       2     literal
       3     { dg-do compile }
       4     { dg-options "-O2 -fno-tree-vectorize" } */
       5  
       6  extern char ea1[1], ea2[2], ea3[3], ea4[4];
       7  
       8  /* The trailing A member of all of Sx, S0, and S1 is treated the same:
       9     as a flexible array member.  */
      10  struct Sx { char n, a[]; };
      11  struct S0 { char n, a[0]; };
      12  struct S1 { char n, a[1]; };
      13  /* The trailing A member in both S2 and S3 is treated as an ordinary
      14     array with exactly two elements and accesses to elements beyond
      15     the last are diagnosed regardless of whether they are within
      16     the bounds the enclosing object.  */
      17  struct S2 { char n, a[2]; };
      18  struct S3 { char n, a[3]; };
      19  
      20  
      21  void fx_ea1 (void)
      22  {
      23    struct Sx *p = (struct Sx*)ea1;
      24    p->n = 0;
      25    p->a[0] = 0;      // { dg-warning "-Wstringop-overflow" }
      26    p->a[1] = 1;      // { dg-warning "-Wstringop-overflow" }
      27    p->a[2] = 2;      // { dg-warning "-Wstringop-overflow" }
      28    p->a[3] = 3;      // { dg-warning "-Wstringop-overflow" }
      29  }
      30  
      31  void f0_ea1 (void)
      32  {
      33    struct S0 *p = (struct S0*)ea1;
      34    p->n = 0;
      35    p->a[0] = 0;      // { dg-warning "-Wstringop-overflow" }
      36    p->a[1] = 1;      // { dg-warning "-Wstringop-overflow" }
      37    p->a[2] = 2;      // { dg-warning "-Wstringop-overflow" }
      38    p->a[3] = 3;      // { dg-warning "-Wstringop-overflow" }
      39  }
      40  
      41  void f1_ea1 (void)
      42  {
      43    struct S1 *p = (struct S1*)ea1;
      44    p->n = 0;
      45    p->a[0] = 0;      // { dg-warning "-Wstringop-overflow" }
      46    p->a[1] = 1;      // { dg-warning "-Wstringop-overflow" }
      47    p->a[2] = 2;      // { dg-warning "-Wstringop-overflow" }
      48    p->a[3] = 3;      // { dg-warning "-Wstringop-overflow" }
      49  }
      50  
      51  void f2_ea1 (void)
      52  {
      53    struct S2 *p = (struct S2*)ea1;
      54    p->n = 0;
      55    p->a[0] = 0;      // { dg-warning "-Wstringop-overflow" }
      56    p->a[1] = 1;      // { dg-warning "-Wstringop-overflow" }
      57    p->a[2] = 2;      // { dg-warning "-Wstringop-overflow" }
      58    p->a[3] = 3;      // { dg-warning "-Wstringop-overflow" }
      59  }
      60  
      61  void f3_ea1 (void)
      62  {
      63    struct S3 *p = (struct S3*)ea1;
      64    p->n = 0;
      65    p->a[0] = 0;      // { dg-warning "-Wstringop-overflow" }
      66    p->a[1] = 1;      // { dg-warning "-Wstringop-overflow" }
      67    p->a[2] = 2;      // { dg-warning "-Wstringop-overflow" }
      68    p->a[3] = 3;      // { dg-warning "-Wstringop-overflow" }
      69  }
      70  
      71  
      72  void fx_ea1_p1 (void)
      73  {
      74    struct Sx *p = (struct Sx*)(ea1 + 1);
      75    p->n = 0;         // { dg-warning "-Wstringop-overflow" }
      76    p->a[0] = 0;      // { dg-warning "-Wstringop-overflow" }
      77    p->a[1] = 1;      // { dg-warning "-Wstringop-overflow" }
      78    p->a[2] = 2;      // { dg-warning "-Wstringop-overflow" }
      79    p->a[3] = 3;      // { dg-warning "-Wstringop-overflow" }
      80  }
      81  
      82  void f0_ea1_p1 (void)
      83  {
      84    struct S0 *p = (struct S0*)(ea1 + 1);
      85    p->n = 0;         // { dg-warning "-Wstringop-overflow" }
      86    p->a[0] = 0;      // { dg-warning "-Wstringop-overflow" }
      87    p->a[1] = 1;      // { dg-warning "-Wstringop-overflow" }
      88    p->a[2] = 2;      // { dg-warning "-Wstringop-overflow" }
      89    p->a[3] = 3;      // { dg-warning "-Wstringop-overflow" }
      90  }
      91  
      92  void f1_ea1_p1 (void)
      93  {
      94    struct S1 *p = (struct S1*)(ea1 + 1);
      95    p->n = 0;         // { dg-warning "-Wstringop-overflow" }
      96    p->a[0] = 0;      // { dg-warning "-Wstringop-overflow" }
      97    p->a[1] = 1;      // { dg-warning "-Wstringop-overflow" }
      98    p->a[2] = 2;      // { dg-warning "-Wstringop-overflow" }
      99    p->a[3] = 3;      // { dg-warning "-Wstringop-overflow" }
     100  }
     101  
     102  void f2_ea1_p1 (void)
     103  {
     104    struct S2 *p = (struct S2*)(ea1 + 1);
     105    p->n = 0;         // { dg-warning "-Wstringop-overflow" }
     106    p->a[0] = 0;      // { dg-warning "-Wstringop-overflow" }
     107    p->a[1] = 1;      // { dg-warning "-Wstringop-overflow" }
     108    p->a[2] = 2;      // { dg-warning "-Wstringop-overflow" }
     109    p->a[3] = 3;      // { dg-warning "-Wstringop-overflow" }
     110  }
     111  
     112  void f3_ea1_p1 (void)
     113  {
     114    struct S3 *p = (struct S3*)(ea1 + 1);
     115    p->n = 0;         // { dg-warning "-Wstringop-overflow" }
     116    p->a[0] = 0;      // { dg-warning "-Wstringop-overflow" }
     117    p->a[1] = 1;      // { dg-warning "-Wstringop-overflow" }
     118    p->a[2] = 2;      // { dg-warning "-Wstringop-overflow" }
     119    p->a[3] = 3;      // { dg-warning "-Wstringop-overflow" }
     120  }
     121  
     122  
     123  void fx_ea2 (void)
     124  {
     125    struct Sx *p = (struct Sx*)ea2;
     126    p->n = 0;
     127    p->a[0] = 0;
     128    p->a[1] = 1;      // { dg-warning "-Wstringop-overflow" }
     129    p->a[2] = 2;      // { dg-warning "-Wstringop-overflow" }
     130    p->a[3] = 3;      // { dg-warning "-Wstringop-overflow" }
     131  }
     132  
     133  void f0_ea2 (void)
     134  {
     135    struct S0 *p = (struct S0*)ea2;
     136    p->n = 0;
     137    p->a[0] = 0;
     138    p->a[1] = 1;      // { dg-warning "-Wstringop-overflow" }
     139    p->a[2] = 2;      // { dg-warning "-Wstringop-overflow" }
     140    p->a[3] = 3;      // { dg-warning "-Wstringop-overflow" }
     141  }
     142  
     143  void f1_ea2 (void)
     144  {
     145    struct S1 *p = (struct S1*)ea2;
     146    p->n = 0;
     147    p->a[0] = 0;
     148    p->a[1] = 1;      // { dg-warning "-Wstringop-overflow" }
     149    p->a[2] = 2;      // { dg-warning "-Wstringop-overflow" }
     150    p->a[3] = 3;      // { dg-warning "-Wstringop-overflow" }
     151  }
     152  
     153  void f2_ea2 (void)
     154  {
     155    struct S2 *p = (struct S2*)ea2;
     156    p->n = 0;
     157    p->a[0] = 0;
     158    p->a[1] = 1;      // { dg-warning "-Wstringop-overflow" }
     159    p->a[2] = 2;      // { dg-warning "-Wstringop-overflow" }
     160    p->a[3] = 3;      // { dg-warning "-Wstringop-overflow" }
     161  }
     162  
     163  void f3_ea2 (void)
     164  {
     165    struct S3 *p = (struct S3*)ea2;
     166    p->n = 0;
     167    p->a[0] = 0;
     168    p->a[1] = 1;      // { dg-warning "-Wstringop-overflow" }
     169    p->a[2] = 2;      // { dg-warning "-Wstringop-overflow" }
     170    p->a[3] = 3;      // { dg-warning "-Wstringop-overflow" }
     171  }
     172  
     173  
     174  void fx_ea2_p1 (void)
     175  {
     176    struct Sx *p = (struct Sx*)(ea2 + 1);
     177    p->n = 0;
     178    p->a[0] = 0;      // { dg-warning "-Wstringop-overflow" } 
     179    p->a[1] = 1;      // { dg-warning "-Wstringop-overflow" }
     180    p->a[2] = 2;      // { dg-warning "-Wstringop-overflow" }
     181    p->a[3] = 3;      // { dg-warning "-Wstringop-overflow" }
     182  }
     183  
     184  void f0_ea2_p1 (void)
     185  {
     186    struct S0 *p = (struct S0*)(ea2 + 1);
     187    p->n = 0;
     188    p->a[0] = 0;      // { dg-warning "-Wstringop-overflow" }
     189    p->a[1] = 1;      // { dg-warning "-Wstringop-overflow" }
     190    p->a[2] = 2;      // { dg-warning "-Wstringop-overflow" }
     191    p->a[3] = 3;      // { dg-warning "-Wstringop-overflow" }
     192  }
     193  
     194  void f1_ea2_p1 (void)
     195  {
     196    struct S1 *p = (struct S1*)(ea2 + 1);
     197    p->n = 0;
     198    p->a[0] = 0;      // { dg-warning "-Wstringop-overflow" }
     199    p->a[1] = 1;      // { dg-warning "-Wstringop-overflow" }
     200    p->a[2] = 2;      // { dg-warning "-Wstringop-overflow" }
     201    p->a[3] = 3;      // { dg-warning "-Wstringop-overflow" }
     202  }
     203  
     204  void f2_ea2_p1 (void)
     205  {
     206    struct S2 *p = (struct S2*)(ea2 + 1);
     207    p->n = 0;
     208    p->a[0] = 0;      // { dg-warning "-Wstringop-overflow" }
     209    p->a[1] = 1;      // { dg-warning "-Wstringop-overflow" }
     210    p->a[2] = 2;      // { dg-warning "-Wstringop-overflow" }
     211    p->a[3] = 3;      // { dg-warning "-Wstringop-overflow" }
     212  }
     213  
     214  void f3_ea2_p1 (void)
     215  {
     216    struct S3 *p = (struct S3*)(ea2 + 1);
     217    p->n = 0;
     218    p->a[0] = 0;      // { dg-warning "-Wstringop-overflow" }
     219    p->a[1] = 1;      // { dg-warning "-Wstringop-overflow" }
     220    p->a[2] = 2;      // { dg-warning "-Wstringop-overflow" }
     221    p->a[3] = 3;      // { dg-warning "-Wstringop-overflow" }
     222  }
     223  
     224  
     225  void fx_ea3 (void)
     226  {
     227    struct Sx *p = (struct Sx*)ea3;
     228    p->n = 0;
     229    p->a[0] = 0;
     230    p->a[1] = 1;
     231    p->a[2] = 2;      // { dg-warning "-Wstringop-overflow" }
     232    p->a[3] = 3;      // { dg-warning "-Wstringop-overflow" }
     233  }
     234  
     235  void f0_ea3 (void)
     236  {
     237    struct S0 *p = (struct S0*)ea3;
     238    p->n = 0;
     239    p->a[0] = 0;
     240    p->a[1] = 1;
     241    p->a[2] = 2;      // { dg-warning "-Wstringop-overflow" }
     242    p->a[3] = 3;      // { dg-warning "-Wstringop-overflow" }
     243  }
     244  
     245  void f1_ea3 (void)
     246  {
     247    struct S1 *p = (struct S1*)ea3;
     248    p->n = 0;
     249    p->a[0] = 0;
     250    p->a[1] = 1;
     251    p->a[2] = 2;      // { dg-warning "-Wstringop-overflow" }
     252    p->a[3] = 3;      // { dg-warning "-Wstringop-overflow" }
     253  }
     254  
     255  void f2_ea3 (void)
     256  {
     257    struct S2 *p = (struct S2*)ea3;
     258    p->n = 0;
     259    p->a[0] = 0;
     260    p->a[1] = 1;
     261    p->a[2] = 2;      // { dg-warning "-Wstringop-overflow" }
     262    p->a[3] = 3;      // { dg-warning "-Wstringop-overflow" }
     263  }
     264  
     265  void f3_ea3 (void)
     266  {
     267    struct S3 *p = (struct S3*)ea3;
     268    p->n = 0;
     269    p->a[0] = 0;
     270    p->a[1] = 1;
     271    p->a[2] = 2;      // { dg-warning "-Wstringop-overflow" }
     272    p->a[3] = 3;      // { dg-warning "-Wstringop-overflow" }
     273  }
     274  
     275  
     276  void fx_ea4 (void)
     277  {
     278    struct Sx *p = (struct Sx*)ea4;
     279    p->n = 0;
     280    p->a[0] = 0;
     281    p->a[1] = 1;
     282    p->a[2] = 2;
     283    p->a[3] = 3;      // { dg-warning "-Wstringop-overflow" }
     284  }
     285  
     286  void f0_ea4 (void)
     287  {
     288    struct S0 *p = (struct S0*)ea4;
     289    p->n = 0;
     290    p->a[0] = 0;
     291    p->a[1] = 1;
     292    p->a[2] = 2;
     293    p->a[3] = 3;      // { dg-warning "-Wstringop-overflow" }
     294  }
     295  
     296  void f1_ea4 (void)
     297  {
     298    struct S1 *p = (struct S1*)ea4;
     299    p->n = 0;
     300    p->a[0] = 0;
     301    p->a[1] = 1;
     302    p->a[2] = 2;
     303    p->a[3] = 3;      // { dg-warning "-Wstringop-overflow" }
     304  }
     305  
     306  void f2_ea4 (void)
     307  {
     308    struct S2 *p = (struct S2*)ea4;
     309    p->n = 0;
     310    p->a[0] = 0;
     311    p->a[1] = 1;
     312    /* Even though the offset of p->a[2] is within the bounds of EA4
     313       the warning triggers because it only considers trailing arrays
     314       of at mnost one element as "poor man's flexible arrays."  */
     315    p->a[2] = 2;      // { dg-warning "-Wstringop-overflow" }
     316    p->a[3] = 3;      // { dg-warning "-Wstringop-overflow" }
     317  }
     318  
     319  void f3_ea4 (void)
     320  {
     321    struct S3 *p = (struct S3*)ea4;
     322    p->n = 0;
     323    p->a[0] = 0;
     324    p->a[1] = 1;
     325    p->a[2] = 2;
     326    p->a[3] = 3;      // { dg-warning "-Wstringop-overflow" }
     327  }