(root)/
gcc-13.2.0/
gcc/
testsuite/
c-c++-common/
Waddress-3.c
       1  /* PR c/102103 - missing warning comparing array address to null
       2     { dg-do compile }
       3     { dg-options "-Wall" } */
       4  
       5  typedef __INTPTR_TYPE__  intptr_t;
       6  typedef __UINTPTR_TYPE__ uintptr_t;
       7  
       8  #ifndef __cplusplus
       9  #  define bool _Bool
      10  #endif
      11  
      12  struct S { void *p, *a1[2], *a2[2][2]; } s, *p;
      13  
      14  extern const void *a1[2];
      15  extern void *a2[2][2], *ax[];
      16  
      17  void T (bool);
      18  
      19  void test_array_eq_0 (int i)
      20  {
      21    // Verify that casts intptr_t suppress the warning.
      22    T ((intptr_t)a1 == 0);
      23    T ((uintptr_t)a1 == 0);
      24    T (a1 == 0);          // { dg-warning "-Waddress" }
      25    T (0 == &a1);         // { dg-warning "-Waddress" }
      26    // Verify that casts to other pointer types don't suppress it.
      27    T ((void *)a1 == 0);  // { dg-warning "-Waddress" }
      28    T ((char *)a1 == 0);  // { dg-warning "-Waddress" }
      29    T (a1[0] == 0);
      30    T (0 == (intptr_t)&a1[0]);
      31    T (0 == &a1[0]);      // { dg-warning "-Waddress" }
      32    T (a1[i] == 0);
      33    T (0 == (uintptr_t)&a1[i]);
      34    T (0 == &a1[i]);      // { dg-warning "-Waddress" }
      35  
      36    T ((intptr_t)a2 == 0);
      37    T (a2 == 0);          // { dg-warning "-Waddress" }
      38    T (0 == &a2);         // { dg-warning "-Waddress" }
      39    T (a2[0] == 0);       // { dg-warning "-Waddress" }
      40    T (0 == &a1[0]);      // { dg-warning "-Waddress" }
      41    T (a2[i] == 0);       // { dg-warning "-Waddress" }
      42    T (0 == &a2[i]);      // { dg-warning "-Waddress" }
      43    T (a2[0][0] == 0);
      44    T (0 == &a2[0][0]);   // { dg-warning "-Waddress" }
      45    T (&ax == 0);         // { dg-warning "-Waddress" }
      46    T (0 == &ax);         // { dg-warning "-Waddress" }
      47    T (&ax[0] == 0);      // { dg-warning "-Waddress" }
      48    T (0 == ax[0]);
      49  }
      50  
      51  
      52  void test_array_neq_0 (int i)
      53  {
      54    // Verify that casts to intptr_t suppress the warning.
      55    T ((uintptr_t)a1);
      56  
      57    T (a1);               // { dg-warning "-Waddress" }
      58    T ((void *)a1);       // { dg-warning "-Waddress" }
      59    T (&a1 != 0);         // { dg-warning "-Waddress" }
      60    T (a1[0]);
      61    T (&a1[0] != 0);      // { dg-warning "-Waddress" }
      62    T (a1[i]);
      63    T (&a1[i] != 0);      // { dg-warning "-Waddress" }
      64  
      65    T ((intptr_t)a2);
      66    T (a2);               // { dg-warning "-Waddress" }
      67    T ((void *)a2);       // { dg-warning "-Waddress" }
      68    T ((char *)a2);       // { dg-warning "-Waddress" }
      69    T (&a2 != 0);         // { dg-warning "-Waddress" }
      70    T (a2[0]);            // { dg-warning "-Waddress" }
      71    T (&a1[0] != 0);      // { dg-warning "-Waddress" }
      72    T (a2[i]);            // { dg-warning "-Waddress" }
      73    T (&a2[i] != 0);      // { dg-warning "-Waddress" }
      74    T (a2[0][0]);
      75    T (&a2[0][0] != 0);   // { dg-warning "-Waddress" }
      76  }
      77  
      78  
      79  void test_member_array_eq_0 (int i)
      80  {
      81    // Verify that casts to intptr_t suppress the warning.
      82    T ((intptr_t)s.a1 == 0);
      83    T (s.a1 == 0);        // { dg-warning "-Waddress" }
      84    T (0 == &a1);         // { dg-warning "-Waddress" }
      85    T (s.a1[0] == 0);
      86    T ((void*)s.a1);      // { dg-warning "-Waddress" }
      87    T (0 == &a1[0]);      // { dg-warning "-Waddress" }
      88    T (s.a1[i] == 0);
      89    T (0 == &a1[i]);      // { dg-warning "-Waddress" }
      90  
      91    T ((uintptr_t)s.a2 == 0);
      92    T (s.a2 == 0);        // { dg-warning "-Waddress" }
      93    T (0 == &a2);         // { dg-warning "-Waddress" }
      94    T ((void *)s.a2 == 0);// { dg-warning "-Waddress" }
      95    T (s.a2[0] == 0);     // { dg-warning "-Waddress" }
      96    T (0 == &a1[0]);      // { dg-warning "-Waddress" }
      97    T (s.a2[i] == 0);     // { dg-warning "-Waddress" }
      98    T (0 == &a2[i]);      // { dg-warning "-Waddress" }
      99    T (s.a2[0][0] == 0);
     100    T (0 == &a2[0][0]); // { dg-warning "-Waddress" }
     101  }
     102  
     103  
     104  void test_member_array_neq_0 (int i)
     105  {
     106    // Verify that casts to intptr_t suppress the warning.
     107    T ((uintptr_t)s.a1);
     108    T (s.a1);             // { dg-warning "-Waddress" }
     109    T (&s.a1 != 0);       // { dg-warning "-Waddress" }
     110    T ((void *)&s.a1[0]); // { dg-warning "-Waddress" }
     111    T (s.a1[0]);
     112    T (&s.a1[0] != 0);    // { dg-warning "-Waddress" }
     113    T (s.a1[i]);
     114    T (&s.a1[i] != 0);    // { dg-warning "-Waddress" }
     115  
     116    T ((intptr_t)s.a2);
     117    T (s.a2);             // { dg-warning "-Waddress" }
     118    T (&s.a2 != 0);       // { dg-warning "-Waddress" }
     119    T (s.a2[0]);          // { dg-warning "-Waddress" }
     120    T (&s.a1[0] != 0);    // { dg-warning "-Waddress" }
     121    T (s.a2[i]);          // { dg-warning "-Waddress" }
     122    T (&s.a2[i] != 0);    // { dg-warning "-Waddress" }
     123    T (s.a2[0][0]);
     124    T (&s.a2[0][0] != 0); // { dg-warning "-Waddress" }
     125  }