1/* Test printf formats for intN_t, int_leastN_t and int_fastN_t types.
2 Copyright (C) 2023-2024 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <https://www.gnu.org/licenses/>. */
18
19#include <errno.h>
20#include <inttypes.h>
21#include <limits.h>
22#include <stdio.h>
23#include <string.h>
24#include <wchar.h>
25
26#include <libc-diag.h>
27#include <support/check.h>
28
29/* GCC does not know the %wN or %wfN length modifiers before GCC 13. */
30DIAG_PUSH_NEEDS_COMMENT;
31#if !__GNUC_PREREQ (13, 0)
32DIAG_IGNORE_NEEDS_COMMENT (12, "-Wformat");
33DIAG_IGNORE_NEEDS_COMMENT (12, "-Wformat-extra-args");
34#endif
35
36#define CHECK_PRINTF(EXPECTED, FMT, ...) \
37 do \
38 { \
39 int ret = SNPRINTF (buf, sizeof buf / sizeof buf[0], L_(FMT), \
40 __VA_ARGS__); \
41 TEST_COMPARE_STRING_MACRO (buf, L_(EXPECTED)); \
42 TEST_COMPARE (ret, STRLEN (L_(EXPECTED))); \
43 } \
44 while (0)
45
46#define CHECK_PRINTF_ERR(FMT, ...) \
47 do \
48 { \
49 int ret = SNPRINTF (buf, sizeof buf / sizeof buf[0], L_(FMT), \
50 __VA_ARGS__); \
51 TEST_VERIFY (ret < 0); \
52 TEST_COMPARE (errno, EINVAL); \
53 } \
54 while (0)
55
56static void
57test_w8 (void)
58{
59 CHAR buf[1024];
60 CHECK_PRINTF ("123", "%w8d", (int8_t) 123);
61 CHECK_PRINTF ("-123", "%w8d", (int8_t) -123);
62 CHECK_PRINTF ("123", "%w8i", (int8_t) 123);
63 CHECK_PRINTF ("-123", "%w8i", (int8_t) -123);
64 CHECK_PRINTF ("1111011", "%w8b", (uint8_t) 123);
65 CHECK_PRINTF ("1111011", "%w8B", (uint8_t) 123);
66 CHECK_PRINTF ("173", "%w8o", (uint8_t) 123);
67 CHECK_PRINTF ("123", "%w8u", (uint8_t) 123);
68 CHECK_PRINTF ("7b", "%w8x", (uint8_t) 123);
69 CHECK_PRINTF ("7B", "%w8X", (uint8_t) 123);
70 CHECK_PRINTF (" 123", "%5w8d", (int8_t) 123);
71 CHECK_PRINTF (" 123", "%*w8d", 5, (int8_t) 123);
72 CHECK_PRINTF ("0x7b", "%#w8x", (uint8_t) 123);
73 CHECK_PRINTF ("00123", "%.5w8d", (int8_t) 123);
74 CHECK_PRINTF ("00123", "%.*w8d", 5, (int8_t) 123);
75 CHECK_PRINTF (" 00123", "%8.5w8d", (int8_t) 123);
76 CHECK_PRINTF (" 00123", "%*.5w8d", 8, (int8_t) 123);
77 CHECK_PRINTF (" 00123", "%8.*w8d", 5, (int8_t) 123);
78 CHECK_PRINTF (" 00123", "%*.*w8d", 8, 5, (int8_t) 123);
79 CHECK_PRINTF ("00123 ", "%-8.5w8d", (int8_t) 123);
80 CHECK_PRINTF ("00123 ", "%-*.5w8d", 8, (int8_t) 123);
81 CHECK_PRINTF ("00123 ", "%-8.*w8d", 5, (int8_t) 123);
82 CHECK_PRINTF ("00123 ", "%-*.*w8d", 8, 5, (int8_t) 123);
83 {
84 int8_t n = -1;
85 CHECK_PRINTF ("12345", "%d%w8n", 12345, &n);
86 TEST_COMPARE (n, 5);
87 }
88 CHECK_PRINTF ("123", "%w8d", (int_least8_t) 123);
89 CHECK_PRINTF ("-123", "%w8d", (int_least8_t) -123);
90 CHECK_PRINTF ("123", "%w8i", (int_least8_t) 123);
91 CHECK_PRINTF ("-123", "%w8i", (int_least8_t) -123);
92 CHECK_PRINTF ("1111011", "%w8b", (uint_least8_t) 123);
93 CHECK_PRINTF ("1111011", "%w8B", (uint_least8_t) 123);
94 CHECK_PRINTF ("173", "%w8o", (uint_least8_t) 123);
95 CHECK_PRINTF ("123", "%w8u", (uint_least8_t) 123);
96 CHECK_PRINTF ("7b", "%w8x", (uint_least8_t) 123);
97 CHECK_PRINTF ("7B", "%w8X", (uint_least8_t) 123);
98 CHECK_PRINTF (" 123", "%5w8d", (int_least8_t) 123);
99 CHECK_PRINTF (" 123", "%*w8d", 5, (int_least8_t) 123);
100 CHECK_PRINTF ("0x7b", "%#w8x", (uint_least8_t) 123);
101 CHECK_PRINTF ("00123", "%.5w8d", (int_least8_t) 123);
102 CHECK_PRINTF ("00123", "%.*w8d", 5, (int_least8_t) 123);
103 CHECK_PRINTF (" 00123", "%8.5w8d", (int_least8_t) 123);
104 CHECK_PRINTF (" 00123", "%*.5w8d", 8, (int_least8_t) 123);
105 CHECK_PRINTF (" 00123", "%8.*w8d", 5, (int_least8_t) 123);
106 CHECK_PRINTF (" 00123", "%*.*w8d", 8, 5, (int_least8_t) 123);
107 CHECK_PRINTF ("00123 ", "%-8.5w8d", (int_least8_t) 123);
108 CHECK_PRINTF ("00123 ", "%-*.5w8d", 8, (int_least8_t) 123);
109 CHECK_PRINTF ("00123 ", "%-8.*w8d", 5, (int_least8_t) 123);
110 CHECK_PRINTF ("00123 ", "%-*.*w8d", 8, 5, (int_least8_t) 123);
111 {
112 int_least8_t ln = -1;
113 CHECK_PRINTF ("12345", "%d%w8n", 12345, &ln);
114 TEST_COMPARE (ln, 5);
115 }
116 /* Test truncation of value in promoted type not representable in
117 narrower type. */
118 CHECK_PRINTF ("57", "%w8d", 12345);
119 CHECK_PRINTF ("-57", "%w8d", -12345);
120 CHECK_PRINTF ("-121", "%w8d", 1234567);
121 CHECK_PRINTF ("121", "%w8d", -1234567);
122 CHECK_PRINTF ("135", "%w8u", 1234567);
123 /* Test positional argument handling. */
124 CHECK_PRINTF ("test 10 test2 20", "%4$s %3$w8d %2$s %1$w8d",
125 276, "test2", 266, "test");
126}
127
128static void
129test_wf8 (void)
130{
131 CHAR buf[1024];
132 _Static_assert (sizeof (int_fast8_t) == sizeof (char),
133 "test assumes size of int_fast8_t");
134 CHECK_PRINTF ("123", "%wf8d", (int_fast8_t) 123);
135 CHECK_PRINTF ("-123", "%wf8d", (int_fast8_t) -123);
136 CHECK_PRINTF ("123", "%wf8i", (int_fast8_t) 123);
137 CHECK_PRINTF ("-123", "%wf8i", (int_fast8_t) -123);
138 CHECK_PRINTF ("1111011", "%wf8b", (uint_fast8_t) 123);
139 CHECK_PRINTF ("1111011", "%wf8B", (uint_fast8_t) 123);
140 CHECK_PRINTF ("173", "%wf8o", (uint_fast8_t) 123);
141 CHECK_PRINTF ("123", "%wf8u", (uint_fast8_t) 123);
142 CHECK_PRINTF ("7b", "%wf8x", (uint_fast8_t) 123);
143 CHECK_PRINTF ("7B", "%wf8X", (uint_fast8_t) 123);
144 CHECK_PRINTF (" 123", "%5w8d", (int_fast8_t) 123);
145 CHECK_PRINTF (" 123", "%*w8d", 5, (int_fast8_t) 123);
146 CHECK_PRINTF ("0x7b", "%#w8x", (uint_fast8_t) 123);
147 CHECK_PRINTF ("00123", "%.5w8d", (int_fast8_t) 123);
148 CHECK_PRINTF ("00123", "%.*w8d", 5, (int_fast8_t) 123);
149 CHECK_PRINTF (" 00123", "%8.5w8d", (int_fast8_t) 123);
150 CHECK_PRINTF (" 00123", "%*.5w8d", 8, (int_fast8_t) 123);
151 CHECK_PRINTF (" 00123", "%8.*w8d", 5, (int_fast8_t) 123);
152 CHECK_PRINTF (" 00123", "%*.*w8d", 8, 5, (int_fast8_t) 123);
153 CHECK_PRINTF ("00123 ", "%-8.5w8d", (int_fast8_t) 123);
154 CHECK_PRINTF ("00123 ", "%-*.5w8d", 8, (int_fast8_t) 123);
155 CHECK_PRINTF ("00123 ", "%-8.*w8d", 5, (int_fast8_t) 123);
156 CHECK_PRINTF ("00123 ", "%-*.*w8d", 8, 5, (int_fast8_t) 123);
157 {
158 int_fast8_t n = -1;
159 CHECK_PRINTF ("12345", "%d%wf8n", 12345, &n);
160 TEST_COMPARE (n, 5);
161 }
162 /* Test truncation of value in promoted type not representable in
163 narrower type. */
164 CHECK_PRINTF ("57", "%wf8d", 12345);
165 CHECK_PRINTF ("-57", "%wf8d", -12345);
166 CHECK_PRINTF ("-121", "%wf8d", 1234567);
167 CHECK_PRINTF ("121", "%wf8d", -1234567);
168 CHECK_PRINTF ("135", "%wf8u", 1234567);
169 /* Test positional argument handling. */
170 CHECK_PRINTF ("test 10 test2 20", "%4$s %3$wf8d %2$s %1$wf8d",
171 276, "test2", 266, "test");
172}
173
174static void
175test_w16 (void)
176{
177 CHAR buf[1024];
178 CHECK_PRINTF ("12345", "%w16d", (int16_t) 12345);
179 CHECK_PRINTF ("-12345", "%w16d", (int16_t) -12345);
180 CHECK_PRINTF ("12345", "%w16i", (int16_t) 12345);
181 CHECK_PRINTF ("-12345", "%w16i", (int16_t) -12345);
182 CHECK_PRINTF ("11000000111001", "%w16b", (uint16_t) 12345);
183 CHECK_PRINTF ("11000000111001", "%w16B", (uint16_t) 12345);
184 CHECK_PRINTF ("30071", "%w16o", (uint16_t) 12345);
185 CHECK_PRINTF ("12345", "%w16u", (uint16_t) 12345);
186 CHECK_PRINTF ("303a", "%w16x", (uint16_t) 12346);
187 CHECK_PRINTF ("303A", "%w16X", (uint16_t) 12346);
188 CHECK_PRINTF (" 12345", "%7w16d", (int16_t) 12345);
189 CHECK_PRINTF (" 12345", "%*w16d", 7, (int16_t) 12345);
190 CHECK_PRINTF ("0x3039", "%#w16x", (uint16_t) 12345);
191 CHECK_PRINTF ("0012345", "%.7w16d", (int16_t) 12345);
192 CHECK_PRINTF ("0012345", "%.*w16d", 7, (int16_t) 12345);
193 CHECK_PRINTF (" 0012345", "%10.7w16d", (int16_t) 12345);
194 CHECK_PRINTF (" 0012345", "%*.7w16d", 10, (int16_t) 12345);
195 CHECK_PRINTF (" 0012345", "%10.*w16d", 7, (int16_t) 12345);
196 CHECK_PRINTF (" 0012345", "%*.*w16d", 10, 7, (int16_t) 12345);
197 CHECK_PRINTF ("0012345 ", "%-10.7w16d", (int16_t) 12345);
198 CHECK_PRINTF ("0012345 ", "%-*.7w16d", 10, (int16_t) 12345);
199 CHECK_PRINTF ("0012345 ", "%-10.*w16d", 7, (int16_t) 12345);
200 CHECK_PRINTF ("0012345 ", "%-*.*w16d", 10, 7, (int16_t) 12345);
201 {
202 int16_t n = -1;
203 CHECK_PRINTF ("12345", "%d%w16n", 12345, &n);
204 TEST_COMPARE (n, 5);
205 }
206 CHECK_PRINTF ("12345", "%w16d", (int_least16_t) 12345);
207 CHECK_PRINTF ("-12345", "%w16d", (int_least16_t) -12345);
208 CHECK_PRINTF ("12345", "%w16i", (int_least16_t) 12345);
209 CHECK_PRINTF ("-12345", "%w16i", (int_least16_t) -12345);
210 CHECK_PRINTF ("11000000111001", "%w16b", (uint_least16_t) 12345);
211 CHECK_PRINTF ("11000000111001", "%w16B", (uint_least16_t) 12345);
212 CHECK_PRINTF ("30071", "%w16o", (uint_least16_t) 12345);
213 CHECK_PRINTF ("12345", "%w16u", (uint_least16_t) 12345);
214 CHECK_PRINTF ("303a", "%w16x", (uint_least16_t) 12346);
215 CHECK_PRINTF ("303A", "%w16X", (uint_least16_t) 12346);
216 CHECK_PRINTF (" 12345", "%7w16d", (int_least16_t) 12345);
217 CHECK_PRINTF (" 12345", "%*w16d", 7, (int_least16_t) 12345);
218 CHECK_PRINTF ("0x3039", "%#w16x", (uint_least16_t) 12345);
219 CHECK_PRINTF ("0012345", "%.7w16d", (int_least16_t) 12345);
220 CHECK_PRINTF ("0012345", "%.*w16d", 7, (int_least16_t) 12345);
221 CHECK_PRINTF (" 0012345", "%10.7w16d", (int_least16_t) 12345);
222 CHECK_PRINTF (" 0012345", "%*.7w16d", 10, (int_least16_t) 12345);
223 CHECK_PRINTF (" 0012345", "%10.*w16d", 7, (int_least16_t) 12345);
224 CHECK_PRINTF (" 0012345", "%*.*w16d", 10, 7, (int_least16_t) 12345);
225 CHECK_PRINTF ("0012345 ", "%-10.7w16d", (int_least16_t) 12345);
226 CHECK_PRINTF ("0012345 ", "%-*.7w16d", 10, (int_least16_t) 12345);
227 CHECK_PRINTF ("0012345 ", "%-10.*w16d", 7, (int_least16_t) 12345);
228 CHECK_PRINTF ("0012345 ", "%-*.*w16d", 10, 7, (int_least16_t) 12345);
229 {
230 int_least16_t ln = -1;
231 CHECK_PRINTF ("12345", "%d%w16n", 12345, &ln);
232 TEST_COMPARE (ln, 5);
233 }
234 /* Test truncation of value in promoted type not representable in
235 narrower type. */
236 CHECK_PRINTF ("4464", "%w16d", 70000);
237 CHECK_PRINTF ("-4464", "%w16d", -70000);
238 CHECK_PRINTF ("-7616", "%w16d", 123456);
239 CHECK_PRINTF ("7616", "%w16d", -123456);
240 CHECK_PRINTF ("57920", "%w16u", 123456);
241 /* Test positional argument handling. */
242 CHECK_PRINTF ("test 10 test2 20", "%4$s %3$w16d %2$s %1$w16d",
243 65556, "test2", 65546, "test");
244}
245
246static void
247test_wf16 (void)
248{
249 CHAR buf[1024];
250 _Static_assert (sizeof (int_fast16_t) == sizeof (long int),
251 "test assumes size of int_fast16_t");
252 CHECK_PRINTF ("1234567", "%wf16d", (int_fast16_t) 1234567);
253 CHECK_PRINTF ("-1234567", "%wf16d", (int_fast16_t) -1234567);
254 CHECK_PRINTF ("1234567", "%wf16i", (int_fast16_t) 1234567);
255 CHECK_PRINTF ("-1234567", "%wf16i", (int_fast16_t) -1234567);
256 CHECK_PRINTF ("100101101011010000111", "%wf16b", (uint_fast16_t) 1234567);
257 CHECK_PRINTF ("100101101011010000111", "%wf16B", (uint_fast16_t) 1234567);
258 CHECK_PRINTF ("4553207", "%wf16o", (uint_fast16_t) 1234567);
259 CHECK_PRINTF ("1234567", "%wf16u", (uint_fast16_t) 1234567);
260 CHECK_PRINTF ("12d687", "%wf16x", (uint_fast16_t) 1234567);
261 CHECK_PRINTF ("12D687", "%wf16X", (uint_fast16_t) 1234567);
262 CHECK_PRINTF (" 1234567", "%9wf16d", (int_fast16_t) 1234567);
263 CHECK_PRINTF (" 1234567", "%*wf16d", 9, (int_fast16_t) 1234567);
264 CHECK_PRINTF ("0x12d687", "%#wf16x", (uint_fast16_t) 1234567);
265 CHECK_PRINTF ("001234567", "%.9wf16d", (int_fast16_t) 1234567);
266 CHECK_PRINTF ("001234567", "%.*wf16d", 9, (int_fast16_t) 1234567);
267 CHECK_PRINTF (" 001234567", "%12.9wf16d", (int_fast16_t) 1234567);
268 CHECK_PRINTF (" 001234567", "%*.9wf16d", 12, (int_fast16_t) 1234567);
269 CHECK_PRINTF (" 001234567", "%12.*wf16d", 9, (int_fast16_t) 1234567);
270 CHECK_PRINTF (" 001234567", "%*.*wf16d", 12, 9, (int_fast16_t) 1234567);
271 CHECK_PRINTF ("001234567 ", "%-12.9wf16d", (int_fast16_t) 1234567);
272 CHECK_PRINTF ("001234567 ", "%-*.9wf16d", 12, (int_fast16_t) 1234567);
273 CHECK_PRINTF ("001234567 ", "%-12.*wf16d", 9, (int_fast16_t) 1234567);
274 CHECK_PRINTF ("001234567 ", "%-*.*wf16d", 12, 9, (int_fast16_t) 1234567);
275 {
276 int_fast16_t n = -1;
277 CHECK_PRINTF ("12345", "%d%wf16n", 12345, &n);
278 TEST_COMPARE (n, 5);
279 }
280 /* Test positional argument handling. */
281 CHECK_PRINTF ("test 123456 test2 234567", "%4$s %3$wf16d %2$s %1$wf16d",
282 (int_fast16_t) 234567, "test2", (int_fast16_t) 123456, "test");
283#if INT_FAST16_MAX > 0x7fffffff
284 CHECK_PRINTF ("12345678901", "%wf16d", (int_fast16_t) 12345678901LL);
285 CHECK_PRINTF ("-12345678901", "%wf16d", (int_fast16_t) -12345678901LL);
286 CHECK_PRINTF ("12345678901", "%wf16i", (int_fast16_t) 12345678901LL);
287 CHECK_PRINTF ("-12345678901", "%wf16i", (int_fast16_t) -12345678901LL);
288 CHECK_PRINTF ("1011011111110111000001110000110101", "%wf16b",
289 (uint_fast16_t) 12345678901LL);
290 CHECK_PRINTF ("1011011111110111000001110000110101", "%wf16B",
291 (uint_fast16_t) 12345678901LL);
292 CHECK_PRINTF ("133767016065", "%wf16o", (uint_fast16_t) 12345678901LL);
293 CHECK_PRINTF ("12345678901", "%wf16u", (uint_fast16_t) 12345678901LL);
294 CHECK_PRINTF ("2dfdc1c35", "%wf16x", (uint_fast16_t) 12345678901LL);
295 CHECK_PRINTF ("2DFDC1C35", "%wf16X", (uint_fast16_t) 12345678901LL);
296 CHECK_PRINTF (" 12345678901", "%13wf16d", (int_fast16_t) 12345678901LL);
297 CHECK_PRINTF (" 12345678901", "%*wf16d", 13, (int_fast16_t) 12345678901LL);
298 CHECK_PRINTF ("0x2dfdc1c35", "%#wf16x", (uint_fast16_t) 12345678901LL);
299 CHECK_PRINTF ("0012345678901", "%.13wf16d", (int_fast16_t) 12345678901LL);
300 CHECK_PRINTF ("0012345678901", "%.*wf16d", 13, (int_fast16_t) 12345678901LL);
301 CHECK_PRINTF (" 0012345678901", "%16.13wf16d",
302 (int_fast16_t) 12345678901LL);
303 CHECK_PRINTF (" 0012345678901", "%*.13wf16d", 16,
304 (int_fast16_t) 12345678901LL);
305 CHECK_PRINTF (" 0012345678901", "%16.*wf16d", 13,
306 (int_fast16_t) 12345678901LL);
307 CHECK_PRINTF (" 0012345678901", "%*.*wf16d", 16, 13,
308 (int_fast16_t) 12345678901LL);
309 CHECK_PRINTF ("0012345678901 ", "%-16.13wf16d",
310 (int_fast16_t) 12345678901LL);
311 CHECK_PRINTF ("0012345678901 ", "%-*.13wf16d", 16,
312 (int_fast16_t) 12345678901LL);
313 CHECK_PRINTF ("0012345678901 ", "%-16.*wf16d", 13,
314 (int_fast16_t) 12345678901LL);
315 CHECK_PRINTF ("0012345678901 ", "%-*.*wf16d", 16, 13,
316 (int_fast16_t) 12345678901LL);
317 /* Test positional argument handling. */
318 CHECK_PRINTF ("test 123456789012 test2 234567890123",
319 "%4$s %3$wf16d %2$s %1$wf16d",
320 (int_fast16_t) 234567890123ULL, "test2",
321 (int_fast16_t) 123456789012ULL, "test");
322#endif
323}
324
325static void
326test_w32 (void)
327{
328 CHAR buf[1024];
329 CHECK_PRINTF ("1234567", "%w32d", (int32_t) 1234567);
330 CHECK_PRINTF ("-1234567", "%w32d", (int32_t) -1234567);
331 CHECK_PRINTF ("1234567", "%w32i", (int32_t) 1234567);
332 CHECK_PRINTF ("-1234567", "%w32i", (int32_t) -1234567);
333 CHECK_PRINTF ("100101101011010000111", "%w32b", (uint32_t) 1234567);
334 CHECK_PRINTF ("100101101011010000111", "%w32B", (uint32_t) 1234567);
335 CHECK_PRINTF ("4553207", "%w32o", (uint32_t) 1234567);
336 CHECK_PRINTF ("1234567", "%w32u", (uint32_t) 1234567);
337 CHECK_PRINTF ("12d687", "%w32x", (uint32_t) 1234567);
338 CHECK_PRINTF ("12D687", "%w32X", (uint32_t) 1234567);
339 CHECK_PRINTF (" 1234567", "%9w32d", (int32_t) 1234567);
340 CHECK_PRINTF (" 1234567", "%*w32d", 9, (int32_t) 1234567);
341 CHECK_PRINTF ("0x12d687", "%#w32x", (uint32_t) 1234567);
342 CHECK_PRINTF ("001234567", "%.9w32d", (int32_t) 1234567);
343 CHECK_PRINTF ("001234567", "%.*w32d", 9, (int32_t) 1234567);
344 CHECK_PRINTF (" 001234567", "%12.9w32d", (int32_t) 1234567);
345 CHECK_PRINTF (" 001234567", "%*.9w32d", 12, (int32_t) 1234567);
346 CHECK_PRINTF (" 001234567", "%12.*w32d", 9, (int32_t) 1234567);
347 CHECK_PRINTF (" 001234567", "%*.*w32d", 12, 9, (int32_t) 1234567);
348 CHECK_PRINTF ("001234567 ", "%-12.9w32d", (int32_t) 1234567);
349 CHECK_PRINTF ("001234567 ", "%-*.9w32d", 12, (int32_t) 1234567);
350 CHECK_PRINTF ("001234567 ", "%-12.*w32d", 9, (int32_t) 1234567);
351 CHECK_PRINTF ("001234567 ", "%-*.*w32d", 12, 9, (int32_t) 1234567);
352 {
353 int32_t n = -1;
354 CHECK_PRINTF ("12345", "%d%w32n", 12345, &n);
355 TEST_COMPARE (n, 5);
356 }
357 CHECK_PRINTF ("1234567", "%w32d", (int_least32_t) 1234567);
358 CHECK_PRINTF ("-1234567", "%w32d", (int_least32_t) -1234567);
359 CHECK_PRINTF ("1234567", "%w32i", (int_least32_t) 1234567);
360 CHECK_PRINTF ("-1234567", "%w32i", (int_least32_t) -1234567);
361 CHECK_PRINTF ("100101101011010000111", "%w32b", (uint_least32_t) 1234567);
362 CHECK_PRINTF ("100101101011010000111", "%w32B", (uint_least32_t) 1234567);
363 CHECK_PRINTF ("4553207", "%w32o", (uint_least32_t) 1234567);
364 CHECK_PRINTF ("1234567", "%w32u", (uint_least32_t) 1234567);
365 CHECK_PRINTF ("12d687", "%w32x", (uint_least32_t) 1234567);
366 CHECK_PRINTF ("12D687", "%w32X", (uint_least32_t) 1234567);
367 CHECK_PRINTF (" 1234567", "%9w32d", (int_least32_t) 1234567);
368 CHECK_PRINTF (" 1234567", "%*w32d", 9, (int_least32_t) 1234567);
369 CHECK_PRINTF ("0x12d687", "%#w32x", (uint_least32_t) 1234567);
370 CHECK_PRINTF ("001234567", "%.9w32d", (int_least32_t) 1234567);
371 CHECK_PRINTF ("001234567", "%.*w32d", 9, (int_least32_t) 1234567);
372 CHECK_PRINTF (" 001234567", "%12.9w32d", (int_least32_t) 1234567);
373 CHECK_PRINTF (" 001234567", "%*.9w32d", 12, (int_least32_t) 1234567);
374 CHECK_PRINTF (" 001234567", "%12.*w32d", 9, (int_least32_t) 1234567);
375 CHECK_PRINTF (" 001234567", "%*.*w32d", 12, 9, (int_least32_t) 1234567);
376 CHECK_PRINTF ("001234567 ", "%-12.9w32d", (int_least32_t) 1234567);
377 CHECK_PRINTF ("001234567 ", "%-*.9w32d", 12, (int_least32_t) 1234567);
378 CHECK_PRINTF ("001234567 ", "%-12.*w32d", 9, (int_least32_t) 1234567);
379 CHECK_PRINTF ("001234567 ", "%-*.*w32d", 12, 9, (int_least32_t) 1234567);
380 {
381 int_least32_t ln = -1;
382 CHECK_PRINTF ("12345", "%d%w32n", 12345, &ln);
383 TEST_COMPARE (ln, 5);
384 }
385 /* Test positional argument handling. */
386 CHECK_PRINTF ("test 123456 test2 234567", "%4$s %3$w32d %2$s %1$w32d",
387 INT32_C (234567), "test2", INT32_C (123456), "test");
388}
389
390static void
391test_wf32 (void)
392{
393 CHAR buf[1024];
394 _Static_assert (sizeof (int_fast32_t) == sizeof (long int),
395 "test assumes size of int_fast32_t");
396 CHECK_PRINTF ("1234567", "%wf32d", (int_fast32_t) 1234567);
397 CHECK_PRINTF ("-1234567", "%wf32d", (int_fast32_t) -1234567);
398 CHECK_PRINTF ("1234567", "%wf32i", (int_fast32_t) 1234567);
399 CHECK_PRINTF ("-1234567", "%wf32i", (int_fast32_t) -1234567);
400 CHECK_PRINTF ("100101101011010000111", "%wf32b", (uint_fast32_t) 1234567);
401 CHECK_PRINTF ("100101101011010000111", "%wf32B", (uint_fast32_t) 1234567);
402 CHECK_PRINTF ("4553207", "%wf32o", (uint_fast32_t) 1234567);
403 CHECK_PRINTF ("1234567", "%wf32u", (uint_fast32_t) 1234567);
404 CHECK_PRINTF ("12d687", "%wf32x", (uint_fast32_t) 1234567);
405 CHECK_PRINTF ("12D687", "%wf32X", (uint_fast32_t) 1234567);
406 CHECK_PRINTF (" 1234567", "%9wf32d", (int_fast32_t) 1234567);
407 CHECK_PRINTF (" 1234567", "%*wf32d", 9, (int_fast32_t) 1234567);
408 CHECK_PRINTF ("0x12d687", "%#wf32x", (uint_fast32_t) 1234567);
409 CHECK_PRINTF ("001234567", "%.9wf32d", (int_fast32_t) 1234567);
410 CHECK_PRINTF ("001234567", "%.*wf32d", 9, (int_fast32_t) 1234567);
411 CHECK_PRINTF (" 001234567", "%12.9wf32d", (int_fast32_t) 1234567);
412 CHECK_PRINTF (" 001234567", "%*.9wf32d", 12, (int_fast32_t) 1234567);
413 CHECK_PRINTF (" 001234567", "%12.*wf32d", 9, (int_fast32_t) 1234567);
414 CHECK_PRINTF (" 001234567", "%*.*wf32d", 12, 9, (int_fast32_t) 1234567);
415 CHECK_PRINTF ("001234567 ", "%-12.9wf32d", (int_fast32_t) 1234567);
416 CHECK_PRINTF ("001234567 ", "%-*.9wf32d", 12, (int_fast32_t) 1234567);
417 CHECK_PRINTF ("001234567 ", "%-12.*wf32d", 9, (int_fast32_t) 1234567);
418 CHECK_PRINTF ("001234567 ", "%-*.*wf32d", 12, 9, (int_fast32_t) 1234567);
419 {
420 int_fast32_t n = -1;
421 CHECK_PRINTF ("12345", "%d%wf32n", 12345, &n);
422 TEST_COMPARE (n, 5);
423 }
424 /* Test positional argument handling. */
425 CHECK_PRINTF ("test 123456 test2 234567", "%4$s %3$wf32d %2$s %1$wf32d",
426 (int_fast32_t) 234567, "test2", (int_fast32_t) 123456, "test");
427#if INT_FAST32_MAX > 0x7fffffff
428 CHECK_PRINTF ("12345678901", "%wf32d", (int_fast32_t) 12345678901LL);
429 CHECK_PRINTF ("-12345678901", "%wf32d", (int_fast32_t) -12345678901LL);
430 CHECK_PRINTF ("12345678901", "%wf32i", (int_fast32_t) 12345678901LL);
431 CHECK_PRINTF ("-12345678901", "%wf32i", (int_fast32_t) -12345678901LL);
432 CHECK_PRINTF ("1011011111110111000001110000110101", "%wf32b",
433 (uint_fast32_t) 12345678901LL);
434 CHECK_PRINTF ("1011011111110111000001110000110101", "%wf32B",
435 (uint_fast32_t) 12345678901LL);
436 CHECK_PRINTF ("133767016065", "%wf32o", (uint_fast32_t) 12345678901LL);
437 CHECK_PRINTF ("12345678901", "%wf32u", (uint_fast32_t) 12345678901LL);
438 CHECK_PRINTF ("2dfdc1c35", "%wf32x", (uint_fast32_t) 12345678901LL);
439 CHECK_PRINTF ("2DFDC1C35", "%wf32X", (uint_fast32_t) 12345678901LL);
440 CHECK_PRINTF (" 12345678901", "%13wf32d", (int_fast32_t) 12345678901LL);
441 CHECK_PRINTF (" 12345678901", "%*wf32d", 13, (int_fast32_t) 12345678901LL);
442 CHECK_PRINTF ("0x2dfdc1c35", "%#wf32x", (uint_fast32_t) 12345678901LL);
443 CHECK_PRINTF ("0012345678901", "%.13wf32d", (int_fast32_t) 12345678901LL);
444 CHECK_PRINTF ("0012345678901", "%.*wf32d", 13, (int_fast32_t) 12345678901LL);
445 CHECK_PRINTF (" 0012345678901", "%16.13wf32d",
446 (int_fast32_t) 12345678901LL);
447 CHECK_PRINTF (" 0012345678901", "%*.13wf32d", 16,
448 (int_fast32_t) 12345678901LL);
449 CHECK_PRINTF (" 0012345678901", "%16.*wf32d", 13,
450 (int_fast32_t) 12345678901LL);
451 CHECK_PRINTF (" 0012345678901", "%*.*wf32d", 16, 13,
452 (int_fast32_t) 12345678901LL);
453 CHECK_PRINTF ("0012345678901 ", "%-16.13wf32d",
454 (int_fast32_t) 12345678901LL);
455 CHECK_PRINTF ("0012345678901 ", "%-*.13wf32d", 16,
456 (int_fast32_t) 12345678901LL);
457 CHECK_PRINTF ("0012345678901 ", "%-16.*wf32d", 13,
458 (int_fast32_t) 12345678901LL);
459 CHECK_PRINTF ("0012345678901 ", "%-*.*wf32d", 16, 13,
460 (int_fast32_t) 12345678901LL);
461 /* Test positional argument handling. */
462 CHECK_PRINTF ("test 123456789012 test2 234567890123",
463 "%4$s %3$wf32d %2$s %1$wf32d",
464 (int_fast32_t) 234567890123ULL, "test2",
465 (int_fast32_t) 123456789012ULL, "test");
466#endif
467}
468
469static void
470test_w64 (void)
471{
472 CHAR buf[1024];
473 CHECK_PRINTF ("12345678901", "%w64d", (int64_t) 12345678901LL);
474 CHECK_PRINTF ("-12345678901", "%w64d", (int64_t) -12345678901LL);
475 CHECK_PRINTF ("12345678901", "%w64i", (int64_t) 12345678901LL);
476 CHECK_PRINTF ("-12345678901", "%w64i", (int64_t) -12345678901LL);
477 CHECK_PRINTF ("1011011111110111000001110000110101", "%w64b",
478 (uint64_t) 12345678901LL);
479 CHECK_PRINTF ("1011011111110111000001110000110101", "%w64B",
480 (uint64_t) 12345678901LL);
481 CHECK_PRINTF ("133767016065", "%w64o", (uint64_t) 12345678901LL);
482 CHECK_PRINTF ("12345678901", "%w64u", (uint64_t) 12345678901LL);
483 CHECK_PRINTF ("2dfdc1c35", "%w64x", (uint64_t) 12345678901LL);
484 CHECK_PRINTF ("2DFDC1C35", "%w64X", (uint64_t) 12345678901LL);
485 CHECK_PRINTF (" 12345678901", "%13w64d", (int64_t) 12345678901LL);
486 CHECK_PRINTF (" 12345678901", "%*w64d", 13, (int64_t) 12345678901LL);
487 CHECK_PRINTF ("0x2dfdc1c35", "%#w64x", (uint64_t) 12345678901LL);
488 CHECK_PRINTF ("0012345678901", "%.13w64d", (int64_t) 12345678901LL);
489 CHECK_PRINTF ("0012345678901", "%.*w64d", 13, (int64_t) 12345678901LL);
490 CHECK_PRINTF (" 0012345678901", "%16.13w64d", (int64_t) 12345678901LL);
491 CHECK_PRINTF (" 0012345678901", "%*.13w64d", 16, (int64_t) 12345678901LL);
492 CHECK_PRINTF (" 0012345678901", "%16.*w64d", 13, (int64_t) 12345678901LL);
493 CHECK_PRINTF (" 0012345678901", "%*.*w64d", 16, 13,
494 (int64_t) 12345678901LL);
495 CHECK_PRINTF ("0012345678901 ", "%-16.13w64d", (int64_t) 12345678901LL);
496 CHECK_PRINTF ("0012345678901 ", "%-*.13w64d", 16, (int64_t) 12345678901LL);
497 CHECK_PRINTF ("0012345678901 ", "%-16.*w64d", 13, (int64_t) 12345678901LL);
498 CHECK_PRINTF ("0012345678901 ", "%-*.*w64d", 16, 13,
499 (int64_t) 12345678901LL);
500 {
501 int64_t n = -1;
502 CHECK_PRINTF ("12345", "%d%w64n", 12345, &n);
503 TEST_COMPARE (n, 5);
504 }
505 CHECK_PRINTF ("12345678901", "%w64d", (int_least64_t) 12345678901LL);
506 CHECK_PRINTF ("-12345678901", "%w64d", (int_least64_t) -12345678901LL);
507 CHECK_PRINTF ("12345678901", "%w64i", (int_least64_t) 12345678901LL);
508 CHECK_PRINTF ("-12345678901", "%w64i", (int_least64_t) -12345678901LL);
509 CHECK_PRINTF ("1011011111110111000001110000110101", "%w64b",
510 (uint_least64_t) 12345678901LL);
511 CHECK_PRINTF ("1011011111110111000001110000110101", "%w64B",
512 (uint_least64_t) 12345678901LL);
513 CHECK_PRINTF ("133767016065", "%w64o", (uint_least64_t) 12345678901LL);
514 CHECK_PRINTF ("12345678901", "%w64u", (uint_least64_t) 12345678901LL);
515 CHECK_PRINTF ("2dfdc1c35", "%w64x", (uint_least64_t) 12345678901LL);
516 CHECK_PRINTF ("2DFDC1C35", "%w64X", (uint_least64_t) 12345678901LL);
517 CHECK_PRINTF (" 12345678901", "%13w64d", (int_least64_t) 12345678901LL);
518 CHECK_PRINTF (" 12345678901", "%*w64d", 13, (int_least64_t) 12345678901LL);
519 CHECK_PRINTF ("0x2dfdc1c35", "%#w64x", (uint_least64_t) 12345678901LL);
520 CHECK_PRINTF ("0012345678901", "%.13w64d", (int_least64_t) 12345678901LL);
521 CHECK_PRINTF ("0012345678901", "%.*w64d", 13, (int_least64_t) 12345678901LL);
522 CHECK_PRINTF (" 0012345678901", "%16.13w64d",
523 (int_least64_t) 12345678901LL);
524 CHECK_PRINTF (" 0012345678901", "%*.13w64d", 16,
525 (int_least64_t) 12345678901LL);
526 CHECK_PRINTF (" 0012345678901", "%16.*w64d", 13,
527 (int_least64_t) 12345678901LL);
528 CHECK_PRINTF (" 0012345678901", "%*.*w64d", 16, 13,
529 (int_least64_t) 12345678901LL);
530 CHECK_PRINTF ("0012345678901 ", "%-16.13w64d",
531 (int_least64_t) 12345678901LL);
532 CHECK_PRINTF ("0012345678901 ", "%-*.13w64d", 16,
533 (int_least64_t) 12345678901LL);
534 CHECK_PRINTF ("0012345678901 ", "%-16.*w64d", 13,
535 (int_least64_t) 12345678901LL);
536 CHECK_PRINTF ("0012345678901 ", "%-*.*w64d", 16, 13,
537 (int_least64_t) 12345678901LL);
538 {
539 int_least64_t ln = -1;
540 CHECK_PRINTF ("12345", "%d%w64n", 12345, &ln);
541 TEST_COMPARE (ln, 5);
542 }
543 /* Test positional argument handling. */
544 CHECK_PRINTF ("test 123456789012 test2 234567890123",
545 "%4$s %3$w64d %2$s %1$w64d",
546 INT64_C (234567890123), "test2",
547 INT64_C (123456789012), "test");
548}
549
550static void
551test_wf64 (void)
552{
553 CHAR buf[1024];
554 _Static_assert (sizeof (int_fast64_t) == sizeof (long long int),
555 "test assumes size of int_fast64_t");
556 CHECK_PRINTF ("12345678901", "%wf64d", (int_fast64_t) 12345678901LL);
557 CHECK_PRINTF ("-12345678901", "%wf64d", (int_fast64_t) -12345678901LL);
558 CHECK_PRINTF ("12345678901", "%wf64i", (int_fast64_t) 12345678901LL);
559 CHECK_PRINTF ("-12345678901", "%wf64i", (int_fast64_t) -12345678901LL);
560 CHECK_PRINTF ("1011011111110111000001110000110101", "%wf64b",
561 (uint_fast64_t) 12345678901LL);
562 CHECK_PRINTF ("1011011111110111000001110000110101", "%wf64B",
563 (uint_fast64_t) 12345678901LL);
564 CHECK_PRINTF ("133767016065", "%wf64o", (uint_fast64_t) 12345678901LL);
565 CHECK_PRINTF ("12345678901", "%wf64u", (uint_fast64_t) 12345678901LL);
566 CHECK_PRINTF ("2dfdc1c35", "%wf64x", (uint_fast64_t) 12345678901LL);
567 CHECK_PRINTF ("2DFDC1C35", "%wf64X", (uint_fast64_t) 12345678901LL);
568 CHECK_PRINTF (" 12345678901", "%13wf64d", (int_fast64_t) 12345678901LL);
569 CHECK_PRINTF (" 12345678901", "%*wf64d", 13, (int_fast64_t) 12345678901LL);
570 CHECK_PRINTF ("0x2dfdc1c35", "%#wf64x", (uint_fast64_t) 12345678901LL);
571 CHECK_PRINTF ("0012345678901", "%.13wf64d", (int_fast64_t) 12345678901LL);
572 CHECK_PRINTF ("0012345678901", "%.*wf64d", 13, (int_fast64_t) 12345678901LL);
573 CHECK_PRINTF (" 0012345678901", "%16.13wf64d",
574 (int_fast64_t) 12345678901LL);
575 CHECK_PRINTF (" 0012345678901", "%*.13wf64d", 16,
576 (int_fast64_t) 12345678901LL);
577 CHECK_PRINTF (" 0012345678901", "%16.*wf64d", 13,
578 (int_fast64_t) 12345678901LL);
579 CHECK_PRINTF (" 0012345678901", "%*.*wf64d", 16, 13,
580 (int_fast64_t) 12345678901LL);
581 CHECK_PRINTF ("0012345678901 ", "%-16.13wf64d",
582 (int_fast64_t) 12345678901LL);
583 CHECK_PRINTF ("0012345678901 ", "%-*.13wf64d", 16,
584 (int_fast64_t) 12345678901LL);
585 CHECK_PRINTF ("0012345678901 ", "%-16.*wf64d", 13,
586 (int_fast64_t) 12345678901LL);
587 CHECK_PRINTF ("0012345678901 ", "%-*.*wf64d", 16, 13,
588 (int_fast64_t) 12345678901LL);
589 {
590 int_fast64_t n = -1;
591 CHECK_PRINTF ("12345", "%d%wf64n", 12345, &n);
592 TEST_COMPARE (n, 5);
593 }
594 /* Test positional argument handling. */
595 CHECK_PRINTF ("test 123456789012 test2 234567890123",
596 "%4$s %3$wf64d %2$s %1$wf64d",
597 (int_fast64_t) 234567890123ULL, "test2",
598 (int_fast64_t) 123456789012ULL, "test");
599}
600
601static int
602do_test (void)
603{
604 test_w8 ();
605 test_wf8 ();
606 test_w16 ();
607 test_wf16 ();
608 test_w32 ();
609 test_wf32 ();
610 test_w64 ();
611 test_wf64 ();
612 /* Bad N in %wN and %wfN are required to produce an error return
613 from printf functions (and can also be seen to be invalid at
614 compile time). */
615 DIAG_PUSH_NEEDS_COMMENT;
616 DIAG_IGNORE_NEEDS_COMMENT (13, "-Wformat");
617 DIAG_IGNORE_NEEDS_COMMENT (13, "-Wformat-extra-args");
618 CHAR buf[1024];
619 CHECK_PRINTF_ERR ("%w1d", 123);
620 CHECK_PRINTF_ERR ("%w123d", 123);
621 CHECK_PRINTF_ERR ("%w99999999999999999999d", 123);
622 CHECK_PRINTF_ERR ("%wf1d", 123);
623 CHECK_PRINTF_ERR ("%wf123d", 123);
624 CHECK_PRINTF_ERR ("%wf99999999999999999999d", 123);
625 CHECK_PRINTF_ERR ("%1$w1d", 123);
626 CHECK_PRINTF_ERR ("%1$w123d", 123);
627 CHECK_PRINTF_ERR ("%1$w99999999999999999999d", 123);
628 CHECK_PRINTF_ERR ("%1$wf1d", 123);
629 CHECK_PRINTF_ERR ("%1$wf123d", 123);
630 CHECK_PRINTF_ERR ("%1$wf99999999999999999999d", 123);
631 DIAG_POP_NEEDS_COMMENT;
632 return 0;
633}
634
635DIAG_POP_NEEDS_COMMENT;
636
637#include <support/test-driver.c>
638

source code of glibc/stdio-common/tst-printf-intn-main.c