annotate gcc/testsuite/gcc.dg/format/diagnostic-ranges.c @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children 84e7813d76e9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* { dg-options "-Wformat -fdiagnostics-show-caret" } */
kono
parents:
diff changeset
2
kono
parents:
diff changeset
3 /* See PR 52952. */
kono
parents:
diff changeset
4
kono
parents:
diff changeset
5 #include "format.h"
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 void test_mismatching_types (const char *msg)
kono
parents:
diff changeset
8 {
kono
parents:
diff changeset
9 printf("hello %i", msg); /* { dg-warning "format '%i' expects argument of type 'int', but argument 2 has type 'const char \\*' " } */
kono
parents:
diff changeset
10
kono
parents:
diff changeset
11 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
12 printf("hello %i", msg);
kono
parents:
diff changeset
13 ~^ ~~~
kono
parents:
diff changeset
14 %s
kono
parents:
diff changeset
15 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
16
kono
parents:
diff changeset
17
kono
parents:
diff changeset
18 printf("hello %s", 42); /* { dg-warning "format '%s' expects argument of type 'char \\*', but argument 2 has type 'int'" } */
kono
parents:
diff changeset
19 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
20 printf("hello %s", 42);
kono
parents:
diff changeset
21 ~^ ~~
kono
parents:
diff changeset
22 %d
kono
parents:
diff changeset
23 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
24
kono
parents:
diff changeset
25 printf("hello %i", (long)0); /* { dg-warning "format '%i' expects argument of type 'int', but argument 2 has type 'long int' " } */
kono
parents:
diff changeset
26 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
27 printf("hello %i", (long)0);
kono
parents:
diff changeset
28 ~^ ~~~~~~~
kono
parents:
diff changeset
29 %li
kono
parents:
diff changeset
30 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
31 }
kono
parents:
diff changeset
32
kono
parents:
diff changeset
33 void test_multiple_arguments (void)
kono
parents:
diff changeset
34 {
kono
parents:
diff changeset
35 printf ("arg0: %i arg1: %s arg 2: %i", /* { dg-warning "29: format '%s'" } */
kono
parents:
diff changeset
36 100, 101, 102);
kono
parents:
diff changeset
37 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
38 printf ("arg0: %i arg1: %s arg 2: %i",
kono
parents:
diff changeset
39 ~^
kono
parents:
diff changeset
40 %d
kono
parents:
diff changeset
41 100, 101, 102);
kono
parents:
diff changeset
42 ~~~
kono
parents:
diff changeset
43 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
44 }
kono
parents:
diff changeset
45
kono
parents:
diff changeset
46 void test_multiple_arguments_2 (int i, int j)
kono
parents:
diff changeset
47 {
kono
parents:
diff changeset
48 printf ("arg0: %i arg1: %s arg 2: %i", /* { dg-warning "29: format '%s'" } */
kono
parents:
diff changeset
49 100, i + j, 102);
kono
parents:
diff changeset
50 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
51 printf ("arg0: %i arg1: %s arg 2: %i",
kono
parents:
diff changeset
52 ~^
kono
parents:
diff changeset
53 %d
kono
parents:
diff changeset
54 100, i + j, 102);
kono
parents:
diff changeset
55 ~~~~~
kono
parents:
diff changeset
56 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
57 }
kono
parents:
diff changeset
58
kono
parents:
diff changeset
59 void multiline_format_string (void) {
kono
parents:
diff changeset
60 printf ("before the fmt specifier" /* { dg-warning "11: format '%d' expects a matching 'int' argument" } */
kono
parents:
diff changeset
61 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
62 printf ("before the fmt specifier"
kono
parents:
diff changeset
63 ^~~~~~~~~~~~~~~~~~~~~~~~~~
kono
parents:
diff changeset
64 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
65
kono
parents:
diff changeset
66 "%"
kono
parents:
diff changeset
67 "d" /* { dg-message "12: format string is defined here" } */
kono
parents:
diff changeset
68 "after the fmt specifier");
kono
parents:
diff changeset
69
kono
parents:
diff changeset
70 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
71 "%"
kono
parents:
diff changeset
72 ~~
kono
parents:
diff changeset
73 "d"
kono
parents:
diff changeset
74 ~^
kono
parents:
diff changeset
75 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
76 }
kono
parents:
diff changeset
77
kono
parents:
diff changeset
78 void test_hex (const char *msg)
kono
parents:
diff changeset
79 {
kono
parents:
diff changeset
80 /* "%" is \x25
kono
parents:
diff changeset
81 "i" is \x69 */
kono
parents:
diff changeset
82 printf("hello \x25\x69", msg); /* { dg-warning "format '%i' expects argument of type 'int', but argument 2 has type 'const char \\*' " } */
kono
parents:
diff changeset
83
kono
parents:
diff changeset
84 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
85 printf("hello \x25\x69", msg);
kono
parents:
diff changeset
86 ~~~~^~~~ ~~~
kono
parents:
diff changeset
87 \x25s
kono
parents:
diff changeset
88 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
89 }
kono
parents:
diff changeset
90
kono
parents:
diff changeset
91 void test_oct (const char *msg)
kono
parents:
diff changeset
92 {
kono
parents:
diff changeset
93 /* "%" is octal 045
kono
parents:
diff changeset
94 "i" is octal 151. */
kono
parents:
diff changeset
95 printf("hello \045\151", msg); /* { dg-warning "format '%i' expects argument of type 'int', but argument 2 has type 'const char \\*' " } */
kono
parents:
diff changeset
96
kono
parents:
diff changeset
97 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
98 printf("hello \045\151", msg);
kono
parents:
diff changeset
99 ~~~~^~~~ ~~~
kono
parents:
diff changeset
100 \045s
kono
parents:
diff changeset
101 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
102 }
kono
parents:
diff changeset
103
kono
parents:
diff changeset
104 void test_multiple (const char *msg)
kono
parents:
diff changeset
105 {
kono
parents:
diff changeset
106 /* "%" is \x25 in hex
kono
parents:
diff changeset
107 "i" is \151 in octal. */
kono
parents:
diff changeset
108 printf("prefix" "\x25" "\151" "suffix", /* { dg-warning "format '%i'" } */
kono
parents:
diff changeset
109 msg);
kono
parents:
diff changeset
110 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
111 printf("prefix" "\x25" "\151" "suffix",
kono
parents:
diff changeset
112 ^~~~~~~~
kono
parents:
diff changeset
113 msg);
kono
parents:
diff changeset
114 ~~~
kono
parents:
diff changeset
115 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
116
kono
parents:
diff changeset
117 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
118 printf("prefix" "\x25" "\151" "suffix",
kono
parents:
diff changeset
119 ~~~~~~~~^~~~
kono
parents:
diff changeset
120 \x25" "s
kono
parents:
diff changeset
121 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
122 }
kono
parents:
diff changeset
123
kono
parents:
diff changeset
124 void test_u8 (const char *msg)
kono
parents:
diff changeset
125 {
kono
parents:
diff changeset
126 printf(u8"hello %i", msg);/* { dg-warning "format '%i' expects argument of type 'int', but argument 2 has type 'const char \\*' " } */
kono
parents:
diff changeset
127 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
128 printf(u8"hello %i", msg);
kono
parents:
diff changeset
129 ~^ ~~~
kono
parents:
diff changeset
130 %s
kono
parents:
diff changeset
131 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
132 }
kono
parents:
diff changeset
133
kono
parents:
diff changeset
134 void test_param (long long_i, long long_j)
kono
parents:
diff changeset
135 {
kono
parents:
diff changeset
136 printf ("foo %s bar", long_i + long_j); /* { dg-warning "17: format '%s' expects argument of type 'char \\*', but argument 2 has type 'long int'" } */
kono
parents:
diff changeset
137 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
138 printf ("foo %s bar", long_i + long_j);
kono
parents:
diff changeset
139 ~^ ~~~~~~~~~~~~~~~
kono
parents:
diff changeset
140 %ld
kono
parents:
diff changeset
141 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
142 }
kono
parents:
diff changeset
143
kono
parents:
diff changeset
144 void test_field_width_specifier (long l, int i1, int i2)
kono
parents:
diff changeset
145 {
kono
parents:
diff changeset
146 printf (" %*.*d ", l, i1, i2); /* { dg-warning "14: field width specifier '\\*' expects argument of type 'int', but argument 2 has type 'long int'" } */
kono
parents:
diff changeset
147 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
148 printf (" %*.*d ", l, i1, i2);
kono
parents:
diff changeset
149 ~^~~~ ~
kono
parents:
diff changeset
150 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
151 }
kono
parents:
diff changeset
152
kono
parents:
diff changeset
153 /* PR c/72857. */
kono
parents:
diff changeset
154
kono
parents:
diff changeset
155 void test_field_width_specifier_2 (char *d, long foo, long bar)
kono
parents:
diff changeset
156 {
kono
parents:
diff changeset
157 __builtin_sprintf (d, " %*ld ", foo, foo); /* { dg-warning "28: field width specifier '\\*' expects argument of type 'int', but argument 3 has type 'long int'" } */
kono
parents:
diff changeset
158 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
159 __builtin_sprintf (d, " %*ld ", foo, foo);
kono
parents:
diff changeset
160 ~^~~ ~~~
kono
parents:
diff changeset
161 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
162
kono
parents:
diff changeset
163 __builtin_sprintf (d, " %*ld ", foo + bar, foo); /* { dg-warning "28: field width specifier '\\*' expects argument of type 'int', but argument 3 has type 'long int'" } */
kono
parents:
diff changeset
164 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
165 __builtin_sprintf (d, " %*ld ", foo + bar, foo);
kono
parents:
diff changeset
166 ~^~~ ~~~~~~~~~
kono
parents:
diff changeset
167 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
168 }
kono
parents:
diff changeset
169
kono
parents:
diff changeset
170 void test_field_precision_specifier (char *d, long foo, long bar)
kono
parents:
diff changeset
171 {
kono
parents:
diff changeset
172 __builtin_sprintf (d, " %.*ld ", foo, foo); /* { dg-warning "29: field precision specifier '\\.\\*' expects argument of type 'int', but argument 3 has type 'long int'" } */
kono
parents:
diff changeset
173 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
174 __builtin_sprintf (d, " %.*ld ", foo, foo);
kono
parents:
diff changeset
175 ~~^~~ ~~~
kono
parents:
diff changeset
176 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
177
kono
parents:
diff changeset
178 __builtin_sprintf (d, " %.*ld ", foo + bar, foo); /* { dg-warning "29: field precision specifier '\\.\\*' expects argument of type 'int', but argument 3 has type 'long int'" } */
kono
parents:
diff changeset
179 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
180 __builtin_sprintf (d, " %.*ld ", foo + bar, foo);
kono
parents:
diff changeset
181 ~~^~~ ~~~~~~~~~
kono
parents:
diff changeset
182 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
183 }
kono
parents:
diff changeset
184
kono
parents:
diff changeset
185 void test_spurious_percent (void)
kono
parents:
diff changeset
186 {
kono
parents:
diff changeset
187 printf("hello world %"); /* { dg-warning "23: spurious trailing" } */
kono
parents:
diff changeset
188
kono
parents:
diff changeset
189 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
190 printf("hello world %");
kono
parents:
diff changeset
191 ^
kono
parents:
diff changeset
192 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
193 }
kono
parents:
diff changeset
194
kono
parents:
diff changeset
195 void test_empty_precision (char *s, size_t m, double d)
kono
parents:
diff changeset
196 {
kono
parents:
diff changeset
197 strfmon (s, m, "%#.5n", d); /* { dg-warning "20: empty left precision in gnu_strfmon format" } */
kono
parents:
diff changeset
198 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
199 strfmon (s, m, "%#.5n", d);
kono
parents:
diff changeset
200 ^
kono
parents:
diff changeset
201 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
202
kono
parents:
diff changeset
203 strfmon (s, m, "%#5.n", d); /* { dg-warning "22: empty precision in gnu_strfmon format" } */
kono
parents:
diff changeset
204 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
205 strfmon (s, m, "%#5.n", d);
kono
parents:
diff changeset
206 ^
kono
parents:
diff changeset
207 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
208 }
kono
parents:
diff changeset
209
kono
parents:
diff changeset
210 void test_repeated (int i)
kono
parents:
diff changeset
211 {
kono
parents:
diff changeset
212 printf ("%++d", i); /* { dg-warning "14: repeated '\\+' flag in format" } */
kono
parents:
diff changeset
213 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
214 printf ("%++d", i);
kono
parents:
diff changeset
215 ^
kono
parents:
diff changeset
216 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
217 }
kono
parents:
diff changeset
218
kono
parents:
diff changeset
219 void test_conversion_lacks_type (void)
kono
parents:
diff changeset
220 {
kono
parents:
diff changeset
221 printf (" %h"); /* { dg-warning "14:conversion lacks type at end of format" } */
kono
parents:
diff changeset
222 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
223 printf (" %h");
kono
parents:
diff changeset
224 ^
kono
parents:
diff changeset
225 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
226 }
kono
parents:
diff changeset
227
kono
parents:
diff changeset
228 void test_embedded_nul (void)
kono
parents:
diff changeset
229 {
kono
parents:
diff changeset
230 printf (" \0 "); /* { dg-warning "13:embedded" "warning for embedded NUL" } */
kono
parents:
diff changeset
231 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
232 printf (" \0 ");
kono
parents:
diff changeset
233 ^~
kono
parents:
diff changeset
234 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
235 }
kono
parents:
diff changeset
236
kono
parents:
diff changeset
237 void test_macro (const char *msg)
kono
parents:
diff changeset
238 {
kono
parents:
diff changeset
239 #define INT_FMT "%i" /* { dg-message "19: format string is defined here" } */
kono
parents:
diff changeset
240 printf("hello " INT_FMT " world", msg); /* { dg-warning "10: format '%i' expects argument of type 'int', but argument 2 has type 'const char \\*' " } */
kono
parents:
diff changeset
241 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
242 printf("hello " INT_FMT " world", msg);
kono
parents:
diff changeset
243 ^~~~~~~~ ~~~
kono
parents:
diff changeset
244 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
245 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
246 #define INT_FMT "%i"
kono
parents:
diff changeset
247 ~^
kono
parents:
diff changeset
248 %s
kono
parents:
diff changeset
249 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
250 #undef INT_FMT
kono
parents:
diff changeset
251 }
kono
parents:
diff changeset
252
kono
parents:
diff changeset
253 void test_macro_2 (const char *msg)
kono
parents:
diff changeset
254 {
kono
parents:
diff changeset
255 #define PRIu32 "u" /* { dg-message "17: format string is defined here" } */
kono
parents:
diff changeset
256 printf("hello %" PRIu32 " world", msg); /* { dg-warning "10: format '%u' expects argument of type 'unsigned int', but argument 2 has type 'const char \\*' " } */
kono
parents:
diff changeset
257 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
258 printf("hello %" PRIu32 " world", msg);
kono
parents:
diff changeset
259 ^~~~~~~~~ ~~~
kono
parents:
diff changeset
260 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
261 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
262 #define PRIu32 "u"
kono
parents:
diff changeset
263 ^
kono
parents:
diff changeset
264 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
265 #undef PRIu32
kono
parents:
diff changeset
266 }
kono
parents:
diff changeset
267
kono
parents:
diff changeset
268 void test_macro_3 (const char *msg)
kono
parents:
diff changeset
269 {
kono
parents:
diff changeset
270 #define FMT_STRING "hello %i world" /* { dg-warning "20: format '%i' expects argument of type 'int', but argument 2 has type 'const char \\*' " } */
kono
parents:
diff changeset
271 printf(FMT_STRING, msg); /* { dg-message "10: in expansion of macro 'FMT_STRING" } */
kono
parents:
diff changeset
272 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
273 #define FMT_STRING "hello %i world"
kono
parents:
diff changeset
274 ^~~~~~~~~~~~~~~~
kono
parents:
diff changeset
275 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
276 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
277 printf(FMT_STRING, msg);
kono
parents:
diff changeset
278 ^~~~~~~~~~
kono
parents:
diff changeset
279 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
280 #undef FMT_STRING
kono
parents:
diff changeset
281 }
kono
parents:
diff changeset
282
kono
parents:
diff changeset
283 void test_macro_4 (const char *msg)
kono
parents:
diff changeset
284 {
kono
parents:
diff changeset
285 #define FMT_STRING "hello %i world" /* { dg-warning "20: format '%i' expects argument of type 'int', but argument 2 has type 'const char \\*' " } */
kono
parents:
diff changeset
286 printf(FMT_STRING "\n", msg); /* { dg-message "10: in expansion of macro 'FMT_STRING" } */
kono
parents:
diff changeset
287 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
288 #define FMT_STRING "hello %i world"
kono
parents:
diff changeset
289 ^~~~~~~~~~~~~~~~
kono
parents:
diff changeset
290 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
291 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
292 printf(FMT_STRING "\n", msg);
kono
parents:
diff changeset
293 ^~~~~~~~~~
kono
parents:
diff changeset
294 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
295 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
296 #define FMT_STRING "hello %i world"
kono
parents:
diff changeset
297 ~^
kono
parents:
diff changeset
298 %s
kono
parents:
diff changeset
299 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
300 #undef FMT_STRING
kono
parents:
diff changeset
301 }
kono
parents:
diff changeset
302
kono
parents:
diff changeset
303 void test_non_contiguous_strings (void)
kono
parents:
diff changeset
304 {
kono
parents:
diff changeset
305 __builtin_printf(" %" "d ", 0.5); /* { dg-warning "20: format .%d. expects argument of type .int., but argument 2 has type .double." } */
kono
parents:
diff changeset
306 /* { dg-message "26: format string is defined here" "" { target *-*-* } .-1 } */
kono
parents:
diff changeset
307 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
308 __builtin_printf(" %" "d ", 0.5);
kono
parents:
diff changeset
309 ^~~~ ~~~
kono
parents:
diff changeset
310 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
311 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
312 __builtin_printf(" %" "d ", 0.5);
kono
parents:
diff changeset
313 ~~~~^
kono
parents:
diff changeset
314 %" "f
kono
parents:
diff changeset
315 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
316 }
kono
parents:
diff changeset
317
kono
parents:
diff changeset
318 void test_const_arrays (void)
kono
parents:
diff changeset
319 {
kono
parents:
diff changeset
320 /* TODO: ideally we'd highlight both the format string *and* the use of
kono
parents:
diff changeset
321 it here. For now, just verify that we gracefully handle this case. */
kono
parents:
diff changeset
322 const char a[] = " %d ";
kono
parents:
diff changeset
323 __builtin_printf(a, 0.5); /* { dg-warning "20: format .%d. expects argument of type .int., but argument 2 has type .double." } */
kono
parents:
diff changeset
324 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
325 __builtin_printf(a, 0.5);
kono
parents:
diff changeset
326 ^ ~~~
kono
parents:
diff changeset
327 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
328 }