(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
attr-alloc_size-10.c
       1  /* Verify that -Walloc-size-greater-than doesn't cause false positives
       2     for anti-ranges.  Note that not all of the statements used to create
       3     anti-ranges below result in the argument being represented as an anti
       4     range.
       5  
       6     { dg-do compile }
       7     { dg-options "-O2 -Walloc-size-larger-than=12" } 
       8     { dg-options "-Wno-overflow" { target { ! int32plus } } } */
       9  
      10  #define SCHAR_MAX __SCHAR_MAX__
      11  #define SCHAR_MIN (-SCHAR_MAX - 1)
      12  #define UCHAR_MAX (SCHAR_MAX * 2 + 1)
      13  
      14  #define SHRT_MAX  __SHRT_MAX__
      15  #define SHRT_MIN  (-SHRT_MAX - 1)
      16  #define USHRT_MAX (SHRT_MAX * 2U + 1)
      17  
      18  #define INT_MAX   __INT_MAX__
      19  #define INT_MIN   (-INT_MAX - 1)
      20  #define UINT_MAX  (INT_MAX * 2U + 1)
      21  
      22  #define LONG_MAX __LONG_MAX__
      23  #define LONG_MIN (-LONG_MAX - 1)
      24  #define ULONG_MAX (LONG_MAX * 2LU + 1)
      25  
      26  #define PTRDIFF_MAX __PTRDIFF_MAX__
      27  #define PTRDIFF_MIN (-PTRDIFF_MAX - 1)
      28  #define SIZE_MAX    __SIZE_MAX__
      29  
      30  typedef __PTRDIFF_TYPE__ ptrdiff_t;
      31  typedef __SIZE_TYPE__    size_t;
      32  
      33  #define CONCAT(a, b)  a ## b
      34  #define CAT(a, b)     CONCAT (a, b)
      35  
      36  /* Macro to generate a unique function to test the anti-range
      37     ~[MIN, MAX] for type T.  */
      38  #define TEST(T, min, max)					\
      39    void* CAT (test_anti_range_, __LINE__)(T n)			\
      40    {								\
      41      extern void* CAT (alloc_anti_range_, __LINE__)(T)		\
      42        __attribute__ ((alloc_size (1)));				\
      43      if (min <= n && n <= max)					\
      44        n = min - 1;						\
      45      return CAT (alloc_anti_range_, __LINE__)(n);		\
      46    } typedef void dummy   /* Require a semicolon.  */
      47  
      48  
      49  /* Verify the anti-range ~[TYPE_MAX - 1, TYPE_MAX - 1].  */
      50  TEST (signed char, SCHAR_MAX - 1, SCHAR_MAX - 1);
      51  TEST (unsigned char, UCHAR_MAX - 1, UCHAR_MAX - 1);
      52  TEST (short, SHRT_MAX - 1, SHRT_MAX - 1);
      53  TEST (unsigned short, USHRT_MAX - 1, USHRT_MAX - 1);
      54  TEST (int, INT_MAX - 1, INT_MAX - 1);
      55  TEST (unsigned, UINT_MAX - 1, UINT_MAX - 1);
      56  TEST (long, LONG_MAX - 1, LONG_MAX - 1);
      57  TEST (unsigned long, ULONG_MAX - 1, ULONG_MAX - 1);
      58  TEST (ptrdiff_t, PTRDIFF_MAX - 1, PTRDIFF_MAX - 1);
      59  TEST (size_t, SIZE_MAX - 1, SIZE_MAX - 1);
      60  
      61  /* Verify ~[0, 0].  */
      62  TEST (signed char, 0, 0);
      63  TEST (unsigned char, 0, 0);
      64  TEST (short, 0, 0);
      65  TEST (unsigned short, 0, 0);
      66  TEST (int, 0, 0);
      67  TEST (unsigned, 0, 0);
      68  TEST (long, 0, 0);
      69  TEST (unsigned long, 0, 0);
      70  TEST (ptrdiff_t, 0, 0);
      71  TEST (size_t, 0, 0);
      72  
      73  /* Verify ~[1, 1].  */
      74  TEST (signed char, 1, 1);
      75  TEST (unsigned char, 1, 1);
      76  TEST (short, 1, 1);
      77  TEST (unsigned short, 1, 1);
      78  TEST (int, 1, 1);
      79  TEST (unsigned, 1, 1);
      80  TEST (long, 1, 1);
      81  TEST (unsigned long, 1, 1);
      82  TEST (ptrdiff_t, 1, 1);
      83  TEST (size_t, 1, 1);
      84  
      85  
      86  /* Verify ~[TYPE_MAX - 2, TYPE_MAX - 1].  */
      87  TEST (signed char, SCHAR_MAX - 2, SCHAR_MAX - 1);
      88  TEST (unsigned char, UCHAR_MAX - 2, UCHAR_MAX - 1);
      89  TEST (short, SHRT_MAX - 2, SHRT_MAX - 1);
      90  TEST (unsigned short, USHRT_MAX - 2, USHRT_MAX - 1);
      91  TEST (int, INT_MAX - 2, INT_MAX - 1);
      92  TEST (unsigned, UINT_MAX - 2, UINT_MAX - 1);
      93  TEST (long, LONG_MAX - 2, LONG_MAX - 1);
      94  TEST (unsigned long, ULONG_MAX - 2, ULONG_MAX - 1);
      95  TEST (ptrdiff_t, PTRDIFF_MAX - 2, PTRDIFF_MAX - 1);
      96  TEST (size_t, SIZE_MAX - 2, SIZE_MAX - 1);
      97  
      98  /* Verify ~[0, 2].  */
      99  TEST (signed char, 0, 2);
     100  TEST (unsigned char, 0, 2);
     101  TEST (short, 0, 2);
     102  TEST (unsigned short, 0, 2);
     103  TEST (int, 0, 2);
     104  TEST (unsigned int, 0, 2);
     105  TEST (long, 0, 2);
     106  TEST (unsigned long, 0, 2);
     107  TEST (ptrdiff_t, 0, 2);
     108  TEST (size_t, 0, 2);
     109  
     110  /* Verify the signed anti-range ~[TYPE_MIN - 2, -1].  */
     111  TEST (signed char, SCHAR_MIN + 2, -1);
     112  TEST (short, SHRT_MIN + 2, -1);
     113  TEST (int, INT_MIN + 2, -1);
     114  TEST (long, LONG_MIN + 2, -1);
     115  TEST (ptrdiff_t, PTRDIFF_MIN + 2, -1);
     116  
     117  /* Verify the signed anti-range ~[TYPE_MIN - 2, 0].  */
     118  TEST (signed char, SCHAR_MIN + 2, 0);
     119  TEST (short, SHRT_MIN + 2, 0);
     120  TEST (int, INT_MIN + 2, 0);
     121  TEST (long, LONG_MIN + 2, 0);
     122  TEST (ptrdiff_t, PTRDIFF_MIN + 2, 0);
     123  
     124  /* Verify the signed anti-range ~[TYPE_MIN - 2, 1].  */
     125  TEST (signed char, SCHAR_MIN + 2, 1);
     126  TEST (short, SHRT_MIN + 2, 1);
     127  TEST (int, INT_MIN + 2, 1);
     128  TEST (long, LONG_MIN + 2, 1);
     129  TEST (ptrdiff_t, PTRDIFF_MIN + 2, 1);
     130  
     131  /* Verify the signed anti-range ~[TYPE_MIN - 2, 2].  */
     132  TEST (signed char, SCHAR_MIN + 2, 2);
     133  TEST (short, SHRT_MIN + 2, 2);
     134  TEST (int, INT_MIN + 2, 2);
     135  TEST (long, LONG_MIN + 2, 2);
     136  TEST (ptrdiff_t, PTRDIFF_MIN + 2, 2);
     137  
     138  /* Verify the signed anti-range ~[-1, 2].  */
     139  TEST (signed char, -1, 2);
     140  TEST (short, -1, 2);
     141  TEST (int, -1, 2);
     142  TEST (long, -1, 2);
     143  TEST (ptrdiff_t, 01, 2);