annotate gcc/testsuite/gcc.dg/plugin/diagnostic-test-string-literals-1.c @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* { dg-do compile } */
kono
parents:
diff changeset
2 /* { dg-options "-O -fdiagnostics-show-caret" } */
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 /* This is a collection of unittests for ranges within string literals,
kono
parents:
diff changeset
5 using diagnostic_plugin_test_string_literals, which handles
kono
parents:
diff changeset
6 "__emit_string_literal_range" by generating a warning at the given
kono
parents:
diff changeset
7 subset of a string literal.
kono
parents:
diff changeset
8
kono
parents:
diff changeset
9 The indices are 0-based. It's easiest to verify things using string
kono
parents:
diff changeset
10 literals that are runs of 0-based digits (to avoid having to count
kono
parents:
diff changeset
11 characters).
kono
parents:
diff changeset
12
kono
parents:
diff changeset
13 LITERAL is a const void * to allow testing the various kinds of wide
kono
parents:
diff changeset
14 string literal, rather than just const char *. */
kono
parents:
diff changeset
15
kono
parents:
diff changeset
16 extern void __emit_string_literal_range (const void *literal, int caret_idx,
kono
parents:
diff changeset
17 int start_idx, int end_idx);
kono
parents:
diff changeset
18
kono
parents:
diff changeset
19 void
kono
parents:
diff changeset
20 test_simple_string_literal (void)
kono
parents:
diff changeset
21 {
kono
parents:
diff changeset
22 __emit_string_literal_range ("0123456789", /* { dg-warning "range" } */
kono
parents:
diff changeset
23 6, 6, 7);
kono
parents:
diff changeset
24 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
25 __emit_string_literal_range ("0123456789",
kono
parents:
diff changeset
26 ^~
kono
parents:
diff changeset
27 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
28 }
kono
parents:
diff changeset
29
kono
parents:
diff changeset
30 void
kono
parents:
diff changeset
31 test_concatenated_string_literal (void)
kono
parents:
diff changeset
32 {
kono
parents:
diff changeset
33 __emit_string_literal_range ("01234" "56789", /* { dg-warning "range" } */
kono
parents:
diff changeset
34 4, 3, 6);
kono
parents:
diff changeset
35 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
36 __emit_string_literal_range ("01234" "56789",
kono
parents:
diff changeset
37 ~^~~~~~
kono
parents:
diff changeset
38 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
39 }
kono
parents:
diff changeset
40
kono
parents:
diff changeset
41 void
kono
parents:
diff changeset
42 test_multiline_string_literal (void)
kono
parents:
diff changeset
43 {
kono
parents:
diff changeset
44 __emit_string_literal_range ("01234" /* { dg-warning "range" } */
kono
parents:
diff changeset
45 "56789",
kono
parents:
diff changeset
46 4, 3, 6);
kono
parents:
diff changeset
47 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
48 __emit_string_literal_range ("01234"
kono
parents:
diff changeset
49 ~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
kono
parents:
diff changeset
50 "56789",
kono
parents:
diff changeset
51 ~~~
kono
parents:
diff changeset
52 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
53 /* FIXME: why does the above need three trailing spaces? */
kono
parents:
diff changeset
54 }
kono
parents:
diff changeset
55
kono
parents:
diff changeset
56 /* Tests of various unicode encodings.
kono
parents:
diff changeset
57
kono
parents:
diff changeset
58 Digits 0 through 9 are unicode code points:
kono
parents:
diff changeset
59 U+0030 DIGIT ZERO
kono
parents:
diff changeset
60 ...
kono
parents:
diff changeset
61 U+0039 DIGIT NINE
kono
parents:
diff changeset
62 However, these are not always valid as UCN (see the comment in
kono
parents:
diff changeset
63 libcpp/charset.c:_cpp_valid_ucn).
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 Hence we need to test UCN using an alternative unicode
kono
parents:
diff changeset
66 representation of numbers; let's use Roman numerals,
kono
parents:
diff changeset
67 (though these start at one, not zero):
kono
parents:
diff changeset
68 U+2170 SMALL ROMAN NUMERAL ONE
kono
parents:
diff changeset
69 ...
kono
parents:
diff changeset
70 U+2174 SMALL ROMAN NUMERAL FIVE ("v")
kono
parents:
diff changeset
71 U+2175 SMALL ROMAN NUMERAL SIX ("vi")
kono
parents:
diff changeset
72 ...
kono
parents:
diff changeset
73 U+2178 SMALL ROMAN NUMERAL NINE. */
kono
parents:
diff changeset
74
kono
parents:
diff changeset
75 void
kono
parents:
diff changeset
76 test_hex (void)
kono
parents:
diff changeset
77 {
kono
parents:
diff changeset
78 /* Digits 0-9, expressing digit 5 in ASCII as "\x35"
kono
parents:
diff changeset
79 and with a space in place of digit 6, to terminate the escaped
kono
parents:
diff changeset
80 hex code. */
kono
parents:
diff changeset
81 __emit_string_literal_range ("01234\x35 789", /* { dg-warning "range" } */
kono
parents:
diff changeset
82 4, 3, 7);
kono
parents:
diff changeset
83 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
84 __emit_string_literal_range ("01234\x35 789"
kono
parents:
diff changeset
85 ~^~~~~~~
kono
parents:
diff changeset
86 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
87 }
kono
parents:
diff changeset
88
kono
parents:
diff changeset
89 void
kono
parents:
diff changeset
90 test_oct (void)
kono
parents:
diff changeset
91 {
kono
parents:
diff changeset
92 /* Digits 0-9, expressing digit 5 in ASCII as "\065"
kono
parents:
diff changeset
93 and with a space in place of digit 6, to terminate the escaped
kono
parents:
diff changeset
94 octal code. */
kono
parents:
diff changeset
95 __emit_string_literal_range ("01234\065 789", /* { dg-warning "range" } */
kono
parents:
diff changeset
96 4, 3, 7);
kono
parents:
diff changeset
97 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
98 __emit_string_literal_range ("01234\065 789"
kono
parents:
diff changeset
99 ~^~~~~~~
kono
parents:
diff changeset
100 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
101 }
kono
parents:
diff changeset
102
kono
parents:
diff changeset
103 void
kono
parents:
diff changeset
104 test_multiple (void)
kono
parents:
diff changeset
105 {
kono
parents:
diff changeset
106 /* Digits 0-9, expressing digit 5 in ASCII as hex "\x35"
kono
parents:
diff changeset
107 digit 6 in ASCII as octal "\066", concatenating multiple strings. */
kono
parents:
diff changeset
108 __emit_string_literal_range ("01234" "\x35" "\066" "789", /* { dg-warning "range" } */
kono
parents:
diff changeset
109 5, 3, 8);
kono
parents:
diff changeset
110 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
111 __emit_string_literal_range ("01234" "\x35" "\066" "789",
kono
parents:
diff changeset
112 ~~~~~~^~~~~~~~~~~~~~~~~~
kono
parents:
diff changeset
113 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
114 }
kono
parents:
diff changeset
115
kono
parents:
diff changeset
116 void
kono
parents:
diff changeset
117 test_ucn4 (void)
kono
parents:
diff changeset
118 {
kono
parents:
diff changeset
119 /* Digits 0-9, expressing digits 5 and 6 as Roman numerals expressed
kono
parents:
diff changeset
120 as UCN 4.
kono
parents:
diff changeset
121 The resulting string is encoded as UTF-8. Most of the digits are 1 byte
kono
parents:
diff changeset
122 each, but digits 5 and 6 are encoded with 3 bytes each.
kono
parents:
diff changeset
123 Hence to underline digits 4-7 we need to underling using bytes 4-11 in
kono
parents:
diff changeset
124 the UTF-8 encoding. */
kono
parents:
diff changeset
125 __emit_string_literal_range ("01234\u2174\u2175789", /* { dg-warning "range" } */
kono
parents:
diff changeset
126 5, 4, 11);
kono
parents:
diff changeset
127 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
128 __emit_string_literal_range ("01234\u2174\u2175789",
kono
parents:
diff changeset
129 ~^~~~~~~~~~~~~
kono
parents:
diff changeset
130 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
131 }
kono
parents:
diff changeset
132
kono
parents:
diff changeset
133 void
kono
parents:
diff changeset
134 test_ucn8 (void)
kono
parents:
diff changeset
135 {
kono
parents:
diff changeset
136 /* Digits 0-9, expressing digits 5 and 6 as Roman numerals as UCN 8.
kono
parents:
diff changeset
137 The resulting string is the same as as in test_ucn4 above, and hence
kono
parents:
diff changeset
138 has the same UTF-8 encoding, and so we again need to underline bytes
kono
parents:
diff changeset
139 4-11 in the UTF-8 encoding in order to underline digits 4-7. */
kono
parents:
diff changeset
140 __emit_string_literal_range ("01234\U00002174\U00002175789", /* { dg-warning "range" } */
kono
parents:
diff changeset
141 5, 4, 11);
kono
parents:
diff changeset
142 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
143 __emit_string_literal_range ("01234\U00002174\U00002175789",
kono
parents:
diff changeset
144 ~^~~~~~~~~~~~~~~~~~~~~
kono
parents:
diff changeset
145 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
146 }
kono
parents:
diff changeset
147
kono
parents:
diff changeset
148 void
kono
parents:
diff changeset
149 test_u8 (void)
kono
parents:
diff changeset
150 {
kono
parents:
diff changeset
151 /* Digits 0-9. */
kono
parents:
diff changeset
152 __emit_string_literal_range (u8"0123456789", /* { dg-warning "range" } */
kono
parents:
diff changeset
153 6, 4, 7);
kono
parents:
diff changeset
154 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
155 __emit_string_literal_range (u8"0123456789",
kono
parents:
diff changeset
156 ~~^~
kono
parents:
diff changeset
157 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
158 }
kono
parents:
diff changeset
159
kono
parents:
diff changeset
160 void
kono
parents:
diff changeset
161 test_u (void)
kono
parents:
diff changeset
162 {
kono
parents:
diff changeset
163 /* Digits 0-9. */
kono
parents:
diff changeset
164 __emit_string_literal_range (u"0123456789", /* { dg-error "unable to read substring location: execution character set != source character set" } */
kono
parents:
diff changeset
165 6, 4, 7);
kono
parents:
diff changeset
166 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
167 __emit_string_literal_range (u"0123456789",
kono
parents:
diff changeset
168 ^~~~~~~~~~~~~
kono
parents:
diff changeset
169 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
170 }
kono
parents:
diff changeset
171
kono
parents:
diff changeset
172 void
kono
parents:
diff changeset
173 test_U (void)
kono
parents:
diff changeset
174 {
kono
parents:
diff changeset
175 /* Digits 0-9. */
kono
parents:
diff changeset
176 __emit_string_literal_range (U"0123456789", /* { dg-error "unable to read substring location: execution character set != source character set" } */
kono
parents:
diff changeset
177 6, 4, 7);
kono
parents:
diff changeset
178 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
179 __emit_string_literal_range (U"0123456789",
kono
parents:
diff changeset
180 ^~~~~~~~~~~~~
kono
parents:
diff changeset
181 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
182 }
kono
parents:
diff changeset
183
kono
parents:
diff changeset
184 void
kono
parents:
diff changeset
185 test_L (void)
kono
parents:
diff changeset
186 {
kono
parents:
diff changeset
187 /* Digits 0-9. */
kono
parents:
diff changeset
188 __emit_string_literal_range (L"0123456789", /* { dg-error "unable to read substring location: execution character set != source character set" } */
kono
parents:
diff changeset
189 6, 4, 7);
kono
parents:
diff changeset
190 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
191 __emit_string_literal_range (L"0123456789",
kono
parents:
diff changeset
192 ^~~~~~~~~~~~~
kono
parents:
diff changeset
193 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
194 }
kono
parents:
diff changeset
195
kono
parents:
diff changeset
196 void
kono
parents:
diff changeset
197 test_raw_string_one_liner (void)
kono
parents:
diff changeset
198 {
kono
parents:
diff changeset
199 /* Digits 0-9. */
kono
parents:
diff changeset
200 __emit_string_literal_range (R"foo(0123456789)foo", /* { dg-warning "range" } */
kono
parents:
diff changeset
201 6, 4, 7);
kono
parents:
diff changeset
202 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
203 __emit_string_literal_range (R"foo(0123456789)foo",
kono
parents:
diff changeset
204 ~~^~
kono
parents:
diff changeset
205 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
206 }
kono
parents:
diff changeset
207
kono
parents:
diff changeset
208 void
kono
parents:
diff changeset
209 test_raw_string_multiline (void)
kono
parents:
diff changeset
210 {
kono
parents:
diff changeset
211 __emit_string_literal_range (R"foo(
kono
parents:
diff changeset
212 hello
kono
parents:
diff changeset
213 world
kono
parents:
diff changeset
214 )foo",
kono
parents:
diff changeset
215 6, 4, 7);
kono
parents:
diff changeset
216 /* { dg-error "unable to read substring location: range endpoints are on different lines" "" { target *-*-* } .-5 } */
kono
parents:
diff changeset
217 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
218 __emit_string_literal_range (R"foo(
kono
parents:
diff changeset
219 ^~~~~~
kono
parents:
diff changeset
220 hello
kono
parents:
diff changeset
221 ~~~~~
kono
parents:
diff changeset
222 world
kono
parents:
diff changeset
223 ~~~~~
kono
parents:
diff changeset
224 )foo",
kono
parents:
diff changeset
225 ~~~~~
kono
parents:
diff changeset
226 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
227 }
kono
parents:
diff changeset
228
kono
parents:
diff changeset
229 void
kono
parents:
diff changeset
230 test_macro (void)
kono
parents:
diff changeset
231 {
kono
parents:
diff changeset
232 #define START "01234" /* { dg-warning "range" } */
kono
parents:
diff changeset
233 __emit_string_literal_range (START
kono
parents:
diff changeset
234 "56789",
kono
parents:
diff changeset
235 4, 3, 6);
kono
parents:
diff changeset
236 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
237 #define START "01234"
kono
parents:
diff changeset
238 ~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
kono
parents:
diff changeset
239 __emit_string_literal_range (START
kono
parents:
diff changeset
240 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
kono
parents:
diff changeset
241 "56789",
kono
parents:
diff changeset
242 ~~~
kono
parents:
diff changeset
243 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
244 }
kono
parents:
diff changeset
245
kono
parents:
diff changeset
246 void
kono
parents:
diff changeset
247 test_multitoken_macro (void)
kono
parents:
diff changeset
248 {
kono
parents:
diff changeset
249 #define RANGE ("0123456789") /* { dg-error "unable to read substring location: macro expansion" } */
kono
parents:
diff changeset
250 __emit_string_literal_range (RANGE, 4, 3, 6);
kono
parents:
diff changeset
251 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
252 #define RANGE ("0123456789")
kono
parents:
diff changeset
253 ^~~~~~~~~~~~~~
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
254 { dg-end-multiline-output "" { target c } } */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
255 /* { dg-begin-multiline-output "" }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
256 #define RANGE ("0123456789")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
257 ~^~~~~~~~~~~~~
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
258 { dg-end-multiline-output "" { target c++ } } */
111
kono
parents:
diff changeset
259 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
260 __emit_string_literal_range (RANGE, 4, 3, 6);
kono
parents:
diff changeset
261 ^~~~~
kono
parents:
diff changeset
262 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
263 #undef RANGE
kono
parents:
diff changeset
264 }
kono
parents:
diff changeset
265
kono
parents:
diff changeset
266 /* Verify that the location of the closing quote is used
kono
parents:
diff changeset
267 for the location of the null terminating character. */
kono
parents:
diff changeset
268
kono
parents:
diff changeset
269 void
kono
parents:
diff changeset
270 test_terminator_location (void)
kono
parents:
diff changeset
271 {
kono
parents:
diff changeset
272 __emit_string_literal_range ("0123456789", /* { dg-warning "range" } */
kono
parents:
diff changeset
273 10, 10, 10);
kono
parents:
diff changeset
274 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
275 __emit_string_literal_range ("0123456789",
kono
parents:
diff changeset
276 ^
kono
parents:
diff changeset
277 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
278 }
kono
parents:
diff changeset
279
kono
parents:
diff changeset
280 /* Verify that we fail gracefully when a string literal token is split
kono
parents:
diff changeset
281 across multiple physical lines. */
kono
parents:
diff changeset
282
kono
parents:
diff changeset
283 void
kono
parents:
diff changeset
284 test_backslash_continued_logical_lines (void)
kono
parents:
diff changeset
285 {
kono
parents:
diff changeset
286 __emit_string_literal_range ("\
kono
parents:
diff changeset
287 01234\
kono
parents:
diff changeset
288 56789", 6, 6, 7);
kono
parents:
diff changeset
289 /* { dg-error "unable to read substring location: range endpoints are on different lines" "" { target *-*-* } .-3 } */
kono
parents:
diff changeset
290 /* { dg-begin-multiline-output "" }
kono
parents:
diff changeset
291 __emit_string_literal_range ("\
kono
parents:
diff changeset
292 ^~
kono
parents:
diff changeset
293 01234\
kono
parents:
diff changeset
294 ~~~~~~
kono
parents:
diff changeset
295 56789", 6, 6, 7);
kono
parents:
diff changeset
296 ~~~~~~
kono
parents:
diff changeset
297 { dg-end-multiline-output "" } */
kono
parents:
diff changeset
298 }
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
299
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
300 /* Reproducer for PR 87652; this is whitespace-sensitive. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
301
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
302 #include "pr87562-a.h"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
303
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
304
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
305
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
306
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
307 #include "pr87562-b.h"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
308
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
309 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
310 pr87652 (const char *stem, int counter)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
311 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
312 char label[100];
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
313 ASM_GENERATE_INTERNAL_LABEL (label, stem, counter);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
314
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
315 /* This warning is actually in "pr87562-a.h". */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
316 /* { dg-warning "39: range" "" { target *-*-* } 5 } */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
317 /* { dg-begin-multiline-output "" }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
318 __emit_string_literal_range ("*.%s%u", 2, 2, 3); \
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
319 ^~
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
320 { dg-end-multiline-output "" } */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
321 }