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