annotate gcc/testsuite/g++.dg/warn/Wformat-ranges.C @ 158:494b0b89df80 default tip

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