annotate gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf.c @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* Test to verify that the return value of calls to __builtin_sprintf
kono
parents:
diff changeset
2 that produce a known number of bytes on output is available for
kono
parents:
diff changeset
3 constant folding. With optimization enabled the test will fail to
kono
parents:
diff changeset
4 link if any of the assertions fails. Without optimization the test
kono
parents:
diff changeset
5 aborts at runtime if any of the assertions fails. */
kono
parents:
diff changeset
6 /* { dg-do run } */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
7 /* { dg-skip-if "not IEEE float layout" { "pdp11-*-*" } } */
111
kono
parents:
diff changeset
8 /* { dg-additional-options "-O2 -Wall -Wno-pedantic -fprintf-return-value" } */
kono
parents:
diff changeset
9
kono
parents:
diff changeset
10 #ifndef LINE
kono
parents:
diff changeset
11 # define LINE 0
kono
parents:
diff changeset
12 #endif
kono
parents:
diff changeset
13
kono
parents:
diff changeset
14 #if __STDC_VERSION__ < 199901L
kono
parents:
diff changeset
15 # define __func__ __FUNCTION__
kono
parents:
diff changeset
16 #endif
kono
parents:
diff changeset
17
kono
parents:
diff changeset
18 typedef __SIZE_TYPE__ size_t;
kono
parents:
diff changeset
19
kono
parents:
diff changeset
20 unsigned ntests;
kono
parents:
diff changeset
21 unsigned nfails;
kono
parents:
diff changeset
22
kono
parents:
diff changeset
23 void __attribute__ ((noclone, noinline))
kono
parents:
diff changeset
24 checkv (const char *func, int line, int res, int min, int max,
kono
parents:
diff changeset
25 char *dst, const char *fmt, __builtin_va_list va)
kono
parents:
diff changeset
26 {
kono
parents:
diff changeset
27 int n = __builtin_vsprintf (dst, fmt, va);
kono
parents:
diff changeset
28 int len = __builtin_strlen (dst);
kono
parents:
diff changeset
29
kono
parents:
diff changeset
30 ++ntests;
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 int fail = 0;
kono
parents:
diff changeset
33 if (n != res)
kono
parents:
diff changeset
34 {
kono
parents:
diff changeset
35 __builtin_printf ("FAIL: %s:%i: \"%s\" expected result for \"%s\" "
kono
parents:
diff changeset
36 "doesn't match function call return value: ",
kono
parents:
diff changeset
37 func, line, fmt, dst);
kono
parents:
diff changeset
38 if (min == max)
kono
parents:
diff changeset
39 __builtin_printf ("%i != %i\n", n, min);
kono
parents:
diff changeset
40 else
kono
parents:
diff changeset
41 __builtin_printf ("%i not in [%i, %i]\n", n, min, max);
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 fail = 1;
kono
parents:
diff changeset
44 }
kono
parents:
diff changeset
45 else
kono
parents:
diff changeset
46 {
kono
parents:
diff changeset
47 if (len < min || max < len)
kono
parents:
diff changeset
48 {
kono
parents:
diff changeset
49 __builtin_printf ("FAIL: %s:%i: \"%s\" expected result for \"%s\" "
kono
parents:
diff changeset
50 "doesn't match output length: ",
kono
parents:
diff changeset
51 func, line, fmt, dst);
kono
parents:
diff changeset
52
kono
parents:
diff changeset
53 if (min == max)
kono
parents:
diff changeset
54 __builtin_printf ("%i != %i\n", len, min);
kono
parents:
diff changeset
55 else
kono
parents:
diff changeset
56 __builtin_printf ("%i not in [%i, %i]\n", len, min, max);
kono
parents:
diff changeset
57
kono
parents:
diff changeset
58 fail = 1;
kono
parents:
diff changeset
59 }
kono
parents:
diff changeset
60 else if (min == max)
kono
parents:
diff changeset
61 __builtin_printf ("PASS: %s:%i: \"%s\" result %i: \"%s\"\n",
kono
parents:
diff changeset
62 func, line, fmt, n, dst);
kono
parents:
diff changeset
63 else
kono
parents:
diff changeset
64 __builtin_printf ("PASS: %s:%i: \"%s\" result %i in [%i, %i]: \"%s\"\n",
kono
parents:
diff changeset
65 func, line, fmt, n, min, max, dst);
kono
parents:
diff changeset
66 }
kono
parents:
diff changeset
67
kono
parents:
diff changeset
68 if (fail)
kono
parents:
diff changeset
69 ++nfails;
kono
parents:
diff changeset
70 }
kono
parents:
diff changeset
71
kono
parents:
diff changeset
72 void __attribute__ ((noclone, noinline))
kono
parents:
diff changeset
73 check (const char *func, int line, int res, int min, int max,
kono
parents:
diff changeset
74 char *dst, const char *fmt, ...)
kono
parents:
diff changeset
75 {
kono
parents:
diff changeset
76 __builtin_va_list va;
kono
parents:
diff changeset
77 __builtin_va_start (va, fmt);
kono
parents:
diff changeset
78 checkv (func, line, res, min, max, dst, fmt, va);
kono
parents:
diff changeset
79 __builtin_va_end (va);
kono
parents:
diff changeset
80 }
kono
parents:
diff changeset
81
kono
parents:
diff changeset
82 char buffer[4100];
kono
parents:
diff changeset
83 char* volatile dst = buffer;
kono
parents:
diff changeset
84 char* ptr = buffer;
kono
parents:
diff changeset
85
kono
parents:
diff changeset
86 #define concat(a, b) a ## b
kono
parents:
diff changeset
87 #define CAT(a, b) concat (a, b)
kono
parents:
diff changeset
88
kono
parents:
diff changeset
89 #if __OPTIMIZE__
kono
parents:
diff changeset
90 /* With optimization references to the following undefined symbol which
kono
parents:
diff changeset
91 is unique for each test case are expected to be eliminated. */
kono
parents:
diff changeset
92 # define TEST_FAILURE(line, ignore1, ignore2, ignore3) \
kono
parents:
diff changeset
93 do { \
kono
parents:
diff changeset
94 extern void CAT (failure_on_line_, line)(void); \
kono
parents:
diff changeset
95 CAT (failure_on_line_, line)(); \
kono
parents:
diff changeset
96 } while (0)
kono
parents:
diff changeset
97 #else
kono
parents:
diff changeset
98 /* The test is run by DejaGnu with optimization enabled. When it's run
kono
parents:
diff changeset
99 with it disabled (i.e., at -O0) each test case is verified at runtime
kono
parents:
diff changeset
100 and the test aborts just before exiting if any of them failed. */
kono
parents:
diff changeset
101 # define TEST_FAILURE(line, result, min, max) \
kono
parents:
diff changeset
102 if (min == max) \
kono
parents:
diff changeset
103 __builtin_printf ("FAIL: %s:%i: expected %i, got %i\n", \
kono
parents:
diff changeset
104 __func__, line, min, result); \
kono
parents:
diff changeset
105 else \
kono
parents:
diff changeset
106 __builtin_printf ("FAIL: %s:%i: expected range [%i, %i], got %i\n", \
kono
parents:
diff changeset
107 __func__, line, min, max, result);
kono
parents:
diff changeset
108 #endif
kono
parents:
diff changeset
109
kono
parents:
diff changeset
110 /* Verify that the result is exactly equal to RES. */
kono
parents:
diff changeset
111 #define EQL(expect, size, fmt, ...) \
kono
parents:
diff changeset
112 if (!LINE || LINE == __LINE__) \
kono
parents:
diff changeset
113 do { \
kono
parents:
diff changeset
114 char *buf = (size) < 0 ? ptr : buffer + sizeof buffer - (size); \
kono
parents:
diff changeset
115 int result = __builtin_sprintf (buf, fmt, __VA_ARGS__); \
kono
parents:
diff changeset
116 if (result != expect) \
kono
parents:
diff changeset
117 { \
kono
parents:
diff changeset
118 TEST_FAILURE (__LINE__, expect, expect, result); \
kono
parents:
diff changeset
119 } \
kono
parents:
diff changeset
120 check (__func__, __LINE__, result, expect, expect, dst, fmt, \
kono
parents:
diff changeset
121 __VA_ARGS__); \
kono
parents:
diff changeset
122 } while (0)
kono
parents:
diff changeset
123
kono
parents:
diff changeset
124 /* Verify that the result is in the range [MIN, MAX]. */
kono
parents:
diff changeset
125 #define RNG(min, max, size, fmt, ...) \
kono
parents:
diff changeset
126 if (!LINE || LINE == __LINE__) \
kono
parents:
diff changeset
127 do { \
kono
parents:
diff changeset
128 char *buf = (size) < 0 ? ptr : buffer + sizeof buffer - (size); \
kono
parents:
diff changeset
129 int result = __builtin_sprintf (buf, fmt, __VA_ARGS__); \
kono
parents:
diff changeset
130 if (result < min || max < result) \
kono
parents:
diff changeset
131 { \
kono
parents:
diff changeset
132 TEST_FAILURE (__LINE__, min, max, result); \
kono
parents:
diff changeset
133 } \
kono
parents:
diff changeset
134 check (__func__, __LINE__, result, min, max, dst, fmt, \
kono
parents:
diff changeset
135 __VA_ARGS__); \
kono
parents:
diff changeset
136 } while (0)
kono
parents:
diff changeset
137
kono
parents:
diff changeset
138 static void __attribute__ ((noinline, noclone))
kono
parents:
diff changeset
139 test_c (char c)
kono
parents:
diff changeset
140 {
kono
parents:
diff changeset
141 EQL (1, 2, "%c", c);
kono
parents:
diff changeset
142 EQL (1, -1, "%c", c);
kono
parents:
diff changeset
143 EQL (1, 2, "%1c", c);
kono
parents:
diff changeset
144 EQL (1, -1, "%1c", c);
kono
parents:
diff changeset
145 EQL (1, 2, "%*c", 1, c);
kono
parents:
diff changeset
146 EQL (1, -1, "%*c", 1, c);
kono
parents:
diff changeset
147 EQL (2, 3, "%c%c", '1', '2');
kono
parents:
diff changeset
148 EQL (2, -1, "%c%c", '1', '2');
kono
parents:
diff changeset
149 EQL (3, 4, "%3c", c);
kono
parents:
diff changeset
150 EQL (3, -1, "%3c", c);
kono
parents:
diff changeset
151 EQL (3, 4, "%*c", 3, c);
kono
parents:
diff changeset
152 EQL (3, -1, "%*c", 3, c);
kono
parents:
diff changeset
153
kono
parents:
diff changeset
154 EQL (3, 4, "%*c%*c", 2, c, 1, c);
kono
parents:
diff changeset
155 EQL (3, 4, "%*c%*c", 1, c, 2, c);
kono
parents:
diff changeset
156 EQL (3, 4, "%c%c%c", '1', '2', '3');
kono
parents:
diff changeset
157 EQL (3, 4, "%*c%c%c", 1, '1', '2', '3');
kono
parents:
diff changeset
158 EQL (3, 4, "%*c%*c%c", 1, '1', 1, '2', '3');
kono
parents:
diff changeset
159 EQL (3, 4, "%*c%*c%*c", 1, '1', 1, '2', 1, '3');
kono
parents:
diff changeset
160
kono
parents:
diff changeset
161 EQL (3, -1, "%*c%*c", 2, c, 1, c);
kono
parents:
diff changeset
162 EQL (3, -1, "%*c%*c", 1, c, 2, c);
kono
parents:
diff changeset
163 EQL (3, -1, "%c%c%c", '1', '2', '3');
kono
parents:
diff changeset
164 EQL (3, -1, "%*c%c%c", 1, '1', '2', '3');
kono
parents:
diff changeset
165 EQL (3, -1, "%*c%*c%c", 1, '1', 1, '2', '3');
kono
parents:
diff changeset
166 EQL (3, -1, "%*c%*c%*c", 1, '1', 1, '2', 1, '3');
kono
parents:
diff changeset
167
kono
parents:
diff changeset
168 EQL (4, 5, "%c%c %c", '1', '2', '3');
kono
parents:
diff changeset
169 EQL (5, 6, "%c %c %c", '1', '2', '3');
kono
parents:
diff changeset
170 EQL (5, 6, "%c %c %c", c, c, c);
kono
parents:
diff changeset
171 }
kono
parents:
diff changeset
172
kono
parents:
diff changeset
173 /* Generate a pseudo-random unsigned value. */
kono
parents:
diff changeset
174
kono
parents:
diff changeset
175 unsigned __attribute__ ((noclone, noinline))
kono
parents:
diff changeset
176 unsigned_value (void)
kono
parents:
diff changeset
177 {
kono
parents:
diff changeset
178 extern int rand ();
kono
parents:
diff changeset
179 return rand ();
kono
parents:
diff changeset
180 }
kono
parents:
diff changeset
181
kono
parents:
diff changeset
182 /* Generate a pseudo-random signed value. */
kono
parents:
diff changeset
183
kono
parents:
diff changeset
184 int __attribute__ ((noclone, noinline))
kono
parents:
diff changeset
185 int_value (void)
kono
parents:
diff changeset
186 {
kono
parents:
diff changeset
187 extern int rand ();
kono
parents:
diff changeset
188 return rand ();
kono
parents:
diff changeset
189 }
kono
parents:
diff changeset
190
kono
parents:
diff changeset
191 /* Generate an unsigned char value in the specified range. */
kono
parents:
diff changeset
192
kono
parents:
diff changeset
193 static unsigned char
kono
parents:
diff changeset
194 uchar_range (unsigned min, unsigned max)
kono
parents:
diff changeset
195 {
kono
parents:
diff changeset
196 unsigned x = unsigned_value ();
kono
parents:
diff changeset
197 if (x < min || max < x)
kono
parents:
diff changeset
198 x = min;
kono
parents:
diff changeset
199 return x;
kono
parents:
diff changeset
200 }
kono
parents:
diff changeset
201
kono
parents:
diff changeset
202 /* Generate a signed int value in the specified range. */
kono
parents:
diff changeset
203
kono
parents:
diff changeset
204 static int
kono
parents:
diff changeset
205 int_range (int min, int max)
kono
parents:
diff changeset
206 {
kono
parents:
diff changeset
207 int val = int_value ();
kono
parents:
diff changeset
208 if (val < min || max < val)
kono
parents:
diff changeset
209 val = min;
kono
parents:
diff changeset
210 return val;
kono
parents:
diff changeset
211 }
kono
parents:
diff changeset
212
kono
parents:
diff changeset
213 #define IR(min, max) int_range (min, max)
kono
parents:
diff changeset
214
kono
parents:
diff changeset
215 static void __attribute__ ((noinline, noclone))
kono
parents:
diff changeset
216 test_d_i (int i, long li)
kono
parents:
diff changeset
217 {
kono
parents:
diff changeset
218 /* +-------------------------- expected return value */
kono
parents:
diff changeset
219 /* | +---------------------- destination size */
kono
parents:
diff changeset
220 /* | | +------------------- format string */
kono
parents:
diff changeset
221 /* | | | +-- variable argument(s) */
kono
parents:
diff changeset
222 /* | | | | */
kono
parents:
diff changeset
223 /* V V V V */
kono
parents:
diff changeset
224 EQL ( 1, 2, "%d", 0);
kono
parents:
diff changeset
225 EQL ( 2, 3, "%d%d", 0, 1);
kono
parents:
diff changeset
226 EQL ( 3, 4, "%d%d", 9, 10);
kono
parents:
diff changeset
227 EQL ( 4, 5, "%d%d", 11, 12);
kono
parents:
diff changeset
228 EQL ( 5, 6, "%d:%d", 12, 34);
kono
parents:
diff changeset
229 EQL ( 5, 6, "%d", 12345);
kono
parents:
diff changeset
230 EQL ( 6, 7, "%d", -12345);
kono
parents:
diff changeset
231 EQL (15, 16, "%d:%d:%d:%d", 123, 124, 125, 126);
kono
parents:
diff changeset
232
kono
parents:
diff changeset
233 EQL ( 1, 2, "%i", uchar_range (0, 9));
kono
parents:
diff changeset
234 EQL ( 1, -1, "%i", uchar_range (0, 9));
kono
parents:
diff changeset
235
kono
parents:
diff changeset
236 /* The range information available to passes other than the Value
kono
parents:
diff changeset
237 Range Propoagation pass itself is so bad that the following two
kono
parents:
diff changeset
238 tests fail (the range seen in the test below is [0, 99] rather
kono
parents:
diff changeset
239 than [10, 99].
kono
parents:
diff changeset
240 EQL ( 2, 3, "%i", uchar_range (10, 99));
kono
parents:
diff changeset
241 EQL ( 3, 4, "%i", uchar_range (100, 199));
kono
parents:
diff changeset
242 */
kono
parents:
diff changeset
243
kono
parents:
diff changeset
244 /* Verify that the width allows the return value in the following
kono
parents:
diff changeset
245 calls can be folded despite the unknown value of the argument. */
kono
parents:
diff changeset
246 #if __SIZEOF_INT__ == 2
kono
parents:
diff changeset
247 EQL ( 6, 7, "%6d", i);
kono
parents:
diff changeset
248 EQL ( 6, 7, "%+6d", i);
kono
parents:
diff changeset
249 EQL ( 6, 7, "%-6d", i);
kono
parents:
diff changeset
250 EQL ( 6, 7, "%06d", i);
kono
parents:
diff changeset
251 #elif __SIZEOF_INT__ == 4
kono
parents:
diff changeset
252 EQL (11, 12, "%11d", i);
kono
parents:
diff changeset
253 EQL (11, 12, "%+11d", i);
kono
parents:
diff changeset
254 EQL (11, 12, "%-11d", i);
kono
parents:
diff changeset
255 EQL (11, 12, "%011d", i);
kono
parents:
diff changeset
256 #elif __SIZEOF_INT__ == 8
kono
parents:
diff changeset
257 EQL (20, 21, "%20d", i);
kono
parents:
diff changeset
258 EQL (20, 21, "%+20d", i);
kono
parents:
diff changeset
259 EQL (20, 21, "%-29d", i);
kono
parents:
diff changeset
260 EQL (20, 21, "%020d", i);
kono
parents:
diff changeset
261 #endif
kono
parents:
diff changeset
262
kono
parents:
diff changeset
263 #if __SIZEOF_LONG__ == 2
kono
parents:
diff changeset
264 EQL ( 6, 7, "%6ld", li);
kono
parents:
diff changeset
265 EQL ( 6, 7, "%+6ld", li);
kono
parents:
diff changeset
266 EQL ( 6, 7, "%-6ld", li);
kono
parents:
diff changeset
267 EQL ( 6, 7, "%06ld", li);
kono
parents:
diff changeset
268 #elif __SIZEOF_LONG__ == 4
kono
parents:
diff changeset
269 EQL (11, 12, "%11ld", li);
kono
parents:
diff changeset
270 EQL (11, 12, "%+11ld", li);
kono
parents:
diff changeset
271 EQL (11, 12, "%-11ld", li);
kono
parents:
diff changeset
272 EQL (11, 12, "%011ld", li);
kono
parents:
diff changeset
273 #elif __SIZEOF_LONG__ == 8
kono
parents:
diff changeset
274 EQL (20, 21, "%20ld", li);
kono
parents:
diff changeset
275 EQL (20, 21, "%+20ld", li);
kono
parents:
diff changeset
276 EQL (20, 21, "%-20ld", li);
kono
parents:
diff changeset
277 EQL (20, 21, "%020ld", li);
kono
parents:
diff changeset
278 #endif
kono
parents:
diff changeset
279
kono
parents:
diff changeset
280 /* Verify that the output of a directive with an unknown argument
kono
parents:
diff changeset
281 is correctly determined at compile time to be in the expected
kono
parents:
diff changeset
282 range. */
kono
parents:
diff changeset
283
kono
parents:
diff changeset
284 /* +---------------------------- expected minimum return value */
kono
parents:
diff changeset
285 /* | +------------------------ expected maximum return value */
kono
parents:
diff changeset
286 /* | | +-------------------- destination size */
kono
parents:
diff changeset
287 /* | | | +----------------- format string */
kono
parents:
diff changeset
288 /* | | | | +----- variable argument(s) */
kono
parents:
diff changeset
289 /* | | | | | */
kono
parents:
diff changeset
290 /* V V V V V */
kono
parents:
diff changeset
291 RNG ( 1, 4, 5, "%hhi", i);
kono
parents:
diff changeset
292 RNG ( 1, 3, 4, "%hhu", i);
kono
parents:
diff changeset
293
kono
parents:
diff changeset
294 RNG ( 3, 4, 5, "%hhi", IR (-128, -10));
kono
parents:
diff changeset
295 RNG ( 2, 4, 5, "%hhi", IR (-128, -1));
kono
parents:
diff changeset
296 RNG ( 1, 4, 5, "%hhi", IR (-128, 0));
kono
parents:
diff changeset
297
kono
parents:
diff changeset
298 RNG ( 1, 4, 5, "%1hhi", IR (-128, 0));
kono
parents:
diff changeset
299 RNG ( 1, 4, 5, "%2hhi", IR (-128, 0));
kono
parents:
diff changeset
300 RNG ( 1, 4, 5, "%3hhi", IR (-128, 0));
kono
parents:
diff changeset
301 RNG ( 1, 4, 5, "%4hhi", IR (-128, 0));
kono
parents:
diff changeset
302 RNG ( 1, 5, 6, "%5hhi", IR (-128, 0));
kono
parents:
diff changeset
303 RNG ( 1, 6, 7, "%6hhi", IR (-128, 0));
kono
parents:
diff changeset
304 RNG ( 2, 6, 7, "%6hhi", IR (-128, 10));
kono
parents:
diff changeset
305
kono
parents:
diff changeset
306 RNG ( 0, 1, 2, "%.hhi", IR ( 0, 1));
kono
parents:
diff changeset
307 RNG ( 0, 1, 2, "%.0hhi", IR ( 0, 1));
kono
parents:
diff changeset
308 RNG ( 0, 1, 2, "%0.0hhi", IR ( 0, 1)); /* { dg-warning ".0. flag ignored with precision" } */
kono
parents:
diff changeset
309 RNG ( 0, 1, 2, "%*.0hhi", 0, IR ( 0, 1));
kono
parents:
diff changeset
310
kono
parents:
diff changeset
311 RNG ( 1, 2, 3, "%hhi", IR (1024, 1034));
kono
parents:
diff changeset
312 RNG ( 1, 4, 5, "%hhi", IR (1024, 2048));
kono
parents:
diff changeset
313 RNG ( 2, 3, 4, "%hhi", IR (1034, 1151));
kono
parents:
diff changeset
314
kono
parents:
diff changeset
315 RNG ( 1, 2, 3, "%hhu", IR (1024, 1034));
kono
parents:
diff changeset
316 RNG ( 1, 3, 4, "%hhu", IR (1024, 2048));
kono
parents:
diff changeset
317 RNG ( 2, 3, 4, "%hhu", IR (1034, 1151));
kono
parents:
diff changeset
318
kono
parents:
diff changeset
319 #if __SIZEOF_SHORT__ == 2
kono
parents:
diff changeset
320 RNG ( 1, 6, 7, "%hi", i);
kono
parents:
diff changeset
321 RNG ( 1, 5, 6, "%hu", i);
kono
parents:
diff changeset
322 RNG ( 1, 6, 7, "%.1hi", i);
kono
parents:
diff changeset
323 RNG ( 2, 6, 7, "%.2hi", i);
kono
parents:
diff changeset
324 RNG ( 3, 6, 7, "%.3hi", i);
kono
parents:
diff changeset
325 RNG ( 4, 6, 7, "%.4hi", i);
kono
parents:
diff changeset
326 RNG ( 5, 6, 7, "%.5hi", i);
kono
parents:
diff changeset
327 RNG ( 6, 7, 8, "%.6hi", i);
kono
parents:
diff changeset
328 RNG ( 7, 8, 9, "%.7hi", i);
kono
parents:
diff changeset
329 #elif __SIZEOF_SHORT__ == 4
kono
parents:
diff changeset
330 RNG ( 1, 11, 12, "%hi", i);
kono
parents:
diff changeset
331 RNG ( 1, 10, 11, "%hu", i);
kono
parents:
diff changeset
332
kono
parents:
diff changeset
333 RNG ( 1, 11, 12, "%.1hi", i);
kono
parents:
diff changeset
334 RNG ( 2, 11, 12, "%.2hi", i);
kono
parents:
diff changeset
335 RNG ( 3, 11, 12, "%.3hi", i);
kono
parents:
diff changeset
336 RNG ( 4, 11, 12, "%.4hi", i);
kono
parents:
diff changeset
337 RNG ( 5, 11, 12, "%.5hi", i);
kono
parents:
diff changeset
338 RNG ( 6, 11, 12, "%.6hi", i);
kono
parents:
diff changeset
339 RNG ( 7, 11, 12, "%.7hi", i);
kono
parents:
diff changeset
340 RNG ( 8, 11, 12, "%.8hi", i);
kono
parents:
diff changeset
341 RNG ( 9, 11, 12, "%.9hi", i);
kono
parents:
diff changeset
342 RNG (10, 11, 12, "%.10hi", i);
kono
parents:
diff changeset
343 RNG (11, 12, 13, "%.11hi", i);
kono
parents:
diff changeset
344 RNG (12, 13, 14, "%.12hi", i);
kono
parents:
diff changeset
345 RNG (13, 14, 15, "%.13hi", i);
kono
parents:
diff changeset
346 #endif
kono
parents:
diff changeset
347
kono
parents:
diff changeset
348 #if __SIZEOF_INT__ == 2
kono
parents:
diff changeset
349 RNG ( 1, 6, 7, "%i", i);
kono
parents:
diff changeset
350 RNG ( 1, 5, 6, "%u", i);
kono
parents:
diff changeset
351
kono
parents:
diff changeset
352 RNG ( 1, 6, 7, "%.1i", i);
kono
parents:
diff changeset
353 RNG ( 2, 6, 7, "%.2i", i);
kono
parents:
diff changeset
354 RNG ( 3, 6, 7, "%.3i", i);
kono
parents:
diff changeset
355 RNG ( 4, 6, 7, "%.4i", i);
kono
parents:
diff changeset
356 RNG ( 5, 6, 7, "%.5i", i);
kono
parents:
diff changeset
357 RNG ( 6, 7, 8, "%.6i", i);
kono
parents:
diff changeset
358 RNG ( 7, 8, 9, "%.7i", i);
kono
parents:
diff changeset
359 #elif __SIZEOF_INT__ == 4
kono
parents:
diff changeset
360 RNG ( 1, 11, 12, "%i", i);
kono
parents:
diff changeset
361 RNG ( 1, 10, 11, "%u", i);
kono
parents:
diff changeset
362
kono
parents:
diff changeset
363 RNG ( 1, 11, 12, "%.1i", i);
kono
parents:
diff changeset
364 RNG ( 2, 11, 12, "%.2i", i);
kono
parents:
diff changeset
365 RNG ( 3, 11, 12, "%.3i", i);
kono
parents:
diff changeset
366 RNG ( 4, 11, 12, "%.4i", i);
kono
parents:
diff changeset
367 RNG ( 5, 11, 12, "%.5i", i);
kono
parents:
diff changeset
368 RNG ( 6, 11, 12, "%.6i", i);
kono
parents:
diff changeset
369 RNG ( 7, 11, 12, "%.7i", i);
kono
parents:
diff changeset
370 RNG ( 8, 11, 12, "%.8i", i);
kono
parents:
diff changeset
371 RNG ( 9, 11, 12, "%.9i", i);
kono
parents:
diff changeset
372 RNG (10, 11, 12, "%.10i", i);
kono
parents:
diff changeset
373 RNG (11, 12, 13, "%.11i", i);
kono
parents:
diff changeset
374 RNG (12, 13, 14, "%.12i", i);
kono
parents:
diff changeset
375 RNG (13, 14, 15, "%.13i", i);
kono
parents:
diff changeset
376 #elif __SIZEOF_INT__ == 8
kono
parents:
diff changeset
377 RNG ( 1, 20, 21, "%i", i);
kono
parents:
diff changeset
378 RNG ( 1, 19, 20, "%u", i);
kono
parents:
diff changeset
379 #endif
kono
parents:
diff changeset
380
kono
parents:
diff changeset
381 #if __SIZEOF_LONG__ == 4
kono
parents:
diff changeset
382 RNG ( 1, 11, 12, "%li", li);
kono
parents:
diff changeset
383 RNG ( 1, 10, 11, "%lu", li);
kono
parents:
diff changeset
384
kono
parents:
diff changeset
385 RNG ( 1, 11, 12, "%.1li", li);
kono
parents:
diff changeset
386 RNG ( 2, 11, 12, "%.2li", li);
kono
parents:
diff changeset
387 RNG ( 3, 11, 12, "%.3li", li);
kono
parents:
diff changeset
388 RNG ( 4, 11, 12, "%.4li", li);
kono
parents:
diff changeset
389 RNG ( 5, 11, 12, "%.5li", li);
kono
parents:
diff changeset
390 RNG ( 6, 11, 12, "%.6li", li);
kono
parents:
diff changeset
391 RNG ( 7, 11, 12, "%.7li", li);
kono
parents:
diff changeset
392 RNG ( 8, 11, 12, "%.8li", li);
kono
parents:
diff changeset
393 RNG ( 9, 11, 12, "%.9li", li);
kono
parents:
diff changeset
394 RNG (10, 11, 12, "%.10li", li);
kono
parents:
diff changeset
395 RNG (11, 12, 13, "%.11li", li);
kono
parents:
diff changeset
396 RNG (12, 13, 14, "%.12li", li);
kono
parents:
diff changeset
397 RNG (13, 14, 15, "%.13li", li);
kono
parents:
diff changeset
398 #elif __SIZEOF_LONG__ == 8
kono
parents:
diff changeset
399 RNG ( 1, 20, 21, "%li", li);
kono
parents:
diff changeset
400 RNG ( 1, 19, 20, "%lu", li);
kono
parents:
diff changeset
401 #endif
kono
parents:
diff changeset
402 }
kono
parents:
diff changeset
403
kono
parents:
diff changeset
404 static void __attribute__ ((noinline, noclone))
kono
parents:
diff changeset
405 test_x (unsigned char uc, unsigned short us, unsigned ui)
kono
parents:
diff changeset
406 {
kono
parents:
diff changeset
407 EQL ( 1, 2, "%hhx", 0);
kono
parents:
diff changeset
408 EQL ( 2, 3, "%2hhx", 0);
kono
parents:
diff changeset
409 EQL ( 2, 3, "%02hhx", 0);
kono
parents:
diff changeset
410 EQL ( 2, 3, "%#02hhx", 0);
kono
parents:
diff changeset
411
kono
parents:
diff changeset
412 EQL ( 1, 2, "%hhx", 1);
kono
parents:
diff changeset
413 EQL ( 2, 3, "%2hhx", 1);
kono
parents:
diff changeset
414 EQL ( 2, 3, "%02hhx", 1);
kono
parents:
diff changeset
415 EQL ( 3, 4, "%#02hhx", 1);
kono
parents:
diff changeset
416
kono
parents:
diff changeset
417 EQL ( 2, 3, "%2hhx", uc);
kono
parents:
diff changeset
418 EQL ( 2, 3, "%02hhx", uc);
kono
parents:
diff changeset
419 EQL ( 5, 6, "%#05hhx", uc);
kono
parents:
diff changeset
420
kono
parents:
diff changeset
421 EQL ( 2, 3, "%2hhx", us);
kono
parents:
diff changeset
422 EQL ( 2, 3, "%02hhx", us);
kono
parents:
diff changeset
423 EQL ( 5, 6, "%#05hhx", us);
kono
parents:
diff changeset
424
kono
parents:
diff changeset
425 EQL ( 2, 3, "%2hhx", ui);
kono
parents:
diff changeset
426 EQL ( 2, 3, "%02hhx", ui);
kono
parents:
diff changeset
427 EQL ( 5, 6, "%#05hhx", ui);
kono
parents:
diff changeset
428
kono
parents:
diff changeset
429 EQL ( 1, 2, "%x", 0);
kono
parents:
diff changeset
430 EQL ( 1, 2, "%#x", 0);
kono
parents:
diff changeset
431 EQL ( 1, 2, "%#0x", 0);
kono
parents:
diff changeset
432 EQL ( 1, 2, "%x", 1);
kono
parents:
diff changeset
433 EQL ( 1, 2, "%x", 0xf);
kono
parents:
diff changeset
434 EQL ( 2, 3, "%x", 0x10);
kono
parents:
diff changeset
435 EQL ( 2, 3, "%x", 0xff);
kono
parents:
diff changeset
436 EQL ( 3, 4, "%x", 0x100);
kono
parents:
diff changeset
437
kono
parents:
diff changeset
438 EQL (11, 12, "%02x:%02x:%02x:%02x", 0xde, 0xad, 0xbe, 0xef);
kono
parents:
diff changeset
439
kono
parents:
diff changeset
440 /* The following would be optimized if the range information of
kono
parents:
diff changeset
441 the variable's type was made available. Alas, it's lost due
kono
parents:
diff changeset
442 to the promotion of the actual argument (unsined char) to
kono
parents:
diff changeset
443 the type of the "formal" argument (int in the case of the
kono
parents:
diff changeset
444 ellipsis).
kono
parents:
diff changeset
445 EQL (11, 12, "%02x:%02x:%02x:%02x", uc, uc, uc, uc);
kono
parents:
diff changeset
446 */
kono
parents:
diff changeset
447 EQL (11, 12, "%02hhx:%02hhx:%02hhx:%02hhx", uc, uc, uc, uc);
kono
parents:
diff changeset
448
kono
parents:
diff changeset
449 #if __SIZEOF_SHORT__ == 2
kono
parents:
diff changeset
450 EQL ( 4, 5, "%04hx", us);
kono
parents:
diff changeset
451 EQL ( 9, 10, "%04hx:%04hx", us, us);
kono
parents:
diff changeset
452 EQL (14, 15, "%04hx:%04hx:%04hx", us, us, us);
kono
parents:
diff changeset
453 EQL (19, 20, "%04hx:%04hx:%04hx:%04hx", us, us, us, us);
kono
parents:
diff changeset
454 #endif
kono
parents:
diff changeset
455
kono
parents:
diff changeset
456 #if __SIZEOF_INT__ == 2
kono
parents:
diff changeset
457 EQL ( 4, 5, "%04x", ui);
kono
parents:
diff changeset
458 EQL ( 6, 7, "%#06x", ui);
kono
parents:
diff changeset
459 #elif __SIZEOF_INT__ == 4
kono
parents:
diff changeset
460 EQL ( 8, 9, "%08x", ui);
kono
parents:
diff changeset
461 EQL (10, 10 + 1, "%#010x", ui);
kono
parents:
diff changeset
462 #elif __SIZEOF_INT__ == 8
kono
parents:
diff changeset
463 EQL (16, 17, "%016x", ui);
kono
parents:
diff changeset
464 EQL (18, 19, "%#018x", ui);
kono
parents:
diff changeset
465 #endif
kono
parents:
diff changeset
466 }
kono
parents:
diff changeset
467
kono
parents:
diff changeset
468 static void __attribute__ ((noinline, noclone))
kono
parents:
diff changeset
469 test_a_double (double d)
kono
parents:
diff changeset
470 {
kono
parents:
diff changeset
471 EQL ( 6, 7, "%.0a", 0.0); /* 0x0p+0 */
kono
parents:
diff changeset
472 EQL ( 6, 7, "%.0a", 1.0); /* 0x8p-3 */
kono
parents:
diff changeset
473 EQL ( 6, 7, "%.0a", 2.0); /* 0x8p-2 */
kono
parents:
diff changeset
474
kono
parents:
diff changeset
475 /* The decimal point may be up to MB_LEN_MAX long. */
kono
parents:
diff changeset
476 RNG ( 8, 13, 14, "%.1a", 3.0); /* 0xc.0p-2 */
kono
parents:
diff changeset
477 RNG ( 9, 14, 15, "%.2a", 4.0); /* 0x8.00p-1 */
kono
parents:
diff changeset
478 RNG (10, 15, 16, "%.3a", 5.0); /* 0xa.000p-1 */
kono
parents:
diff changeset
479
kono
parents:
diff changeset
480 RNG (11, 16, 17, "%.*a", 4, 6.0); /* 0xc.0000p-1 */
kono
parents:
diff changeset
481 RNG (12, 17, 18, "%.*a", 5, 7.0); /* 0xe.00000p-1 */
kono
parents:
diff changeset
482 /* d is in [ 0, -DBL_MAX ] */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
483 RNG ( 3, 10, 11, "%.0a", d); /* inf/nan or 0x0p+0 ... -0x2p+1023 */
111
kono
parents:
diff changeset
484 /* %a is poorly specified and allows for implementations divergence:
kono
parents:
diff changeset
485 some (such as Glibc) trim redundant trailing zeros after decimal
kono
parents:
diff changeset
486 point and others (e.g., Solaris) don't. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
487 RNG ( 3, 30, 31, "%.1a", d); /* inf or 0x0.0p+0 ... -0x2.0...0p+1023 */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
488 RNG ( 3, 30, 31, "%.2a", d); /* inf or 0x0.00p+0 ... -0x2.00...0p+1023 */
111
kono
parents:
diff changeset
489 }
kono
parents:
diff changeset
490
kono
parents:
diff changeset
491 static void __attribute__ ((noinline, noclone))
kono
parents:
diff changeset
492 test_a_long_double (void)
kono
parents:
diff changeset
493 {
kono
parents:
diff changeset
494 EQL ( 6, 7, "%.0La", 0.0L); /* 0x0p+0 */
kono
parents:
diff changeset
495 EQL ( 6, 7, "%.0La", 1.0L); /* 0x8p-3 */
kono
parents:
diff changeset
496 EQL ( 6, 7, "%.0La", 2.0L); /* 0x8p-2 */
kono
parents:
diff changeset
497
kono
parents:
diff changeset
498 RNG ( 8, 13, 14, "%.1La", 3.0L); /* 0xc.0p-2 */
kono
parents:
diff changeset
499 RNG ( 9, 14, 15, "%.2La", 4.0L); /* 0xa.00p-1 */
kono
parents:
diff changeset
500 }
kono
parents:
diff changeset
501
kono
parents:
diff changeset
502 static void __attribute__ ((noinline, noclone))
kono
parents:
diff changeset
503 test_e_double (double d)
kono
parents:
diff changeset
504 {
kono
parents:
diff changeset
505 RNG (12, 17, 18, "%e", 1.0e0);
kono
parents:
diff changeset
506 RNG (13, 18, 19, "%e", -1.0e0);
kono
parents:
diff changeset
507 RNG (12, 17, 18, "%e", 1.0e+1);
kono
parents:
diff changeset
508 RNG (13, 18, 19, "%e", -1.0e+1);
kono
parents:
diff changeset
509 RNG (12, 17, 18, "%e", 1.0e+12);
kono
parents:
diff changeset
510 RNG (13, 18, 19, "%e", -1.0e+12);
kono
parents:
diff changeset
511 RNG (13, 18, 19, "%e", 1.0e+123);
kono
parents:
diff changeset
512 RNG (14, 19, 20, "%e", -1.0e+123);
kono
parents:
diff changeset
513
kono
parents:
diff changeset
514 RNG (12, 17, 18, "%e", 9.999e+99);
kono
parents:
diff changeset
515 RNG (12, 17, 18, "%e", 9.9999e+99);
kono
parents:
diff changeset
516 RNG (12, 17, 18, "%e", 9.99999e+99);
kono
parents:
diff changeset
517
kono
parents:
diff changeset
518 /* The actual output of the following directive depends on the rounding
kono
parents:
diff changeset
519 mode. */
kono
parents:
diff changeset
520 /* RNG (12, "%e", 9.9999994e+99); */
kono
parents:
diff changeset
521
kono
parents:
diff changeset
522 RNG (12, 17, 18, "%e", 1.0e-1);
kono
parents:
diff changeset
523 RNG (12, 17, 18, "%e", 1.0e-12);
kono
parents:
diff changeset
524 RNG (13, 18, 19, "%e", 1.0e-123);
kono
parents:
diff changeset
525
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
526 RNG ( 3, 19, 20, "%e", d);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
527 RNG ( 3, 11, 12, "%.e", d);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
528 RNG ( 3, 12, 13, "%.0e", d);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
529 RNG ( 3, 14, 15, "%.1e", d);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
530 RNG ( 3, 15, 16, "%.2e", d);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
531 RNG ( 3, 16, 17, "%.3e", d);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
532 RNG ( 3, 17, 18, "%.4e", d);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
533 RNG ( 3, 18, 19, "%.5e", d);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
534 RNG ( 3, 19, 20, "%.6e", d);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
535 RNG ( 3, 20, 21, "%.7e", d);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
536
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
537 RNG ( 3, 4013, 4014, "%.4000e", d);
111
kono
parents:
diff changeset
538
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
539 RNG ( 3, 7, 8, "%.*e", 0, d);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
540 RNG ( 3, 14, 15, "%.*e", 1, d);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
541 RNG ( 3, 15, 16, "%.*e", 2, d);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
542 RNG ( 3, 16, 17, "%.*e", 3, d);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
543 RNG ( 3, 17, 18, "%.*e", 4, d);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
544 RNG ( 3, 18, 19, "%.*e", 5, d);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
545 RNG ( 3, 19, 20, "%.*e", 6, d);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
546 RNG ( 3, 20, 21, "%.*e", 7, d);
111
kono
parents:
diff changeset
547
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
548 RNG ( 3, 4013, 4014, "%.*e", 4000, d);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
549 RNG ( 4, 4013, 4014, "%+.*e", 4000, d);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
550 RNG ( 4, 4013, 4014, "% .*e", 4000, d);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
551 RNG ( 3, 4013, 4014, "%#.*e", 4000, d);
111
kono
parents:
diff changeset
552 }
kono
parents:
diff changeset
553
kono
parents:
diff changeset
554 static void __attribute__ ((noinline, noclone))
kono
parents:
diff changeset
555 test_e_long_double (long double d)
kono
parents:
diff changeset
556 {
kono
parents:
diff changeset
557 RNG (12, 17, 18, "%Le", 1.0e0L);
kono
parents:
diff changeset
558 RNG (13, 18, 19, "%Le", -1.0e0L);
kono
parents:
diff changeset
559 RNG (12, 17, 18, "%Le", 1.0e+1L);
kono
parents:
diff changeset
560 RNG (13, 18, 19, "%Le", -1.0e+1L);
kono
parents:
diff changeset
561 RNG (12, 18, 19, "%Le", 1.0e+12L);
kono
parents:
diff changeset
562 RNG (13, 19, 20, "%Le", -1.0e+12L);
kono
parents:
diff changeset
563 RNG (13, 19, 20, "%Le", 1.0e+123L);
kono
parents:
diff changeset
564 RNG (14, 20, 21, "%Le", -1.0e+123L);
kono
parents:
diff changeset
565
kono
parents:
diff changeset
566 RNG (12, 18, 19, "%Le", 9.999e+99L);
kono
parents:
diff changeset
567 RNG (12, 18, 19, "%Le", 9.9999e+99L);
kono
parents:
diff changeset
568 RNG (12, 18, 19, "%Le", 9.99999e+99L);
kono
parents:
diff changeset
569
kono
parents:
diff changeset
570 #if __DBL_DIG__ < __LDBL_DIG__
kono
parents:
diff changeset
571 RNG (12, 17, 18, "%Le", 9.999999e+99L);
kono
parents:
diff changeset
572 #else
kono
parents:
diff changeset
573 RNG (12, 18, 19, "%Le", 9.999999e+99L);
kono
parents:
diff changeset
574 #endif
kono
parents:
diff changeset
575
kono
parents:
diff changeset
576 /* The actual output of the following directive depends on the rounding
kono
parents:
diff changeset
577 mode. */
kono
parents:
diff changeset
578 /* RNG (12, "%Le", 9.9999994e+99L); */
kono
parents:
diff changeset
579
kono
parents:
diff changeset
580 RNG (12, 17, 18, "%Le", 1.0e-1L);
kono
parents:
diff changeset
581 RNG (12, 17, 18, "%Le", 1.0e-12L);
kono
parents:
diff changeset
582 RNG (13, 18, 19, "%Le", 1.0e-123L);
kono
parents:
diff changeset
583
kono
parents:
diff changeset
584 EQL ( 6, 7, "%.0Le", 1.0e-111L);
kono
parents:
diff changeset
585
kono
parents:
diff changeset
586 RNG ( 8, 13, 14, "%.1Le", 1.0e-111L);
kono
parents:
diff changeset
587 RNG (19, 25, 25, "%.12Le", 1.0e-112L);
kono
parents:
diff changeset
588 RNG (20, 26, 27, "%.13Le", 1.0e-113L);
kono
parents:
diff changeset
589
kono
parents:
diff changeset
590 /* The following correspond to the double results plus 1 for the upper
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
591 bound accounting for the four-digit exponent. The lower bound is
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
592 for inf/nan. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
593 RNG ( 3, 20, 21, "%Le", d); /* inf or 0.000000e+00 ... -1.189732e+4932 */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
594 RNG ( 3, 8, 9, "%.Le", d);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
595 RNG ( 3, 9, 10, "%.0Le", d);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
596 RNG ( 3, 15, 16, "%.1Le", d); /* inf or 0.0e+00 ... -1.2e+4932 */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
597 RNG ( 3, 16, 17, "%.2Le", d); /* inf or 0.00e+00 ... -1.19e+4932 */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
598 RNG ( 3, 17, 18, "%.3Le", d);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
599 RNG ( 3, 18, 19, "%.4Le", d);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
600 RNG ( 3, 19, 20, "%.5Le", d);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
601 RNG ( 3, 20, 21, "%.6Le", d); /* same as plain "%Le" */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
602 RNG ( 3, 21, 22, "%.7Le", d); /* inf or 0.0000000e+00 ... -1.1897315e+4932 */
111
kono
parents:
diff changeset
603
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
604 RNG ( 3, 9, 10, "%.*Le", 0, d);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
605 RNG ( 3, 15, 16, "%.*Le", 1, d);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
606 RNG ( 3, 16, 17, "%.*Le", 2, d);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
607 RNG ( 3, 17, 18, "%.*Le", 3, d);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
608 RNG ( 3, 18, 19, "%.*Le", 4, d);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
609 RNG ( 3, 19, 20, "%.*Le", 5, d);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
610 RNG ( 3, 20, 21, "%.*Le", 6, d);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
611 RNG ( 3, 21, 22, "%.*Le", 7, d);
111
kono
parents:
diff changeset
612 }
kono
parents:
diff changeset
613
kono
parents:
diff changeset
614 static void __attribute__ ((noinline, noclone))
kono
parents:
diff changeset
615 test_f_double (double d)
kono
parents:
diff changeset
616 {
kono
parents:
diff changeset
617 RNG ( 8, 13, 14, "%f", 0.0e0);
kono
parents:
diff changeset
618 RNG ( 8, 13, 14, "%f", 0.1e0);
kono
parents:
diff changeset
619 RNG ( 8, 13, 14, "%f", 0.12e0);
kono
parents:
diff changeset
620 RNG ( 8, 13, 14, "%f", 0.123e0);
kono
parents:
diff changeset
621 RNG ( 8, 13, 14, "%f", 0.1234e0);
kono
parents:
diff changeset
622 RNG ( 8, 13, 14, "%f", 0.12345e0);
kono
parents:
diff changeset
623 RNG ( 8, 13, 14, "%f", 0.123456e0);
kono
parents:
diff changeset
624 RNG ( 8, 13, 14, "%f", 1.234567e0);
kono
parents:
diff changeset
625
kono
parents:
diff changeset
626 RNG ( 9, 14, 15, "%f", 1.0e+1);
kono
parents:
diff changeset
627 RNG ( 20, 26, 27, "%f", 1.0e+12);
kono
parents:
diff changeset
628 RNG (130, 136, 137, "%f", 1.0e+123);
kono
parents:
diff changeset
629
kono
parents:
diff changeset
630 RNG ( 8, 13, 14, "%f", 1.0e-1);
kono
parents:
diff changeset
631 RNG ( 8, 13, 14, "%f", 1.0e-12);
kono
parents:
diff changeset
632 RNG ( 8, 13, 14, "%f", 1.0e-123);
kono
parents:
diff changeset
633
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
634 RNG ( 3, 322, 323, "%f", d);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
635 RNG ( 4, 322, 323, "%+f", d);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
636 RNG ( 4, 322, 323, "% f", d);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
637 RNG ( 3, 322, 323, "%#f", d);
111
kono
parents:
diff changeset
638 }
kono
parents:
diff changeset
639
kono
parents:
diff changeset
640 static void __attribute__ ((noinline, noclone))
kono
parents:
diff changeset
641 test_f_long_double (void)
kono
parents:
diff changeset
642 {
kono
parents:
diff changeset
643 RNG ( 8, 15, 16, "%Lf", 0.0e0L);
kono
parents:
diff changeset
644 RNG ( 8, 14, 15, "%Lf", 0.1e0L);
kono
parents:
diff changeset
645 RNG ( 8, 14, 15, "%Lf", 0.12e0L);
kono
parents:
diff changeset
646 RNG ( 8, 14, 15, "%Lf", 0.123e0L);
kono
parents:
diff changeset
647 RNG ( 8, 14, 15, "%Lf", 0.1234e0L);
kono
parents:
diff changeset
648 RNG ( 8, 14, 15, "%Lf", 0.12345e0L);
kono
parents:
diff changeset
649 RNG ( 8, 14, 15, "%Lf", 0.123456e0L);
kono
parents:
diff changeset
650 RNG ( 8, 14, 15, "%Lf", 1.234567e0L);
kono
parents:
diff changeset
651
kono
parents:
diff changeset
652 RNG ( 9, 15, 16, "%Lf", 1.0e+1L);
kono
parents:
diff changeset
653 RNG ( 20, 26, 27, "%Lf", 1.0e+12L);
kono
parents:
diff changeset
654 RNG (130, 136, 137, "%Lf", 1.0e+123L);
kono
parents:
diff changeset
655
kono
parents:
diff changeset
656 RNG ( 8, 14, 15, "%Lf", 1.0e-1L);
kono
parents:
diff changeset
657 RNG ( 8, 14, 15, "%Lf", 1.0e-12L);
kono
parents:
diff changeset
658 RNG ( 8, 14, 15, "%Lf", 1.0e-123L);
kono
parents:
diff changeset
659 }
kono
parents:
diff changeset
660
kono
parents:
diff changeset
661 static void __attribute__ ((noinline, noclone))
kono
parents:
diff changeset
662 test_g_double (double d)
kono
parents:
diff changeset
663 {
kono
parents:
diff changeset
664 /* Numbers exactly representable in binary floating point. */
kono
parents:
diff changeset
665 EQL ( 1, 2, "%g", 0.0);
kono
parents:
diff changeset
666
kono
parents:
diff changeset
667 RNG ( 3, 8, 9, "%g", 1.0 / 2);
kono
parents:
diff changeset
668 RNG ( 4, 9, 10, "%g", 1.0 / 4);
kono
parents:
diff changeset
669 RNG ( 5, 10, 11, "%g", 1.0 / 8);
kono
parents:
diff changeset
670 RNG ( 6, 11, 12, "%g", 1.0 / 16);
kono
parents:
diff changeset
671 RNG ( 7, 12, 13, "%g", 1.0 / 32);
kono
parents:
diff changeset
672 RNG ( 8, 13, 14, "%g", 1.0 / 64);
kono
parents:
diff changeset
673 RNG ( 9, 14, 15, "%g", 1.0 / 128);
kono
parents:
diff changeset
674 RNG ( 10, 15, 16, "%g", 1.0 / 256);
kono
parents:
diff changeset
675 RNG ( 10, 16, 17, "%g", 1.0 / 512);
kono
parents:
diff changeset
676
kono
parents:
diff changeset
677 /* Numbers that are not exactly representable. */
kono
parents:
diff changeset
678 RNG ( 3, 13, 14, "%g", 0.1);
kono
parents:
diff changeset
679 RNG ( 4, 13, 14, "%g", 0.12);
kono
parents:
diff changeset
680 RNG ( 5, 13, 14, "%g", 0.123);
kono
parents:
diff changeset
681 RNG ( 6, 13, 14, "%g", 0.1234);
kono
parents:
diff changeset
682 RNG ( 7, 13, 14, "%g", 0.12345);
kono
parents:
diff changeset
683 RNG ( 8, 13, 14, "%g", 0.123456);
kono
parents:
diff changeset
684
kono
parents:
diff changeset
685 RNG ( 4, 17, 18, "%g", 0.123e+1);
kono
parents:
diff changeset
686 RNG ( 8, 18, 19, "%g", 0.123e+12);
kono
parents:
diff changeset
687 RNG ( 9, 19, 20, "%g", 0.123e+134);
kono
parents:
diff changeset
688
kono
parents:
diff changeset
689 RNG ( 1, 18, 19, "%g", d);
kono
parents:
diff changeset
690 RNG ( 1, 12, 13, "%.g", d);
kono
parents:
diff changeset
691 RNG ( 1, 12, 13, "%.0g", d);
kono
parents:
diff changeset
692 RNG ( 1, 12, 13, "%.1g", d);
kono
parents:
diff changeset
693 RNG ( 1, 14, 15, "%.2g", d);
kono
parents:
diff changeset
694 RNG ( 1, 15, 16, "%.3g", d);
kono
parents:
diff changeset
695 RNG ( 1, 16, 17, "%.4g", d);
kono
parents:
diff changeset
696 RNG ( 1, 17, 18, "%.5g", d);
kono
parents:
diff changeset
697 RNG ( 1, 18, 19, "%.6g", d);
kono
parents:
diff changeset
698 RNG ( 1, 19, 20, "%.7g", d);
kono
parents:
diff changeset
699 RNG ( 1, 20, 21, "%.8g", d);
kono
parents:
diff changeset
700
kono
parents:
diff changeset
701 RNG ( 1, 315, 316, "%.9999g", d);
kono
parents:
diff changeset
702
kono
parents:
diff changeset
703 RNG ( 1, 12, 13, "%.*g", 0, d);
kono
parents:
diff changeset
704 RNG ( 1, 12, 13, "%.*g", 1, d);
kono
parents:
diff changeset
705 RNG ( 1, 14, 15, "%.*g", 2, d);
kono
parents:
diff changeset
706 RNG ( 1, 15, 16, "%.*g", 3, d);
kono
parents:
diff changeset
707 RNG ( 1, 16, 17, "%.*g", 4, d);
kono
parents:
diff changeset
708 RNG ( 1, 17, 18, "%.*g", 5, d);
kono
parents:
diff changeset
709 RNG ( 1, 18, 19, "%.*g", 6, d);
kono
parents:
diff changeset
710 RNG ( 1, 19, 20, "%.*g", 7, d);
kono
parents:
diff changeset
711 RNG ( 1, 20, 21, "%.*g", 8, d);
kono
parents:
diff changeset
712
kono
parents:
diff changeset
713 RNG ( 1, 315, 316, "%.*g", 9999, d);
kono
parents:
diff changeset
714 }
kono
parents:
diff changeset
715
kono
parents:
diff changeset
716 static void __attribute__ ((noinline, noclone))
kono
parents:
diff changeset
717 test_g_long_double (void)
kono
parents:
diff changeset
718 {
kono
parents:
diff changeset
719 /* Numbers exactly representable in binary floating point. */
kono
parents:
diff changeset
720 EQL ( 1, 2, "%Lg", 0.0L);
kono
parents:
diff changeset
721 RNG ( 3, 8, 9, "%Lg", 1.0L / 2);
kono
parents:
diff changeset
722 RNG ( 4, 9, 10, "%Lg", 1.0L / 4);
kono
parents:
diff changeset
723 RNG ( 5, 10, 11, "%Lg", 1.0L / 8);
kono
parents:
diff changeset
724 RNG ( 6, 11, 12, "%Lg", 1.0L / 16);
kono
parents:
diff changeset
725 RNG ( 7, 12, 13, "%Lg", 1.0L / 32);
kono
parents:
diff changeset
726 RNG ( 8, 13, 14, "%Lg", 1.0L / 64);
kono
parents:
diff changeset
727 RNG ( 9, 14, 15, "%Lg", 1.0L / 128);
kono
parents:
diff changeset
728 RNG ( 10, 15, 16, "%Lg", 1.0L / 256);
kono
parents:
diff changeset
729 RNG ( 10, 15, 16, "%Lg", 1.0L / 512);
kono
parents:
diff changeset
730
kono
parents:
diff changeset
731 /* Numbers that are not exactly representable. */
kono
parents:
diff changeset
732
kono
parents:
diff changeset
733 /* The following test case results in up to 14 bytes on powerpc*-*-*
kono
parents:
diff changeset
734 but only in 13 bytes on x86_64 (see PR testsuite/79293). Test just
kono
parents:
diff changeset
735 for the former for simplicity. */
kono
parents:
diff changeset
736 RNG ( 3, 14, 15, "%Lg", 0.1L);
kono
parents:
diff changeset
737
kono
parents:
diff changeset
738 RNG ( 4, 13, 14, "%Lg", 0.12L);
kono
parents:
diff changeset
739 RNG ( 5, 13, 14, "%Lg", 0.123L);
kono
parents:
diff changeset
740 RNG ( 6, 13, 14, "%Lg", 0.1234L);
kono
parents:
diff changeset
741 RNG ( 7, 13, 14, "%Lg", 0.12345L);
kono
parents:
diff changeset
742 RNG ( 8, 13, 14, "%Lg", 0.123456L);
kono
parents:
diff changeset
743
kono
parents:
diff changeset
744 RNG ( 4, 12, 13, "%Lg", 0.123e+1L);
kono
parents:
diff changeset
745 RNG ( 8, 13, 14, "%Lg", 0.123e+12L);
kono
parents:
diff changeset
746 RNG ( 9, 17, 18, "%Lg", 0.123e+134L);
kono
parents:
diff changeset
747 }
kono
parents:
diff changeset
748
kono
parents:
diff changeset
749 static void __attribute__ ((noinline, noclone))
kono
parents:
diff changeset
750 test_s (int i)
kono
parents:
diff changeset
751 {
kono
parents:
diff changeset
752 EQL ( 0, 1, "%s", "");
kono
parents:
diff changeset
753 EQL ( 0, 1, "%s", "\0");
kono
parents:
diff changeset
754 EQL ( 1, 2, "%1s", "");
kono
parents:
diff changeset
755 EQL ( 1, 2, "%s", "1");
kono
parents:
diff changeset
756 EQL ( 2, 3, "%2s", "");
kono
parents:
diff changeset
757 EQL ( 2, 3, "%s", "12");
kono
parents:
diff changeset
758 EQL ( 2, 3, "%s%s", "12", "");
kono
parents:
diff changeset
759 EQL ( 2, 3, "%s%s", "", "12");
kono
parents:
diff changeset
760 EQL ( 2, 3, "%s%s", "1", "2");
kono
parents:
diff changeset
761 EQL ( 3, 4, "%3s", "");
kono
parents:
diff changeset
762 EQL ( 3, 4, "%3s", "1");
kono
parents:
diff changeset
763 EQL ( 3, 4, "%3s", "12");
kono
parents:
diff changeset
764 EQL ( 3, 4, "%3s", "123");
kono
parents:
diff changeset
765 EQL ( 3, 4, "%3.3s", "1");
kono
parents:
diff changeset
766 EQL ( 3, 4, "%3.3s", "12");
kono
parents:
diff changeset
767 EQL ( 3, 4, "%3.3s", "123");
kono
parents:
diff changeset
768 EQL ( 3, 4, "%3.3s", "1234");
kono
parents:
diff changeset
769 EQL ( 3, 4, "%3.3s", "12345");
kono
parents:
diff changeset
770 EQL ( 3, 4, "%s %s", "1", "2");
kono
parents:
diff changeset
771 EQL ( 4, 5, "%s %s", "12", "3");
kono
parents:
diff changeset
772 EQL ( 5, 6, "%s %s", "12", "34");
kono
parents:
diff changeset
773 EQL ( 5, 6, "[%s %s]", "1", "2");
kono
parents:
diff changeset
774 EQL ( 6, 7, "[%s %s]", "12", "3");
kono
parents:
diff changeset
775 EQL ( 7, 8, "[%s %s]", "12", "34");
kono
parents:
diff changeset
776
kono
parents:
diff changeset
777 /* Verify the result of a conditional expression involving string
kono
parents:
diff changeset
778 literals is in the expected range of their lengths. */
kono
parents:
diff changeset
779 RNG ( 0, 3, 4, "%-s", i ? "" : "123");
kono
parents:
diff changeset
780 RNG ( 1, 4, 5, "%-s", i ? "1" : "1234");
kono
parents:
diff changeset
781 RNG ( 2, 5, 6, "%-s", i ? "12" : "12345");
kono
parents:
diff changeset
782 RNG ( 3, 6, 7, "%-s", i ? "123" : "123456");
kono
parents:
diff changeset
783 }
kono
parents:
diff changeset
784
kono
parents:
diff changeset
785 static void __attribute__ ((noinline, noclone))
kono
parents:
diff changeset
786 test_n (void)
kono
parents:
diff changeset
787 {
kono
parents:
diff changeset
788 int n;
kono
parents:
diff changeset
789 EQL ( 0, 1, "%n", &n);
kono
parents:
diff changeset
790 EQL ( 1, 2, "1%n", &n);
kono
parents:
diff changeset
791 EQL ( 2, 3, "12%n", &n);
kono
parents:
diff changeset
792 EQL ( 3, 4, "12%n3", &n);
kono
parents:
diff changeset
793 EQL ( 4, 5, "12%n34", &n);
kono
parents:
diff changeset
794 EQL ( 4, 5, "12%n34%n", &n, &n);
kono
parents:
diff changeset
795 EQL ( 5, 6, "12%n34%n5", &n, &n);
kono
parents:
diff changeset
796 EQL ( 6, 7, "12%n34%n56", &n, &n);
kono
parents:
diff changeset
797 EQL ( 6, 7, "%s%n%s%n%s", "12", &n, "34", &n, "56");
kono
parents:
diff changeset
798 }
kono
parents:
diff changeset
799
kono
parents:
diff changeset
800 static void __attribute__ ((noinline, noclone))
kono
parents:
diff changeset
801 test_percent (void)
kono
parents:
diff changeset
802 {
kono
parents:
diff changeset
803 /* Provide extra arguments siunce the EQL macro needs at least one. */
kono
parents:
diff changeset
804 EQL ( 1, 2, "%%", 0); /* { dg-warning "too many arguments" } */
kono
parents:
diff changeset
805 EQL ( 2, 3, "%%%%", 0); /* { dg-warning "too many arguments" } */
kono
parents:
diff changeset
806 EQL ( 3, 4, "%%%%%%", 0); /* { dg-warning "too many arguments" } */
kono
parents:
diff changeset
807 EQL ( 3, 4, "%%%%%%%s", "");
kono
parents:
diff changeset
808 EQL ( 3, 4, "%%%%%s%%", "");
kono
parents:
diff changeset
809 EQL ( 3, 4, "%%%s%%%%", "");
kono
parents:
diff changeset
810 EQL ( 3, 4, "%s%%%%%%", "");
kono
parents:
diff changeset
811 }
kono
parents:
diff changeset
812
kono
parents:
diff changeset
813 int main (void)
kono
parents:
diff changeset
814 {
kono
parents:
diff changeset
815 test_c ('?');
kono
parents:
diff changeset
816 test_d_i (0xdeadbeef, 0xdeadbeefL);
kono
parents:
diff changeset
817 test_x ('?', 0xdead, 0xdeadbeef);
kono
parents:
diff changeset
818
kono
parents:
diff changeset
819 test_a_double (0.0);
kono
parents:
diff changeset
820 test_e_double (0.0);
kono
parents:
diff changeset
821 test_f_double (0.0);
kono
parents:
diff changeset
822 test_g_double (0.0);
kono
parents:
diff changeset
823
kono
parents:
diff changeset
824 test_a_long_double ();
kono
parents:
diff changeset
825 test_e_long_double (0.0);
kono
parents:
diff changeset
826 test_f_long_double ();
kono
parents:
diff changeset
827 test_g_long_double ();
kono
parents:
diff changeset
828
kono
parents:
diff changeset
829 test_s (0);
kono
parents:
diff changeset
830
kono
parents:
diff changeset
831 test_n ();
kono
parents:
diff changeset
832
kono
parents:
diff changeset
833 test_percent ();
kono
parents:
diff changeset
834
kono
parents:
diff changeset
835 if (nfails)
kono
parents:
diff changeset
836 {
kono
parents:
diff changeset
837 __builtin_printf ("%u out of %u tests failed\n", nfails, ntests);
kono
parents:
diff changeset
838 __builtin_abort ();
kono
parents:
diff changeset
839 }
kono
parents:
diff changeset
840
kono
parents:
diff changeset
841 return 0;
kono
parents:
diff changeset
842 }