(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
Warray-bounds-49.c
       1  /* PR middle-end/91647 - missing -Warray-bounds accessing a zero-length array
       2     of a declared object
       3     { dg-do "compile" }
       4     { dg-options "-O2 -Wall" } */
       5  
       6  struct __attribute__ ((aligned (16))) A16
       7  {
       8    __INT64_TYPE__ i8;
       9    __INT16_TYPE__ i2;
      10    __INT16_TYPE__ a2[];
      11  };
      12  
      13  struct A16 a0 = { };
      14  
      15  void test_a0 (void)
      16  {
      17    // The first three elements fit in the tail padding.
      18    a0.a2[0] = 0; a0.a2[1] = 1; a0.a2[2] = 2;
      19  
      20    a0.a2[3] = 3;     // { dg-warning "array subscript 3 is above array bounds of 'short int\\\[]'" }
      21  }
      22  
      23  
      24  struct A16 a1 = { .a2 = { 1 } };
      25  
      26  void test_a1 (void)
      27  {
      28    a1.a2[0] = 0; a1.a2[1] = 1; a1.a2[2] = 2;
      29  
      30    a1.a2[3] = 3;     // { dg-warning "array subscript 3 is above array bounds of 'short int\\\[]'" }
      31  }
      32  
      33  
      34  struct A16 a2 = { .a2 = { 1, 2 } };
      35  
      36  void test_a2 (void)
      37  {
      38    a2.a2[0] = 0; a2.a2[1] = 1; a2.a2[2] = 2;
      39  
      40    a2.a2[3] = 3;     // { dg-warning "array subscript 3 is above array bounds of 'short int\\\[]'" }
      41  }
      42  
      43  
      44  struct A16 a3 = { .a2 = { 1, 2, 3 } };
      45  
      46  void test_a3 (void)
      47  {
      48    a3.a2[0] = 0; a3.a2[1] = 1; a3.a2[2] = 2;
      49  
      50    a3.a2[3] = 3;     // { dg-warning "array subscript 3 is above array bounds of 'short int\\\[]'" }
      51  }
      52  
      53  
      54  struct A16 a4 = { .a2 = { 1, 2, 3, 4 } };
      55  
      56  void test_a4 (void)
      57  {
      58    a4.a2[0] = 0; a4.a2[1] = 1; a4.a2[2] = 2; a4.a2[3] = 3;
      59  
      60    a4.a2[4] = 4;     // { dg-warning "array subscript 4 is above array bounds of 'short int\\\[]'" }
      61  }
      62  
      63  
      64  struct A16 a5 = { .a2 = { 1, 2, 3, 4, 5 } };
      65  
      66  void test_a5 (void)
      67  {
      68    a5.a2[0] = 0; a5.a2[1] = 1; a5.a2[2] = 2; a5.a2[3] = 3; a5.a2[4] = 4;
      69  
      70    a5.a2[5] = 5;     // { dg-warning "array subscript 5 is above array bounds of 'short int\\\[]'" }
      71  }
      72  
      73  
      74  struct A16 a6 = { .a2 = { 1, 2, 3, 4, 5, 6 } };
      75  
      76  void test_a6 (void)
      77  {
      78    a6.a2[0] = 0; a6.a2[1] = 1; a6.a2[2] = 2; a6.a2[3] = 3; a6.a2[4] = 4;
      79    a6.a2[5] = 5;
      80  
      81    a6.a2[6] = 6;     // { dg-warning "array subscript 6 is above array bounds of 'short int\\\[]'" }
      82  }
      83  
      84  
      85  struct A16 a7 = { .a2 = { 1, 2, 3, 4, 5, 6, 7 } };
      86  
      87  void test_a7 (void)
      88  {
      89    a7.a2[0] = 0; a7.a2[1] = 1; a7.a2[2] = 2; a7.a2[3] = 3; a7.a2[4] = 4;
      90    a7.a2[5] = 5; a7.a2[5] = 5; a7.a2[6] = 6;
      91  
      92    a7.a2[7] = 7;     // { dg-warning "array subscript 7 is above array bounds of 'short int\\\[]'" }
      93  }
      94  
      95  
      96  struct A16 a8 = { .a2 = { 1, 2, 3, 4, 5, 6, 7, 8 } };
      97  
      98  void test_a8 (void)
      99  {
     100    a8.a2[0] = 0; a8.a2[1] = 1; a8.a2[2] = 2; a8.a2[3] = 3; a8.a2[4] = 4;
     101    a8.a2[5] = 5; a8.a2[5] = 5; a8.a2[6] = 6; a8.a2[7] = 7;
     102  
     103    a8.a2[8] = 8;     // { dg-warning "array subscript 8 is above array bounds of 'short int\\\[]'" }
     104  }
     105  
     106  
     107  struct A16 a9 = { .a2 = { 1, 2, 3, 4, 5, 6, 7, 8, 9 } };
     108  
     109  void test_a9 (void)
     110  {
     111    a8.a2[0] = 8; a8.a2[1] = 7; a8.a2[2] = 6; a8.a2[3] = 5; a8.a2[4] = 4;
     112    a8.a2[5] = 3; a8.a2[5] = 2; a8.a2[6] = 1; a8.a2[7] = 0;
     113  
     114    a8.a2[9] = 8;     // { dg-warning "array subscript 9 is above array bounds of 'short int\\\[]'" }
     115  }