annotate gcc/testsuite/gcc.dg/attr-alloc_size-3.c @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* PR c/77531 - __attribute__((alloc_size(1,2))) could also warn on
kono
parents:
diff changeset
2 multiplication overflow
kono
parents:
diff changeset
3 PR c/78284 - warn on malloc with very large arguments
kono
parents:
diff changeset
4 Test exercising the ability to detect and diagnose calls to allocation
kono
parents:
diff changeset
5 functions decorated with attribute alloc_size that either overflow or
kono
parents:
diff changeset
6 exceed the default maximum object size (with -Walloc-size-larger-than
kono
parents:
diff changeset
7 not explicitly specified). */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
8 /* { dg-do compile { target size32plus } } */
111
kono
parents:
diff changeset
9 /* { dg-options "-O2 -Wall" } */
kono
parents:
diff changeset
10
kono
parents:
diff changeset
11 #define SCHAR_MAX __SCHAR_MAX__
kono
parents:
diff changeset
12 #define SCHAR_MIN (-SCHAR_MAX - 1)
kono
parents:
diff changeset
13 #define UCHAR_MAX (SCHAR_MAX * 2 + 1)
kono
parents:
diff changeset
14
kono
parents:
diff changeset
15 #define SHRT_MAX __SHRT_MAX__
kono
parents:
diff changeset
16 #define SHRT_MIN (-SHRT_MAX - 1)
kono
parents:
diff changeset
17 #define USHRT_MAX (SHRT_MAX * 2 + 1)
kono
parents:
diff changeset
18
kono
parents:
diff changeset
19 #define INT_MAX __INT_MAX__
kono
parents:
diff changeset
20 #define INT_MIN (-INT_MAX - 1)
kono
parents:
diff changeset
21 #define UINT_MAX (INT_MAX * 2U + 1)
kono
parents:
diff changeset
22
kono
parents:
diff changeset
23 #define LONG_MAX __LONG_MAX__
kono
parents:
diff changeset
24 #define LONG_MIN (-LONG_MAX - 1L)
kono
parents:
diff changeset
25 #define ULONG_MAX (LONG_MAX * 2LU + 1)
kono
parents:
diff changeset
26
kono
parents:
diff changeset
27 #define LLONG_MAX __LLONG_MAX__
kono
parents:
diff changeset
28 #define LLONG_MIN (-LLONG_MAX - 1LL)
kono
parents:
diff changeset
29 #define ULLONG_MAX (ULLONG_MAX * 2LLU + 1)
kono
parents:
diff changeset
30
kono
parents:
diff changeset
31 #define PTRDIFF_MAX __PTRDIFF_MAX__
kono
parents:
diff changeset
32 #define PTRDIFF_MIN (-PTRDIFF_MAX - 1)
kono
parents:
diff changeset
33 #define SIZE_MAX __SIZE_MAX__
kono
parents:
diff changeset
34
kono
parents:
diff changeset
35 typedef __PTRDIFF_TYPE__ ptrdiff_t;
kono
parents:
diff changeset
36 typedef __SIZE_TYPE__ size_t;
kono
parents:
diff changeset
37
kono
parents:
diff changeset
38 #define ALLOC_SIZE(...) __attribute__ ((alloc_size (__VA_ARGS__)))
kono
parents:
diff changeset
39
kono
parents:
diff changeset
40 void* f_uchar_1 (unsigned char) ALLOC_SIZE (1);
kono
parents:
diff changeset
41 void* f_uchar_2 (unsigned char, unsigned char) ALLOC_SIZE (1, 2);
kono
parents:
diff changeset
42 void* f_schar_1 (signed char) ALLOC_SIZE (1);
kono
parents:
diff changeset
43 void* f_schar_2 (signed char, signed char) ALLOC_SIZE (1, 2);
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 void* f_ushrt_1 (unsigned short) ALLOC_SIZE (1);
kono
parents:
diff changeset
46 void* f_ushrt_2 (unsigned short, unsigned short) ALLOC_SIZE (1, 2);
kono
parents:
diff changeset
47 void* f_shrt_1 (signed short) ALLOC_SIZE (1);
kono
parents:
diff changeset
48 void* f_shrt_2 (signed short, signed short) ALLOC_SIZE (1, 2);
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 void* f_uint_1 (unsigned) ALLOC_SIZE (1);
kono
parents:
diff changeset
51 void* f_uint_2 (unsigned, unsigned) ALLOC_SIZE (1, 2);
kono
parents:
diff changeset
52 void* f_int_1 (int) ALLOC_SIZE (1);
kono
parents:
diff changeset
53 void* f_int_2 (int, int) ALLOC_SIZE (1, 2);
kono
parents:
diff changeset
54
kono
parents:
diff changeset
55 void* f_ulong_1 (unsigned long) ALLOC_SIZE (1);
kono
parents:
diff changeset
56 void* f_ulong_2 (unsigned long, unsigned long) ALLOC_SIZE (1, 2);
kono
parents:
diff changeset
57 void* f_long_1 (long) ALLOC_SIZE (1);
kono
parents:
diff changeset
58 void* f_long_2 (long, long) ALLOC_SIZE (1, 2);
kono
parents:
diff changeset
59
kono
parents:
diff changeset
60 void* f_ullong_1 (unsigned long long) ALLOC_SIZE (1);
kono
parents:
diff changeset
61 void* f_ullong_2 (unsigned long long, unsigned long long) ALLOC_SIZE (1, 2);
kono
parents:
diff changeset
62 void* f_llong_1 (long long) ALLOC_SIZE (1);
kono
parents:
diff changeset
63 void* f_llong_2 (long long, long long) ALLOC_SIZE (1, 2);
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 void* f_size_1 (size_t) ALLOC_SIZE (1);
kono
parents:
diff changeset
66 void* f_size_2 (size_t, size_t) ALLOC_SIZE (1, 2);
kono
parents:
diff changeset
67
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
68 static size_t
111
kono
parents:
diff changeset
69 unsigned_range (size_t min, size_t max)
kono
parents:
diff changeset
70 {
kono
parents:
diff changeset
71 extern size_t random_unsigned_value (void);
kono
parents:
diff changeset
72 size_t val = random_unsigned_value ();
kono
parents:
diff changeset
73 if (val < min || max < val) val = min;
kono
parents:
diff changeset
74 return val;
kono
parents:
diff changeset
75 }
kono
parents:
diff changeset
76
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
77 static long long
111
kono
parents:
diff changeset
78 signed_range (long long min, long long max)
kono
parents:
diff changeset
79 {
kono
parents:
diff changeset
80 extern long long random_signed_value (void);
kono
parents:
diff changeset
81 long long val = random_signed_value ();
kono
parents:
diff changeset
82 if (val < min || max < val) val = min;
kono
parents:
diff changeset
83 return val;
kono
parents:
diff changeset
84 }
kono
parents:
diff changeset
85
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
86 static size_t
111
kono
parents:
diff changeset
87 unsigned_anti_range (size_t min, size_t max)
kono
parents:
diff changeset
88 {
kono
parents:
diff changeset
89 extern size_t random_unsigned_value (void);
kono
parents:
diff changeset
90 size_t val = random_unsigned_value ();
kono
parents:
diff changeset
91 if (min <= val && val <= max)
kono
parents:
diff changeset
92 val = min - 1;
kono
parents:
diff changeset
93 return val;
kono
parents:
diff changeset
94 }
kono
parents:
diff changeset
95
kono
parents:
diff changeset
96 #define UR(min, max) unsigned_range (min, max)
kono
parents:
diff changeset
97 #define SR(min, max) signed_range (min, max)
kono
parents:
diff changeset
98
kono
parents:
diff changeset
99 #define UAR(min, max) unsigned_anti_range (min, max)
kono
parents:
diff changeset
100 #define SAR(min, max) signed_anti_range (min, max)
kono
parents:
diff changeset
101
kono
parents:
diff changeset
102
kono
parents:
diff changeset
103 void sink (void*);
kono
parents:
diff changeset
104
kono
parents:
diff changeset
105 void
kono
parents:
diff changeset
106 test_uchar_cst (void)
kono
parents:
diff changeset
107 {
kono
parents:
diff changeset
108 const unsigned char max = UCHAR_MAX;
kono
parents:
diff changeset
109
kono
parents:
diff changeset
110 sink (f_uchar_1 (0));
kono
parents:
diff changeset
111 sink (f_uchar_1 (1));
kono
parents:
diff changeset
112 sink (f_uchar_1 (max));
kono
parents:
diff changeset
113
kono
parents:
diff changeset
114 sink (f_uchar_2 (0, 0));
kono
parents:
diff changeset
115 sink (f_uchar_2 (0, 1));
kono
parents:
diff changeset
116 sink (f_uchar_2 (1, 0));
kono
parents:
diff changeset
117 sink (f_uchar_2 (1, 1));
kono
parents:
diff changeset
118 sink (f_uchar_2 (0, max));
kono
parents:
diff changeset
119 sink (f_uchar_2 (max, 0));
kono
parents:
diff changeset
120 sink (f_uchar_2 (max, max));
kono
parents:
diff changeset
121 }
kono
parents:
diff changeset
122
kono
parents:
diff changeset
123 void
kono
parents:
diff changeset
124 test_uchar_range (unsigned char n, int i)
kono
parents:
diff changeset
125 {
kono
parents:
diff changeset
126 const unsigned char max = UCHAR_MAX;
kono
parents:
diff changeset
127
kono
parents:
diff changeset
128 sink (f_uchar_1 (n));
kono
parents:
diff changeset
129
kono
parents:
diff changeset
130 sink (f_uchar_1 (UR (0, 1)));
kono
parents:
diff changeset
131 sink (f_uchar_1 (UR (1, max)));
kono
parents:
diff changeset
132 sink (f_uchar_1 (UR (0, max - 1)));
kono
parents:
diff changeset
133
kono
parents:
diff changeset
134 sink (f_uchar_1 (UAR (1, 1)));
kono
parents:
diff changeset
135 sink (f_uchar_1 (UAR (1, max - 1)));
kono
parents:
diff changeset
136 sink (f_uchar_1 (UAR (max - 2, max - 1)));
kono
parents:
diff changeset
137
kono
parents:
diff changeset
138 sink (f_uchar_2 (0, n));
kono
parents:
diff changeset
139 sink (f_uchar_2 (0, i));
kono
parents:
diff changeset
140 sink (f_uchar_2 (n, 0));
kono
parents:
diff changeset
141 sink (f_uchar_2 (i, 0));
kono
parents:
diff changeset
142 sink (f_uchar_2 (1, n));
kono
parents:
diff changeset
143 sink (f_uchar_2 (1, i));
kono
parents:
diff changeset
144 sink (f_uchar_2 (n, 1));
kono
parents:
diff changeset
145 sink (f_uchar_2 (i, 1));
kono
parents:
diff changeset
146 sink (f_uchar_2 (max, n));
kono
parents:
diff changeset
147 sink (f_uchar_2 (max, i));
kono
parents:
diff changeset
148 sink (f_uchar_2 (n, max));
kono
parents:
diff changeset
149 sink (f_uchar_2 (i, max));
kono
parents:
diff changeset
150 sink (f_uchar_2 (n, n));
kono
parents:
diff changeset
151 sink (f_uchar_2 (i, i));
kono
parents:
diff changeset
152
kono
parents:
diff changeset
153 sink (f_uchar_2 (UR (0, 1), UR (0, 1)));
kono
parents:
diff changeset
154 sink (f_uchar_2 (UR (1, 2), UR (1, 2)));
kono
parents:
diff changeset
155 sink (f_uchar_2 (UR (1, max), UR (0, 1)));
kono
parents:
diff changeset
156 sink (f_uchar_2 (UR (0, 1), UR (1, max)));
kono
parents:
diff changeset
157 }
kono
parents:
diff changeset
158
kono
parents:
diff changeset
159 void
kono
parents:
diff changeset
160 test_schar_cst (void)
kono
parents:
diff changeset
161 {
kono
parents:
diff changeset
162 const signed char min = SCHAR_MIN;
kono
parents:
diff changeset
163 const signed char max = SCHAR_MAX;
kono
parents:
diff changeset
164
kono
parents:
diff changeset
165 sink (f_schar_1 (min)); /* { dg-warning "argument 1 value .-\[0-9\]+. is negative" } */
kono
parents:
diff changeset
166 sink (f_schar_1 (-1)); /* { dg-warning "argument 1 value .-1. is negative" } */
kono
parents:
diff changeset
167 sink (f_schar_1 (0));
kono
parents:
diff changeset
168 sink (f_schar_1 (1));
kono
parents:
diff changeset
169 sink (f_schar_1 (max));
kono
parents:
diff changeset
170
kono
parents:
diff changeset
171 sink (f_schar_2 (0, min)); /* { dg-warning "argument 2 value .-\[0-9\]+. is negative" } */
kono
parents:
diff changeset
172 sink (f_schar_2 (min, 0)); /* { dg-warning "argument 1 value .-\[0-9\]+. is negative" } */
kono
parents:
diff changeset
173 sink (f_schar_2 (0, -1)); /* { dg-warning "argument 2 value .-1. is negative" } */
kono
parents:
diff changeset
174 sink (f_schar_2 (-1, 0)); /* { dg-warning "argument 1 value .-1. is negative" } */
kono
parents:
diff changeset
175
kono
parents:
diff changeset
176 }
kono
parents:
diff changeset
177
kono
parents:
diff changeset
178 void
kono
parents:
diff changeset
179 test_schar_range (signed char n)
kono
parents:
diff changeset
180 {
kono
parents:
diff changeset
181 const signed char min = SCHAR_MIN;
kono
parents:
diff changeset
182 const signed char max = SCHAR_MAX;
kono
parents:
diff changeset
183
kono
parents:
diff changeset
184 sink (f_schar_1 (n));
kono
parents:
diff changeset
185
kono
parents:
diff changeset
186 sink (f_schar_1 (SR (min, min + 1))); /* { dg-warning "argument 1 range \\\[-\[0-9\]+, -\[0-9\]+\\\] is negative" } */
kono
parents:
diff changeset
187 sink (f_schar_1 (SR (min, 0))); /* { dg-warning "argument 1 range \\\[-\[0-9\]+, 0\\\] is negative" } */
kono
parents:
diff changeset
188 sink (f_schar_1 (SR (-1, 0))); /* { dg-warning "argument 1 range \\\[-1, 0\\\] is negative" } */
kono
parents:
diff changeset
189 sink (f_schar_1 (SR (-1, 1)));
kono
parents:
diff changeset
190 sink (f_schar_1 (SR (0, 1)));
kono
parents:
diff changeset
191 sink (f_schar_1 (SR (0, max - 1)));
kono
parents:
diff changeset
192 sink (f_schar_1 (SR (1, max)));
kono
parents:
diff changeset
193 sink (f_schar_1 (SR (max - 1, max)));
kono
parents:
diff changeset
194
kono
parents:
diff changeset
195 sink (f_schar_2 (n, n));
kono
parents:
diff changeset
196
kono
parents:
diff changeset
197 sink (f_schar_2 (SR (min, min + 1), n)); /* { dg-warning "argument 1 range \\\[-\[0-9\]+, -\[0-9\]+\\\] is negative" } */
kono
parents:
diff changeset
198 sink (f_schar_2 (n, SR (min, min + 1))); /* { dg-warning "argument 2 range \\\[-\[0-9\]+, -\[0-9\]+\\\] is negative" } */
kono
parents:
diff changeset
199 sink (f_schar_2 (SR (min, min + 1), 0)); /* { dg-warning "argument 1 range \\\[-\[0-9\]+, -\[0-9\]+\\\] is negative" } */
kono
parents:
diff changeset
200 sink (f_schar_2 (0, SR (min, min + 1))); /* { dg-warning "argument 2 range \\\[-\[0-9\]+, -\[0-9\]+\\\] is negative" } */
kono
parents:
diff changeset
201 sink (f_schar_2 (SR (min, min + 1), min)); /* { dg-warning "argument 1 range \\\[-\[0-9\]+, -\[0-9\]+\\\] is negative" } */
kono
parents:
diff changeset
202 /* { dg-warning "argument 2 value .-\[0-9\]+. is negative" "argument 2" { target *-*-* } .-1 } */
kono
parents:
diff changeset
203 sink (f_schar_2 (min, SR (min, min + 1))); /* { dg-warning "argument 2 range \\\[-\[0-9\]+, -\[0-9\]+\\\] is negative" } */
kono
parents:
diff changeset
204 /* { dg-warning "argument 1 value .-\[0-9\]+. is negative" "argument 1" { target *-*-* } .-1 } */
kono
parents:
diff changeset
205
kono
parents:
diff changeset
206 sink (f_schar_2 (SR (-1, 0), 0)); /* { dg-warning "argument 1 range \\\[-\[0-9\]+, 0\\\] is negative" } */
kono
parents:
diff changeset
207 sink (f_schar_2 (0, SR (-1, 0))); /* { dg-warning "argument 2 range \\\[-\[0-9\]+, 0\\\] is negative" } */
kono
parents:
diff changeset
208 sink (f_schar_2 (SR (-1, 0), 1)); /* { dg-warning "argument 1 range \\\[-\[0-9\]+, 0\\\] is negative" } */
kono
parents:
diff changeset
209 sink (f_schar_2 (1, SR (-1, 0))); /* { dg-warning "argument 2 range \\\[-\[0-9\]+, 0\\\] is negative" } */
kono
parents:
diff changeset
210 sink (f_schar_2 (SR (-1, 0), n)); /* { dg-warning "argument 1 range \\\[-\[0-9\]+, 0\\\] is negative" } */
kono
parents:
diff changeset
211 sink (f_schar_2 (n, SR (-1, 0))); /* { dg-warning "argument 2 range \\\[-\[0-9\]+, 0\\\] is negative" } */
kono
parents:
diff changeset
212
kono
parents:
diff changeset
213 sink (f_schar_2 (max, SR (1, max)));
kono
parents:
diff changeset
214 sink (f_schar_2 (SR (1, max), max));
kono
parents:
diff changeset
215 }
kono
parents:
diff changeset
216
kono
parents:
diff changeset
217 void
kono
parents:
diff changeset
218 test_ushrt_cst (void)
kono
parents:
diff changeset
219 {
kono
parents:
diff changeset
220 const unsigned short max = USHRT_MAX;
kono
parents:
diff changeset
221
kono
parents:
diff changeset
222 sink (f_ushrt_1 (0));
kono
parents:
diff changeset
223 sink (f_ushrt_1 (1));
kono
parents:
diff changeset
224 sink (f_ushrt_1 (max));
kono
parents:
diff changeset
225
kono
parents:
diff changeset
226 sink (f_ushrt_2 (0, 0));
kono
parents:
diff changeset
227 sink (f_ushrt_2 (0, 1));
kono
parents:
diff changeset
228 sink (f_ushrt_2 (1, 0));
kono
parents:
diff changeset
229 sink (f_ushrt_2 (1, 1));
kono
parents:
diff changeset
230 sink (f_ushrt_2 (0, max));
kono
parents:
diff changeset
231 sink (f_ushrt_2 (max, 0));
kono
parents:
diff changeset
232
kono
parents:
diff changeset
233 if (max < SIZE_MAX && (size_t)max * max < SIZE_MAX / 2)
kono
parents:
diff changeset
234 sink (f_ushrt_2 (max, max));
kono
parents:
diff changeset
235 }
kono
parents:
diff changeset
236
kono
parents:
diff changeset
237 void
kono
parents:
diff changeset
238 test_ushrt_range (unsigned short n)
kono
parents:
diff changeset
239 {
kono
parents:
diff changeset
240 const unsigned short max = USHRT_MAX;
kono
parents:
diff changeset
241
kono
parents:
diff changeset
242 sink (f_ushrt_1 (n));
kono
parents:
diff changeset
243 sink (f_ushrt_1 (UR (0, 1)));
kono
parents:
diff changeset
244 sink (f_ushrt_1 (UR (1, max - 1)));
kono
parents:
diff changeset
245 sink (f_ushrt_1 (UR (1, max)));
kono
parents:
diff changeset
246 sink (f_ushrt_1 (UR (0, max - 1)));
kono
parents:
diff changeset
247 }
kono
parents:
diff changeset
248
kono
parents:
diff changeset
249 void
kono
parents:
diff changeset
250 test_shrt_cst (void)
kono
parents:
diff changeset
251 {
kono
parents:
diff changeset
252 const short min = SHRT_MIN;
kono
parents:
diff changeset
253 const short max = SHRT_MAX;
kono
parents:
diff changeset
254
kono
parents:
diff changeset
255 sink (f_shrt_1 (min)); /* { dg-warning "argument 1 value .-\[0-9\]+. is negative" } */
kono
parents:
diff changeset
256 sink (f_shrt_1 (-1)); /* { dg-warning "argument 1 value .-1. is negative" } */
kono
parents:
diff changeset
257 sink (f_shrt_1 (0));
kono
parents:
diff changeset
258 sink (f_shrt_1 (1));
kono
parents:
diff changeset
259 sink (f_shrt_1 (max));
kono
parents:
diff changeset
260 }
kono
parents:
diff changeset
261
kono
parents:
diff changeset
262 void
kono
parents:
diff changeset
263 test_shrt_range (short n)
kono
parents:
diff changeset
264 {
kono
parents:
diff changeset
265 const short min = SHRT_MIN;
kono
parents:
diff changeset
266 const short max = SHRT_MAX;
kono
parents:
diff changeset
267
kono
parents:
diff changeset
268 sink (f_shrt_1 (n));
kono
parents:
diff changeset
269
kono
parents:
diff changeset
270 sink (f_shrt_1 (SR (min, min + 1))); /* { dg-warning "argument 1 range \\\[-\[0-9\]+, -\[0-9\]+\\\] is negative" } */
kono
parents:
diff changeset
271 sink (f_shrt_1 (SR (min, 0))); /* { dg-warning "argument 1 range \\\[-\[0-9\]+, 0\\\] is negative" } */
kono
parents:
diff changeset
272 sink (f_shrt_1 (SR (-1, 0))); /* { dg-warning "argument 1 range \\\[-1, 0\\\] is negative" } */
kono
parents:
diff changeset
273 sink (f_shrt_1 (SR (-1, 1)));
kono
parents:
diff changeset
274 sink (f_shrt_1 (SR (0, 1)));
kono
parents:
diff changeset
275 sink (f_shrt_1 (SR (0, max - 1)));
kono
parents:
diff changeset
276 sink (f_shrt_1 (SR (1, max)));
kono
parents:
diff changeset
277 sink (f_shrt_1 (SR (max - 1, max)));
kono
parents:
diff changeset
278 }
kono
parents:
diff changeset
279
kono
parents:
diff changeset
280 void
kono
parents:
diff changeset
281 test_uint_cst (void)
kono
parents:
diff changeset
282 {
kono
parents:
diff changeset
283 const unsigned max = UINT_MAX;
kono
parents:
diff changeset
284
kono
parents:
diff changeset
285 sink (f_uint_1 (0));
kono
parents:
diff changeset
286 sink (f_uint_1 (1));
kono
parents:
diff changeset
287
kono
parents:
diff changeset
288 if (max < SIZE_MAX)
kono
parents:
diff changeset
289 {
kono
parents:
diff changeset
290 sink (f_uint_1 (max - 1));
kono
parents:
diff changeset
291 sink (f_uint_1 (max));
kono
parents:
diff changeset
292 }
kono
parents:
diff changeset
293 }
kono
parents:
diff changeset
294
kono
parents:
diff changeset
295 void
kono
parents:
diff changeset
296 test_uint_range (unsigned n)
kono
parents:
diff changeset
297 {
kono
parents:
diff changeset
298 const unsigned max = UINT_MAX;
kono
parents:
diff changeset
299
kono
parents:
diff changeset
300 sink (f_uint_1 (n));
kono
parents:
diff changeset
301 sink (f_uint_1 (UR (0, 1)));
kono
parents:
diff changeset
302 sink (f_uint_1 (UR (0, max - 1)));
kono
parents:
diff changeset
303 sink (f_uint_1 (UR (1, max - 1)));
kono
parents:
diff changeset
304 sink (f_uint_1 (UR (1, max)));
kono
parents:
diff changeset
305 }
kono
parents:
diff changeset
306
kono
parents:
diff changeset
307 void
kono
parents:
diff changeset
308 test_int_cst (void)
kono
parents:
diff changeset
309 {
kono
parents:
diff changeset
310 const int min = INT_MIN;
kono
parents:
diff changeset
311 const int max = INT_MAX;
kono
parents:
diff changeset
312
kono
parents:
diff changeset
313 sink (f_int_1 (min)); /* { dg-warning "argument 1 value .-\[0-9\]+. is negative" } */
kono
parents:
diff changeset
314 sink (f_int_1 (-1)); /* { dg-warning "argument 1 value .-1. is negative" } */
kono
parents:
diff changeset
315 sink (f_int_1 (0));
kono
parents:
diff changeset
316 sink (f_int_1 (1));
kono
parents:
diff changeset
317 sink (f_int_1 (max));
kono
parents:
diff changeset
318 }
kono
parents:
diff changeset
319
kono
parents:
diff changeset
320 void
kono
parents:
diff changeset
321 test_int_range (int n)
kono
parents:
diff changeset
322 {
kono
parents:
diff changeset
323 const int min = INT_MIN;
kono
parents:
diff changeset
324 const int max = INT_MAX;
kono
parents:
diff changeset
325
kono
parents:
diff changeset
326 sink (f_int_1 (n));
kono
parents:
diff changeset
327
kono
parents:
diff changeset
328 sink (f_int_1 (SR (min, min + 1))); /* { dg-warning "argument 1 range \\\[-\[0-9\]+, -\[0-9\]+\\\] is negative" } */
kono
parents:
diff changeset
329 sink (f_int_1 (SR (min, 0))); /* { dg-warning "argument 1 range \\\[-\[0-9\]+, 0\\\] is negative" } */
kono
parents:
diff changeset
330 sink (f_int_1 (SR (-1, 0))); /* { dg-warning "argument 1 range \\\[-1, 0\\\] is negative" } */
kono
parents:
diff changeset
331 sink (f_int_1 (SR (-1, 1)));
kono
parents:
diff changeset
332 sink (f_int_1 (SR (0, 1)));
kono
parents:
diff changeset
333 sink (f_int_1 (SR (0, max - 1)));
kono
parents:
diff changeset
334 sink (f_int_1 (SR (1, max)));
kono
parents:
diff changeset
335 sink (f_int_1 (SR (max - 1, max)));
kono
parents:
diff changeset
336 }
kono
parents:
diff changeset
337
kono
parents:
diff changeset
338 void
kono
parents:
diff changeset
339 test_ulong_cst (void)
kono
parents:
diff changeset
340 {
kono
parents:
diff changeset
341 const unsigned long max = ULONG_MAX;
kono
parents:
diff changeset
342
kono
parents:
diff changeset
343 sink (f_ulong_1 (0));
kono
parents:
diff changeset
344 sink (f_ulong_1 (1));
kono
parents:
diff changeset
345 #if ULONG_MAX < SIZE_MAX
kono
parents:
diff changeset
346 sink (f_ulong_1 (max - 1));
kono
parents:
diff changeset
347 sink (f_ulong_1 (max));
kono
parents:
diff changeset
348 #else
kono
parents:
diff changeset
349 (void)&max;
kono
parents:
diff changeset
350 #endif
kono
parents:
diff changeset
351 }
kono
parents:
diff changeset
352
kono
parents:
diff changeset
353 void
kono
parents:
diff changeset
354 test_ulong_range (unsigned long n)
kono
parents:
diff changeset
355 {
kono
parents:
diff changeset
356 const unsigned long max = ULONG_MAX;
kono
parents:
diff changeset
357
kono
parents:
diff changeset
358 sink (f_ulong_1 (n));
kono
parents:
diff changeset
359 sink (f_ulong_1 (UR (0, 1)));
kono
parents:
diff changeset
360 sink (f_ulong_1 (UR (0, max - 1)));
kono
parents:
diff changeset
361 sink (f_ulong_1 (UR (1, max - 1)));
kono
parents:
diff changeset
362 sink (f_ulong_1 (UR (1, max)));
kono
parents:
diff changeset
363 }
kono
parents:
diff changeset
364
kono
parents:
diff changeset
365 void
kono
parents:
diff changeset
366 test_long_cst (void)
kono
parents:
diff changeset
367 {
kono
parents:
diff changeset
368 const long min = LONG_MIN;
kono
parents:
diff changeset
369 const long max = LONG_MAX;
kono
parents:
diff changeset
370
kono
parents:
diff changeset
371 sink (f_long_1 (min)); /* { dg-warning "argument 1 value .-\[0-9\]+l*. is negative" } */
kono
parents:
diff changeset
372 sink (f_long_1 (-1)); /* { dg-warning "argument 1 value .-1l*. is negative" } */
kono
parents:
diff changeset
373 sink (f_long_1 (0));
kono
parents:
diff changeset
374 sink (f_long_1 (1));
kono
parents:
diff changeset
375 sink (f_long_1 (max));
kono
parents:
diff changeset
376 }
kono
parents:
diff changeset
377
kono
parents:
diff changeset
378 void
kono
parents:
diff changeset
379 test_long_range (long n)
kono
parents:
diff changeset
380 {
kono
parents:
diff changeset
381 const long min = LONG_MIN;
kono
parents:
diff changeset
382 const long max = LONG_MAX;
kono
parents:
diff changeset
383
kono
parents:
diff changeset
384 sink (f_long_1 (n));
kono
parents:
diff changeset
385
kono
parents:
diff changeset
386 sink (f_long_1 (SR (min, min + 1))); /* { dg-warning "argument 1 range \\\[-\[0-9\]+l*, -\[0-9\]+l*\\\] is negative" } */
kono
parents:
diff changeset
387 sink (f_long_1 (SR (min, 0))); /* { dg-warning "argument 1 range \\\[-\[0-9\]+l*, 0l*\\\] is negative" } */
kono
parents:
diff changeset
388 sink (f_long_1 (SR (-1, 0))); /* { dg-warning "argument 1 range \\\[-1l*, 0l*\\\] is negative" } */
kono
parents:
diff changeset
389 sink (f_long_1 (SR (-1, 1)));
kono
parents:
diff changeset
390 sink (f_long_1 (SR (0, 1)));
kono
parents:
diff changeset
391 sink (f_long_1 (SR (0, max - 1)));
kono
parents:
diff changeset
392 sink (f_long_1 (SR (1, max)));
kono
parents:
diff changeset
393 sink (f_long_1 (SR (max - 1, max)));
kono
parents:
diff changeset
394 }
kono
parents:
diff changeset
395
kono
parents:
diff changeset
396 void
kono
parents:
diff changeset
397 test_size_cst (void)
kono
parents:
diff changeset
398 {
kono
parents:
diff changeset
399 const size_t max = __SIZE_MAX__;
kono
parents:
diff changeset
400
kono
parents:
diff changeset
401 sink (f_size_1 (0));
kono
parents:
diff changeset
402 sink (f_size_1 (1));
kono
parents:
diff changeset
403 sink (f_size_1 (max - 1)); /* { dg-warning "argument 1 value .\[0-9\]+. exceeds maximum object size \[0-9\]+" } */
kono
parents:
diff changeset
404 sink (f_size_1 (max)); /* { dg-warning "argument 1 value .\[0-9\]+. exceeds maximum object size \[0-9\]+" } */
kono
parents:
diff changeset
405
kono
parents:
diff changeset
406 sink (f_size_2 (0, max - 1)); /* { dg-warning "argument 2 value .\[0-9\]+. exceeds maximum object size \[0-9\]+" } */
kono
parents:
diff changeset
407 sink (f_size_2 (max - 1, 0)); /* { dg-warning "argument 1 value .\[0-9\]+. exceeds maximum object size \[0-9\]+" } */
kono
parents:
diff changeset
408 sink (f_size_2 (1, max - 1)); /* { dg-warning "argument 2 value .\[0-9\]+. exceeds maximum object size \[0-9\]+" } */
kono
parents:
diff changeset
409 sink (f_size_2 (max - 1, 1)); /* { dg-warning "argument 1 value .\[0-9\]+. exceeds maximum object size \[0-9\]+" } */
kono
parents:
diff changeset
410 sink (f_size_2 (max - 1, max - 1)); /* { dg-warning "argument 1 value .\[0-9\]+. exceeds maximum object size \[0-9\]+" } */
kono
parents:
diff changeset
411 /* { dg-warning "argument 2 value .\[0-9\]+. exceeds maximum object size \[0-9\]+" "argument 2" { target *-*-* } .-1 } */
kono
parents:
diff changeset
412
kono
parents:
diff changeset
413 sink (f_size_2 (0, max)); /* { dg-warning "argument 2 value .\[0-9\]+. exceeds maximum object size \[0-9\]+" } */
kono
parents:
diff changeset
414 sink (f_size_2 (max, 0)); /* { dg-warning "argument 1 value .\[0-9\]+. exceeds maximum object size \[0-9\]+" } */
kono
parents:
diff changeset
415
kono
parents:
diff changeset
416 sink (f_size_2 (max / 2, 2)); /* { dg-warning "product .\[0-9\]+ \\* \[0-9\]+. of arguments 1 and 2 exceeds maximum object size \[0-9\]+" } */
kono
parents:
diff changeset
417 sink (f_size_2 (max / 2, 3)); /* { dg-warning "product .\[0-9\]+ \\* \[0-9\]+. of arguments 1 and 2 exceeds .SIZE_MAX." } */
kono
parents:
diff changeset
418 }
kono
parents:
diff changeset
419
kono
parents:
diff changeset
420 void
kono
parents:
diff changeset
421 test_size_range (size_t ui, ptrdiff_t si)
kono
parents:
diff changeset
422 {
kono
parents:
diff changeset
423 const ptrdiff_t smin = PTRDIFF_MIN;
kono
parents:
diff changeset
424 const ptrdiff_t smax = PTRDIFF_MAX;
kono
parents:
diff changeset
425 const size_t umax = SIZE_MAX;
kono
parents:
diff changeset
426
kono
parents:
diff changeset
427 sink (f_size_1 (ui));
kono
parents:
diff changeset
428 sink (f_size_1 (si));
kono
parents:
diff changeset
429
kono
parents:
diff changeset
430 sink (f_size_1 (UR (0, 1)));
kono
parents:
diff changeset
431 sink (f_size_1 (UR (0, umax - 1)));
kono
parents:
diff changeset
432 sink (f_size_1 (UR (1, umax - 1)));
kono
parents:
diff changeset
433 sink (f_size_1 (UR (1, umax)));
kono
parents:
diff changeset
434
kono
parents:
diff changeset
435 sink (f_size_1 (UAR (1, 1)));
kono
parents:
diff changeset
436 /* Since the only valid argument in the anti-range below is zero
kono
parents:
diff changeset
437 a warning is expected even though -Walloc-zero is not specified. */
kono
parents:
diff changeset
438 sink (f_size_1 (UAR (1, umax / 2))); /* { dg-warning "argument 1 range \\\[\[0-9\]+, \[0-9\]+\\\] exceeds maximum object size " } */
kono
parents:
diff changeset
439 /* The only valid argument in this range is 1. */
kono
parents:
diff changeset
440 sink (f_size_1 (UAR (2, umax / 2)));
kono
parents:
diff changeset
441
kono
parents:
diff changeset
442 sink (f_size_2 (ui, ui));
kono
parents:
diff changeset
443 sink (f_size_2 (si, si));
kono
parents:
diff changeset
444 sink (f_size_2 (ui, umax / 2));
kono
parents:
diff changeset
445 sink (f_size_2 (si, umax / 2));
kono
parents:
diff changeset
446 sink (f_size_2 (umax / 2, ui));
kono
parents:
diff changeset
447 sink (f_size_2 (umax / 2, si));
kono
parents:
diff changeset
448
kono
parents:
diff changeset
449 sink (f_size_2 (UR (0, 1), umax)); /* { dg-warning "argument 2 value .\[0-9\]+. exceeds maximum object size " } */
kono
parents:
diff changeset
450 sink (f_size_2 (UR (0, 1), umax / 2));
kono
parents:
diff changeset
451 sink (f_size_2 (UR (0, umax / 2), umax / 2));
kono
parents:
diff changeset
452
kono
parents:
diff changeset
453 sink (f_size_2 (UR (umax / 2 + 1, umax / 2 + 2), ui)); /* { dg-warning "argument 1 range \\\[\[0-9\]+, \[0-9\]+\\\] exceeds maximum object size " } */
kono
parents:
diff changeset
454 sink (f_size_2 (ui, UR (umax / 2 + 1, umax / 2 + 2))); /* { dg-warning "argument 2 range \\\[\[0-9\]+, \[0-9\]+\\\] exceeds maximum object size " } */
kono
parents:
diff changeset
455 sink (f_size_2 (UR (umax / 2 + 1, umax), UR (umax / 2 + 1, umax))); /* { dg-warning "argument 1 range \\\[\[0-9\]+, \[0-9\]+\\\] exceeds maximum object size " } */
kono
parents:
diff changeset
456 /* { dg-warning "argument 2 range \\\[\[0-9\]+, \[0-9\]+\\\] exceeds maximum object size " "argument 2" { target *-*-* } .-1 } */
kono
parents:
diff changeset
457
kono
parents:
diff changeset
458 sink (f_size_2 (SR (smin, 1), 1));
kono
parents:
diff changeset
459 sink (f_size_2 (SR (smin, 1), umax / 2));
kono
parents:
diff changeset
460 sink (f_size_2 (SR (-1, smax), 1));
kono
parents:
diff changeset
461 sink (f_size_2 (SR (-1, smax), umax / 2));
kono
parents:
diff changeset
462 sink (f_size_2 (SR (-1, 1), 1));
kono
parents:
diff changeset
463 sink (f_size_2 (SR (-1, 1), umax / 2));
kono
parents:
diff changeset
464 sink (f_size_2 (SR (-9, 9), 1));
kono
parents:
diff changeset
465 sink (f_size_2 (SR (-9, 9), umax / 2));
kono
parents:
diff changeset
466 }