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