(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
Warray-bounds-88.c
       1  /* PR middle-end/101977 - bogus -Warray-bounds on a negative index into
       2     a parameter in conditional with null
       3     { dg-do compile }
       4     { dg-options "-O2 -Wall" } */
       5  
       6  struct A { int i; };
       7  struct B { struct A a1; struct A a2; };
       8  
       9  
      10  void nowarn_p_0_0 (struct A *p, int i)
      11  {
      12    struct A *q = i < 0 ? p : 0 < i ? (struct A*)0 : 0;
      13    struct B *r = (struct B*)((char *)q - __builtin_offsetof (struct B, a2));
      14    r->a1.i = 0;
      15  }
      16  
      17  void nowarn_0_p_0 (struct A *p, int i)
      18  {
      19    struct A *q = i < 0 ? 0 : 0 < i ? p : 0;
      20    struct B *r = (struct B*)((char *)q - __builtin_offsetof (struct B, a2));
      21    r->a1.i = 0;      // { dg-bogus "-Warray-bounds" }
      22  }
      23  
      24  void nowarn_0_0_p (struct A *p, int i)
      25  {
      26    struct A *q = i < 0 ? 0 : 0 < i ? 0 : p;
      27    struct B *r = (struct B*)((char *)q - __builtin_offsetof (struct B, a2));
      28    r->a1.i = 0;      // { dg-bogus "-Warray-bounds" }
      29  }
      30  
      31  
      32  void nowarn_p_q_0 (struct A *p, struct A *q, int i)
      33  {
      34    struct A *r = i < 0 ? p : 0 < i ? q : 0;
      35    struct B *s = (struct B*)((char *)r - __builtin_offsetof (struct B, a2));
      36    s->a1.i = 0;      // { dg-bogus "-Warray-bounds" }
      37  }
      38  
      39  void nowarn_p_0_q (struct A *p, struct A *q, int i)
      40  {
      41    struct A *r = i < 0 ? p : 0 < i ? 0 : q;
      42    struct B *s = (struct B*)((char *)r - __builtin_offsetof (struct B, a2));
      43    s->a1.i = 0;      // { dg-bogus "-Warray-bounds" }
      44  }
      45  
      46  void nowarn_0_p_q (struct A *p, struct A *q, int i)
      47  {
      48    struct A *r = i < 0 ? 0 : 0 < i ? p : q;
      49    struct B *s = (struct B*)((char *)r - __builtin_offsetof (struct B, a2));
      50    s->a1.i = 0;
      51  }
      52  
      53  
      54  void nowarn_p_q_r (struct A *p, struct A *q, struct A *r, int i)
      55  {
      56    struct A *s = i < 0 ? p : 0 < i ? q : r;
      57    struct B *t = (struct B*)((char *)s - __builtin_offsetof (struct B, a2));
      58    t->a1.i = 0;
      59  }
      60  
      61  
      62  extern struct B b1, b2, b3;
      63  
      64  void nowarn_p_b1_0 (struct A *p, int i)
      65  {
      66    struct A *r = i < 0 ? p : 0 < i ? &b1.a2 : 0;
      67    struct B *s = (struct B*)((char *)r - __builtin_offsetof (struct B, a2));
      68    s->a1.i = 0;      // { dg-bogus "-Warray-bounds" }
      69  }
      70  
      71  void nowarn_p_0_b1 (struct A *p, int i)
      72  {
      73    struct A *r = i < 0 ? p : 0 < i ? 0 : &b1.a2;
      74    struct B *s = (struct B*)((char *)r - __builtin_offsetof (struct B, a2));
      75    s->a1.i = 0;      // { dg-bogus "-Warray-bounds" }
      76  }
      77  
      78  void nowarn_0_p_b1 (struct A *p, int i)
      79  {
      80    struct A *r = i < 0 ? 0 : 0 < i ? p : &b1.a2;
      81    struct B *s = (struct B*)((char *)r - __builtin_offsetof (struct B, a2));
      82    s->a1.i = 0;
      83  }
      84  
      85  
      86  void nowarn_p_b1_b2 (struct A *p, int i)
      87  {
      88    struct A *s = i < 0 ? p : 0 < i ? &b1.a2 : &b2.a2;
      89    struct B *t = (struct B*)((char *)s - __builtin_offsetof (struct B, a2));
      90    t->a1.i = 0;
      91  }
      92  
      93  void nowarn_b1_p_b2 (struct A *p, int i)
      94  {
      95    struct A *s = i < 0 ? &b1.a2 : 0 < i ? p : &b2.a2;
      96    struct B *t = (struct B*)((char *)s - __builtin_offsetof (struct B, a2));
      97    t->a1.i = 0;
      98  }
      99  
     100  void nowarn_b1_b2_p (struct A *p, int i)
     101  {
     102    struct A *s = i < 0 ? &b1.a2 : 0 < i ? &b2.a2 : p;
     103    struct B *t = (struct B*)((char *)s - __builtin_offsetof (struct B, a2));
     104    t->a1.i = 0;
     105  }
     106  
     107  void nowarn_b1_b2_b3 (struct A *p, int i)
     108  {
     109    struct A *s = i < 0 ? &b1.a2 : 0 < i ? &b2.a2 : &b3.a2;
     110    struct B *t = (struct B*)((char *)s - __builtin_offsetof (struct B, a2));
     111    t->a1.i = 0;
     112  }
     113  
     114  
     115  void nowarn_0_b1_b2 (int i)
     116  {
     117    struct A *s = i < 0 ? 0 : 0 < i ? &b1.a2 : &b2.a2;
     118    struct B *t = (struct B*)((char *)s - __builtin_offsetof (struct B, a2));
     119    t->a1.i = 0;
     120  }
     121  
     122  void warn_b1_0_b2 (int i)
     123  {
     124    struct A *s = i < 0 ? &b1.a2 : 0 < i ? 0 : &b2.a2;
     125    struct B *t = (struct B*)((char *)s - __builtin_offsetof (struct B, a2));
     126    t->a1.i = 0;
     127  }
     128  
     129  void warn_b1_b2_0 (int i)
     130  {
     131    struct A *s = i < 0 ? &b1.a2 : 0 < i ? &b2.a2 : 0;
     132    struct B *t = (struct B*)((char *)s - __builtin_offsetof (struct B, a2));
     133    t->a1.i = 0;
     134  }