(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
Warray-bounds-50.c
       1  /* PR middle-end/92349 - ICE in -Warray-bounds on a VLA member
       2     { dg-do compile }
       3     { dg-options "-O2 -Wall" }
       4     { dg-require-effective-target alloca } */
       5  
       6  typedef __SIZE_TYPE__ size_t;
       7  
       8  void sink (void*, ...);
       9  
      10  void mem_vla_cst_store_idx (void)
      11  {
      12    int n = 3;
      13  
      14    struct {
      15      char a[n], b;
      16    } s;
      17  
      18    char *p = s.a;
      19  
      20    s.a[0] = 0;
      21    s.b = 0;
      22  
      23    *++p = 1;
      24    *++p = 2;
      25  
      26    sink (&s, p);
      27  }
      28  
      29  void mem_vla_range_store_idx (int n)
      30  {
      31    if (n < 3 || 4 < n)
      32      n = 3;
      33  
      34    struct {
      35      char a[n], b;
      36    } s;
      37  
      38    char *p = s.a;
      39  
      40    s.a[0] = 0;
      41    s.b = 0;
      42  
      43    *++p = 1;
      44    *++p = 2;
      45  
      46    sink (&s, p);
      47  }
      48  
      49  void mem_vla_var_store_idx (size_t n)
      50  {
      51    struct {
      52      char a[n], b;
      53    } s;
      54  
      55    char *p = s.a;
      56  
      57    s.a[0] = 0;
      58    s.b = 0;
      59  
      60    *++p = 1;
      61    *++p = 2;
      62  
      63    sink (&s, p);
      64  }
      65  
      66  
      67  void mem_vla_cst_store_ptr (void)
      68  {
      69    int n = 3;
      70  
      71    struct {
      72      char a[n], b;
      73    } s;
      74  
      75    char *p = s.a;
      76  
      77    *p++ = __LINE__;
      78    *p++ = __LINE__;
      79    *p++ = __LINE__;
      80  
      81    sink (&s, p);
      82  }
      83  
      84  void mem_vla_range_store_ptr (int n)
      85  {
      86    if (n < 3 || 4 < n)
      87      n = 3;
      88  
      89    struct {
      90      char a[n], b;
      91    } s;
      92  
      93    char *p = s.a;
      94  
      95    *p++ = __LINE__;
      96    *p++ = __LINE__;
      97    *p++ = __LINE__;
      98  
      99    sink (&s, p);
     100  }
     101  
     102  void mem_vla_var_store_ptr (size_t n)
     103  {
     104    struct {
     105      char a[n], b;
     106    } s;
     107  
     108    char *p = s.a;
     109  
     110    *p++ = __LINE__;
     111    *p++ = __LINE__;
     112    *p++ = __LINE__;
     113  
     114    sink (&s, p);
     115  }