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); 144