]> git.ipfire.org Git - thirdparty/glibc.git/blame - stdio-common/tstdiomisc.c
stdio-common/tst-printf-bz18872.sh: Use attribute optimize instead of
[thirdparty/glibc.git] / stdio-common / tstdiomisc.c
CommitLineData
6c46718f
UD
1#include <float.h>
2#include <math.h>
196980f5 3#include <stdio.h>
6c46718f
UD
4#include <string.h>
5#include <wchar.h>
1c4053db 6#include <libc-internal.h>
196980f5 7
1a511d31 8static int
11336c16 9t1 (void)
196980f5
RM
10{
11 int n = -1;
12 sscanf ("abc ", "abc %n", &n);
13 printf ("t1: count=%d\n", n);
05be689b
RM
14
15 return n != 5;
196980f5
RM
16}
17
1a511d31 18static int
11336c16 19t2 (void)
196980f5 20{
05be689b 21 int result = 0;
196980f5
RM
22 int n;
23 long N;
24 int retval;
05be689b 25#define SCAN(INPUT, FORMAT, VAR, EXP_RES, EXP_VAL) \
196980f5 26 VAR = -1; \
77d10f94 27 retval = sscanf (INPUT, FORMAT, &VAR); \
196980f5 28 printf ("sscanf (\"%s\", \"%s\", &x) => %d, x = %ld\n", \
27658f20 29 INPUT, FORMAT, retval, (long int) VAR); \
05be689b
RM
30 result |= retval != EXP_RES || VAR != EXP_VAL
31
1c4053db
RM
32 /* This function is testing corner cases of the scanf format string,
33 so they do not all conform to -Wformat's expectations. */
34 DIAG_PUSH_NEEDS_COMMENT;
35 DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wformat");
36 DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wformat-extra-args");
37
05be689b 38 SCAN ("12345", "%ld", N, 1, 12345);
27658f20
UD
39 SCAN ("12345", "%llllld", N, 0, -1);
40 SCAN ("12345", "%LLLLLd", N, 0, -1);
8d57beea 41 SCAN ("test ", "%*s%n", n, 0, 4);
27658f20
UD
42 SCAN ("test ", "%2*s%n", n, 0, -1);
43 SCAN ("12 ", "%l2d", n, 0, -1);
05be689b
RM
44 SCAN ("12 ", "%2ld", N, 1, 12);
45
27658f20
UD
46 n = -1;
47 N = -1;
48 retval = sscanf ("1 1", "%d %Z", &n, &N);
49 printf ("sscanf (\"1 1\", \"%%d %%Z\", &n, &N) => %d, n = %d, N = %ld\n", \
50 retval, n, N); \
51 result |= retval != 1 || n != 1 || N != -1;
52
1c4053db
RM
53 DIAG_POP_NEEDS_COMMENT;
54
05be689b 55 return result;
196980f5
RM
56}
57
4fdfe821
AS
58static int
59t3 (void)
60{
61 char buf[80];
62 wchar_t wbuf[80];
63 int result = 0;
64 int retval;
65
66 retval = sprintf (buf, "%p", (char *) NULL);
67 result |= retval != 5 || strcmp (buf, "(nil)") != 0;
68
69 retval = swprintf (wbuf, sizeof (wbuf) / sizeof (wbuf[0]),
70 L"%p", (char *) NULL);
71 result |= retval != 5 || wcscmp (wbuf, L"(nil)") != 0;
72
73 return result;
74}
75
67e971f1 76volatile double qnanval;
67e971f1 77volatile long double lqnanval;
ee091edf
TS
78/* A sNaN is only guaranteed to be representable in variables with static (or
79 thread-local) storage duration. */
207d1e2a
TS
80static volatile double snanval = __builtin_nans ("");
81static volatile double msnanval = -__builtin_nans ("");
82static volatile long double lsnanval = __builtin_nansl ("");
83static volatile long double lmsnanval = -__builtin_nansl ("");
ee091edf 84volatile double infval;
003c9895 85volatile long double linfval;
38cbcf0a 86
11f685f5 87
1a511d31 88static int
6c46718f
UD
89F (void)
90{
003c9895
UD
91 char buf[80];
92 wchar_t wbuf[40];
a8b792d6 93 int result = 0;
6c46718f 94
67e971f1 95 qnanval = NAN;
38cbcf0a 96
003c9895 97 snprintf (buf, sizeof buf, "%a %A %e %E %f %F %g %G",
67e971f1
TS
98 qnanval, qnanval, qnanval, qnanval,
99 qnanval, qnanval, qnanval, qnanval);
a8b792d6 100 result |= strcmp (buf, "nan NAN nan NAN nan NAN nan NAN") != 0;
003c9895
UD
101 printf ("expected \"nan NAN nan NAN nan NAN nan NAN\", got \"%s\"\n", buf);
102
103 snprintf (buf, sizeof buf, "%a %A %e %E %f %F %g %G",
67e971f1
TS
104 -qnanval, -qnanval, -qnanval, -qnanval,
105 -qnanval, -qnanval, -qnanval, -qnanval);
a8b792d6 106 result |= strcmp (buf, "-nan -NAN -nan -NAN -nan -NAN -nan -NAN") != 0;
003c9895
UD
107 printf ("expected \"-nan -NAN -nan -NAN -nan -NAN -nan -NAN\", got \"%s\"\n",
108 buf);
109
ee091edf
TS
110 snprintf (buf, sizeof buf, "%a %A %e %E %f %F %g %G",
111 snanval, snanval, snanval, snanval,
112 snanval, snanval, snanval, snanval);
113 result |= strcmp (buf, "nan NAN nan NAN nan NAN nan NAN") != 0;
114 printf ("expected \"nan NAN nan NAN nan NAN nan NAN\", got \"%s\"\n", buf);
115
116 snprintf (buf, sizeof buf, "%a %A %e %E %f %F %g %G",
117 msnanval, msnanval, msnanval, msnanval,
118 msnanval, msnanval, msnanval, msnanval);
119 result |= strcmp (buf, "-nan -NAN -nan -NAN -nan -NAN -nan -NAN") != 0;
120 printf ("expected \"-nan -NAN -nan -NAN -nan -NAN -nan -NAN\", got \"%s\"\n",
121 buf);
122
003c9895
UD
123 infval = DBL_MAX * DBL_MAX;
124
125 snprintf (buf, sizeof buf, "%a %A %e %E %f %F %g %G",
126 infval, infval, infval, infval, infval, infval, infval, infval);
127 result |= strcmp (buf, "inf INF inf INF inf INF inf INF") != 0;
128 printf ("expected \"inf INF inf INF inf INF inf INF\", got \"%s\"\n", buf);
129
130 snprintf (buf, sizeof buf, "%a %A %e %E %f %F %g %G",
131 -infval, -infval, -infval, -infval,
132 -infval, -infval, -infval, -infval);
133 result |= strcmp (buf, "-inf -INF -inf -INF -inf -INF -inf -INF") != 0;
134 printf ("expected \"-inf -INF -inf -INF -inf -INF -inf -INF\", got \"%s\"\n",
135 buf);
136
137 swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]), L"%a %A %e %E %f %F %g %G",
67e971f1
TS
138 qnanval, qnanval, qnanval, qnanval,
139 qnanval, qnanval, qnanval, qnanval);
003c9895
UD
140 result |= wcscmp (wbuf, L"nan NAN nan NAN nan NAN nan NAN") != 0;
141 printf ("expected L\"nan NAN nan NAN nan NAN nan NAN\", got L\"%S\"\n", wbuf);
142
143 swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]), L"%a %A %e %E %f %F %g %G",
67e971f1
TS
144 -qnanval, -qnanval, -qnanval, -qnanval,
145 -qnanval, -qnanval, -qnanval, -qnanval);
003c9895
UD
146 result |= wcscmp (wbuf, L"-nan -NAN -nan -NAN -nan -NAN -nan -NAN") != 0;
147 printf ("expected L\"-nan -NAN -nan -NAN -nan -NAN -nan -NAN\", got L\"%S\"\n",
148 wbuf);
149
ee091edf
TS
150 swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]), L"%a %A %e %E %f %F %g %G",
151 snanval, snanval, snanval, snanval,
152 snanval, snanval, snanval, snanval);
153 result |= wcscmp (wbuf, L"nan NAN nan NAN nan NAN nan NAN") != 0;
154 printf ("expected L\"nan NAN nan NAN nan NAN nan NAN\", got L\"%S\"\n", wbuf);
155
156 swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]), L"%a %A %e %E %f %F %g %G",
157 msnanval, msnanval, msnanval, msnanval,
158 msnanval, msnanval, msnanval, msnanval);
159 result |= wcscmp (wbuf, L"-nan -NAN -nan -NAN -nan -NAN -nan -NAN") != 0;
160 printf ("expected L\"-nan -NAN -nan -NAN -nan -NAN -nan -NAN\", got L\"%S\"\n",
161 wbuf);
162
003c9895
UD
163 swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]), L"%a %A %e %E %f %F %g %G",
164 infval, infval, infval, infval, infval, infval, infval, infval);
165 result |= wcscmp (wbuf, L"inf INF inf INF inf INF inf INF") != 0;
166 printf ("expected L\"inf INF inf INF inf INF inf INF\", got L\"%S\"\n", wbuf);
167
168 swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]), L"%a %A %e %E %f %F %g %G",
169 -infval, -infval, -infval, -infval,
170 -infval, -infval, -infval, -infval);
171 result |= wcscmp (wbuf, L"-inf -INF -inf -INF -inf -INF -inf -INF") != 0;
172 printf ("expected L\"-inf -INF -inf -INF -inf -INF -inf -INF\", got L\"%S\"\n",
173 wbuf);
174
67e971f1 175 lqnanval = NAN;
003c9895
UD
176
177 snprintf (buf, sizeof buf, "%La %LA %Le %LE %Lf %LF %Lg %LG",
67e971f1
TS
178 lqnanval, lqnanval, lqnanval, lqnanval,
179 lqnanval, lqnanval, lqnanval, lqnanval);
a8b792d6 180 result |= strcmp (buf, "nan NAN nan NAN nan NAN nan NAN") != 0;
003c9895
UD
181 printf ("expected \"nan NAN nan NAN nan NAN nan NAN\", got \"%s\"\n", buf);
182
183 snprintf (buf, sizeof buf, "%La %LA %Le %LE %Lf %LF %Lg %LG",
67e971f1
TS
184 -lqnanval, -lqnanval, -lqnanval, -lqnanval,
185 -lqnanval, -lqnanval, -lqnanval, -lqnanval);
a8b792d6 186 result |= strcmp (buf, "-nan -NAN -nan -NAN -nan -NAN -nan -NAN") != 0;
003c9895
UD
187 printf ("expected \"-nan -NAN -nan -NAN -nan -NAN -nan -NAN\", got \"%s\"\n",
188 buf);
189
ee091edf
TS
190 snprintf (buf, sizeof buf, "%La %LA %Le %LE %Lf %LF %Lg %LG",
191 lsnanval, lsnanval, lsnanval, lsnanval,
192 lsnanval, lsnanval, lsnanval, lsnanval);
193 result |= strcmp (buf, "nan NAN nan NAN nan NAN nan NAN") != 0;
194 printf ("expected \"nan NAN nan NAN nan NAN nan NAN\", got \"%s\"\n", buf);
195
196 snprintf (buf, sizeof buf, "%La %LA %Le %LE %Lf %LF %Lg %LG",
197 lmsnanval, lmsnanval, lmsnanval, lmsnanval,
198 lmsnanval, lmsnanval, lmsnanval, lmsnanval);
199 result |= strcmp (buf, "-nan -NAN -nan -NAN -nan -NAN -nan -NAN") != 0;
200 printf ("expected \"-nan -NAN -nan -NAN -nan -NAN -nan -NAN\", got \"%s\"\n",
201 buf);
202
003c9895
UD
203 linfval = LDBL_MAX * LDBL_MAX;
204
205 snprintf (buf, sizeof buf, "%La %LA %Le %LE %Lf %LF %Lg %LG",
206 linfval, linfval, linfval, linfval,
207 linfval, linfval, linfval, linfval);
208 result |= strcmp (buf, "inf INF inf INF inf INF inf INF") != 0;
209 printf ("expected \"inf INF inf INF inf INF inf INF\", got \"%s\"\n", buf);
210
211 snprintf (buf, sizeof buf, "%La %LA %Le %LE %Lf %LF %Lg %LG",
212 -linfval, -linfval, -linfval, -linfval,
213 -linfval, -linfval, -linfval, -linfval);
214 result |= strcmp (buf, "-inf -INF -inf -INF -inf -INF -inf -INF") != 0;
215 printf ("expected \"-inf -INF -inf -INF -inf -INF -inf -INF\", got \"%s\"\n",
216 buf);
217
218 swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]),
219 L"%La %LA %Le %LE %Lf %LF %Lg %LG",
67e971f1
TS
220 lqnanval, lqnanval, lqnanval, lqnanval,
221 lqnanval, lqnanval, lqnanval, lqnanval);
003c9895
UD
222 result |= wcscmp (wbuf, L"nan NAN nan NAN nan NAN nan NAN") != 0;
223 printf ("expected L\"nan NAN nan NAN nan NAN nan NAN\", got L\"%S\"\n", wbuf);
224
225 swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]),
226 L"%La %LA %Le %LE %Lf %LF %Lg %LG",
67e971f1
TS
227 -lqnanval, -lqnanval, -lqnanval, -lqnanval,
228 -lqnanval, -lqnanval, -lqnanval, -lqnanval);
003c9895 229 result |= wcscmp (wbuf, L"-nan -NAN -nan -NAN -nan -NAN -nan -NAN") != 0;
ee091edf
TS
230 printf ("expected L\"-nan -NAN -nan -NAN -nan -NAN -nan -NAN\", got L\"%S\"\n",
231 wbuf);
232
233 swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]),
234 L"%La %LA %Le %LE %Lf %LF %Lg %LG",
235 lsnanval, lsnanval, lsnanval, lsnanval,
236 lsnanval, lsnanval, lsnanval, lsnanval);
237 result |= wcscmp (wbuf, L"nan NAN nan NAN nan NAN nan NAN") != 0;
238 printf ("expected L\"nan NAN nan NAN nan NAN nan NAN\", got L\"%S\"\n", wbuf);
239
240 swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]),
241 L"%La %LA %Le %LE %Lf %LF %Lg %LG",
242 lmsnanval, lmsnanval, lmsnanval, lmsnanval,
243 lmsnanval, lmsnanval, lmsnanval, lmsnanval);
244 result |= wcscmp (wbuf, L"-nan -NAN -nan -NAN -nan -NAN -nan -NAN") != 0;
003c9895
UD
245 printf ("expected L\"-nan -NAN -nan -NAN -nan -NAN -nan -NAN\", got L\"%S\"\n",
246 wbuf);
247
248 swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]),
249 L"%La %LA %Le %LE %Lf %LF %Lg %LG",
250 linfval, linfval, linfval, linfval,
251 linfval, linfval, linfval, linfval);
252 result |= wcscmp (wbuf, L"inf INF inf INF inf INF inf INF") != 0;
253 printf ("expected L\"inf INF inf INF inf INF inf INF\", got L\"%S\"\n", wbuf);
254
255 swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]),
256 L"%La %LA %Le %LE %Lf %LF %Lg %LG",
257 -linfval, -linfval, -linfval, -linfval,
258 -linfval, -linfval, -linfval, -linfval);
259 result |= wcscmp (wbuf, L"-inf -INF -inf -INF -inf -INF -inf -INF") != 0;
260 printf ("expected L\"-inf -INF -inf -INF -inf -INF -inf -INF\", got L\"%S\"\n",
261 wbuf);
6c46718f
UD
262
263 return result;
264}
265
196980f5 266int
11336c16 267main (int argc, char *argv[])
196980f5 268{
05be689b
RM
269 int result = 0;
270
271 result |= t1 ();
272 result |= t2 ();
4fdfe821 273 result |= t3 ();
6c46718f 274 result |= F ();
05be689b
RM
275
276 result |= fflush (stdout) == EOF;
196980f5 277
05be689b 278 return result;
196980f5 279}