1  /* PR tree-optimization/92226 - live nul char store to array eliminated
       2     Test to verify warnings are issued for overflow detected thanks to
       3     the enhancement committed on top of the fix for PR 92226.
       4     { dg-do compile }
       5     { dg-options "-O2 -Wall -Wno-array-bounds -ftrack-macro-expansion=0" } */
       6  
       7  #include "strlenopt.h"
       8  
       9  #define NOIPA __attribute__ ((noipa))
      10  
      11  #define T(MIN, MAX, SIZE, IDX)						\
      12    NOIPA void								\
      13    test_ ## MIN ## _ ## MAX ## _ ## SIZE ## _ ## IDX (const char *s)	\
      14    {									\
      15      size_t len = strlen (s);						\
      16      if (MIN <= len && len <= MAX)					\
      17        {									\
      18  	extern char d[];						\
      19  	strcpy (d, s);							\
      20  	d[IDX] = 0;							\
      21  	extern char a ## SIZE[SIZE];					\
      22  	strcpy (a ## SIZE, d);						\
      23        }									\
      24    } typedef void dummy_type
      25  
      26  
      27  T (2, 2, 1, 0);
      28  T (2, 2, 1, 1);     // { dg-warning "writing 2 bytes into a region of size 1" }
      29  T (2, 2, 1, 2);     // { dg-warning "writing 3 bytes into a region of size 1" }
      30  
      31  T (2, 3, 1, 0);
      32  T (2, 3, 1, 1);     // { dg-warning "writing 2 bytes into a region of size 1" }
      33  T (2, 3, 1, 2);     // { dg-warning "writing 3 bytes into a region of size 1" "" { xfail *-*-*} }
      34  T (2, 3, 1, 3);     // { dg-warning "writing 4 bytes into a region of size 1" "" { xfail *-*-* } }
      35  
      36  T (5, 7, 3, 1);
      37  T (5, 7, 3, 2);
      38  T (5, 7, 3, 3);     // { dg-warning "writing 4 bytes into a region of size 3" }
      39  T (5, 7, 3, 4);     // { dg-warning "writing 5 bytes into a region of size 3" }
      40  T (5, 7, 3, 5);     // { dg-warning "writing 6 bytes into a region of size 3" "" { xfail *-*-* } }