1 ;--------------------------------------------------
2 ; Use -strict-whitespace to check marker and note alignment here.
3 ; (Also check multiline marker where start/end columns vary across lines.)
5 ; In the remaining checks, don't use -strict-whitespace and thus check just the
6 ; presence, order, and lengths of markers. That way, if we ever change padding
7 ; within line labels, we don't have to adjust so many tests.
8 ;--------------------------------------------------
10 ; RUN: echo 'hello world' > %t.in
11 ; RUN: echo 'goodbye' >> %t.in
12 ; RUN: echo 'world' >> %t.in
13 ; RUN: echo 'unicorn' >> %t.in
15 ; RUN: echo 'CHECK: hello' > %t.chk
16 ; RUN: echo 'CHECK: universe' >> %t.chk
18 ; RUN: %ProtectFileCheckOutput \
19 ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk -v 2>&1 \
20 ; RUN: | FileCheck -strict-whitespace -match-full-lines -check-prefix=ALIGN \
21 ; RUN: -implicit-check-not='remark:' %s
23 ; Verbose diagnostics are suppressed but not errors.
24 ; ALIGN:{{.*}}error:{{.*}}
25 ; ALIGN:{{.*}}possible intended match here{{.*}}
29 ; ALIGN-NEXT: 1: hello world
30 ; ALIGN-NEXT:check:1 ^~~~~
31 ; ALIGN-NEXT:check:2'0 X~~~~~~ error: no match found
32 ; ALIGN-NEXT: 2: goodbye
33 ; ALIGN-NEXT:check:2'0 ~~~~~~~~
34 ; ALIGN-NEXT: 3: world
35 ; ALIGN-NEXT:check:2'0 ~~~~~~
36 ; ALIGN-NEXT: 4: unicorn
37 ; ALIGN-NEXT:check:2'0 ~~~~~~~~
38 ; ALIGN-NEXT:check:2'1 ? possible intended match
42 ;--------------------------------------------------
43 ; CHECK (also: multi-line search range, fuzzy match)
44 ;--------------------------------------------------
46 ; Good match and no match.
48 ; RUN: echo 'hello' > %t.in
49 ; RUN: echo 'again' >> %t.in
50 ; RUN: echo 'whirled' >> %t.in
52 ; RUN: echo 'CHECK: hello' > %t.chk
53 ; RUN: echo 'CHECK: world' >> %t.chk
55 ; RUN: %ProtectFileCheckOutput \
56 ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk 2>&1 \
57 ; RUN: | FileCheck -match-full-lines %s -check-prefix=CHK \
58 ; RUN: -implicit-check-not='remark:'
59 ; RUN: %ProtectFileCheckOutput \
60 ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk -v 2>&1 \
61 ; RUN: | FileCheck -match-full-lines %s -check-prefixes=CHK,CHK-V \
62 ; RUN: -implicit-check-not='remark:'
63 ; RUN: %ProtectFileCheckOutput \
64 ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk -vv 2>&1 \
65 ; RUN: | FileCheck -match-full-lines %s -check-prefixes=CHK,CHK-V \
66 ; RUN: -implicit-check-not='remark:'
68 ; Verbose diagnostics are suppressed but not errors.
69 ; CHK: {{.*}}error:{{.*}}
70 ; CHK: {{.*}}possible intended match here{{.*}}
74 ; CHK-V-NEXT: check:1 ^~~~~
75 ; CHK-NEXT: check:2'0 X error: no match found
77 ; CHK-NEXT: check:2'0 ~~~~~~
78 ; CHK-NEXT: 3: whirled
79 ; CHK-NEXT: check:2'0 ~~~~~~~~
80 ; CHK-NEXT: check:2'1 ? possible intended match
84 ;--------------------------------------------------
86 ;--------------------------------------------------
88 ; Good match and no match.
90 ; RUN: echo 'pete' > %t.in
91 ; RUN: echo 'repete' >> %t.in
92 ; RUN: echo 'repeat' >> %t.in
94 ; RUN: echo 'CHECK-COUNT-3: pete' > %t.chk
96 ; RUN: %ProtectFileCheckOutput \
97 ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk 2>&1 \
98 ; RUN: | FileCheck -match-full-lines %s -check-prefixes=CNT,CNT-Q \
99 ; RUN: -implicit-check-not='remark:'
100 ; RUN: %ProtectFileCheckOutput \
101 ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk -v 2>&1 \
102 ; RUN: | FileCheck -match-full-lines %s -check-prefixes=CNT,CNT-V \
103 ; RUN: -implicit-check-not='remark:'
104 ; RUN: %ProtectFileCheckOutput \
105 ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk -vv 2>&1 \
106 ; RUN: | FileCheck -match-full-lines %s -check-prefixes=CNT,CNT-V \
107 ; RUN: -implicit-check-not='remark:'
109 ; Verbose diagnostics are suppressed but not errors.
110 ; CNT: {{.*}}error:{{.*}}
114 ; CNT-V-NEXT: count:1'0 ^~~~
115 ; CNT-NEXT: 2: repete
116 ; CNT-V-NEXT: count:1'1 ^~~~
117 ; CNT-Q-NEXT: count:1'0 X error: no match found
118 ; CNT-V-NEXT: count:1'2 X error: no match found
119 ; CNT-NEXT: 3: repeat
120 ; CNT-Q-NEXT: count:1'0 ~~~~~~~
121 ; CNT-Q-NEXT: count:1'1 ? possible intended match
122 ; CNT-V-NEXT: count:1'2 ~~~~~~~
123 ; CNT-V-NEXT: count:1'3 ? possible intended match
127 ;--------------------------------------------------
128 ; CHECK-NEXT (also: EOF search-range, wrong-line match)
129 ;--------------------------------------------------
131 ; Good match and no match.
133 ; RUN: echo 'hello' > %t.in
134 ; RUN: echo 'again' >> %t.in
136 ; RUN: echo 'CHECK: hello' > %t.chk
137 ; RUN: echo 'CHECK-NEXT: again' >> %t.chk
138 ; RUN: echo 'CHECK-NEXT: world' >> %t.chk
140 ; RUN: %ProtectFileCheckOutput \
141 ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk 2>&1 \
142 ; RUN: | FileCheck -match-full-lines %s -check-prefix=NXT \
143 ; RUN: -implicit-check-not='remark:'
144 ; RUN: %ProtectFileCheckOutput \
145 ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk -v 2>&1 \
146 ; RUN: | FileCheck -match-full-lines %s -check-prefixes=NXT,NXT-V \
147 ; RUN: -implicit-check-not='remark:'
148 ; RUN: %ProtectFileCheckOutput \
149 ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk -vv 2>&1 \
150 ; RUN: | FileCheck -match-full-lines %s -check-prefixes=NXT,NXT-V,NXT-VV \
151 ; RUN: -implicit-check-not='remark:' -allow-unused-prefixes
153 ; Verbose diagnostics are suppressed but not errors.
154 ; NXT: {{.*}}error:{{.*}}
158 ; NXT-V-NEXT: check:1 ^~~~~
160 ; NXT-V-NEXT: next:2 ^~~~~
161 ; NXT-NEXT: next:3 X error: no match found
167 ; RUN: echo 'yonder' >> %t.in
168 ; RUN: echo 'world' >> %t.in
170 ; RUN: %ProtectFileCheckOutput \
171 ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk 2>&1 \
172 ; RUN: | FileCheck -match-full-lines %s -check-prefix=NXT2
175 ; NXT2-NEXT: 1: hello
176 ; NXT2-NEXT: 2: again
177 ; NXT2-NEXT: 3: yonder
178 ; NXT2-NEXT: 4: world
179 ; NXT2-NEXT: next:3 !~~~~ error: match on wrong line
183 ;--------------------------------------------------
184 ; CHECK-SAME (also: multiple annotations per line, single-char search range,
186 ;--------------------------------------------------
188 ; Good match and no match.
190 ; RUN: echo 'hello world!' > %t.in
192 ; RUN: echo 'CHECK: hello' > %t.chk
193 ; RUN: echo 'CHECK-SAME: world' >> %t.chk
194 ; RUN: echo 'CHECK-SAME: again' >> %t.chk
196 ; RUN: %ProtectFileCheckOutput \
197 ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk 2>&1 \
198 ; RUN: | FileCheck -match-full-lines %s -check-prefix=SAM \
199 ; RUN: -implicit-check-not='remark:'
200 ; RUN: %ProtectFileCheckOutput \
201 ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk -v 2>&1 \
202 ; RUN: | FileCheck -match-full-lines %s -check-prefixes=SAM,SAM-V \
203 ; RUN: -implicit-check-not='remark:'
204 ; RUN: %ProtectFileCheckOutput \
205 ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk -vv 2>&1 \
206 ; RUN: | FileCheck -match-full-lines %s -check-prefixes=SAM,SAM-V,SAM-VV \
207 ; RUN: -implicit-check-not='remark:' -allow-unused-prefixes
209 ; Verbose diagnostics are suppressed but not errors.
210 ; SAM: {{.*}}error:{{.*}}
213 ; SAM-NEXT: 1: hello world!
214 ; SAM-V-NEXT: check:1 ^~~~~
215 ; SAM-V-NEXT: same:2 ^~~~~
216 ; SAM-NEXT: same:3 X~ error: no match found
222 ; RUN: echo 'again' >> %t.in
224 ; RUN: %ProtectFileCheckOutput \
225 ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk -v 2>&1 \
226 ; RUN: | FileCheck -match-full-lines %s -check-prefixes=SAM2 \
227 ; RUN: -implicit-check-not='remark:'
229 ; Verbose diagnostics are suppressed but not errors.
230 ; SAM2: {{.*}}error:{{.*}}
233 ; SAM2-NEXT: 1: hello world!
234 ; SAM2-NEXT: check:1 ^~~~~
235 ; SAM2-NEXT: same:2 ^~~~~
236 ; SAM2-NEXT: 2: again
237 ; SAM2-NEXT: same:3 !~~~~ error: match on wrong line
241 ;--------------------------------------------------
242 ; CHECK-EMPTY (also: search range ends at label, single-char match, wrong-line
244 ;--------------------------------------------------
246 ; Good match and no match.
248 ; CHECK-EMPTY always seems to match an empty line at EOF (illegally when it's
249 ; not the next line) unless either (1) the last line is non-empty and has no
250 ; newline or (2) there's a CHECK-LABEL to end the search range before EOF. We
251 ; choose scenario 2 to check the case of no match.
253 ; RUN: echo 'hello' > %t.in
254 ; RUN: echo '' >> %t.in
255 ; RUN: echo 'world' >> %t.in
256 ; RUN: echo 'label' >> %t.in
258 ; RUN: echo 'CHECK: hello' > %t.chk
259 ; RUN: echo 'CHECK-EMPTY:' >> %t.chk
260 ; RUN: echo 'CHECK-EMPTY:' >> %t.chk
261 ; RUN: echo 'CHECK-LABEL: label' >> %t.chk
263 ; RUN: %ProtectFileCheckOutput \
264 ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk 2>&1 \
265 ; RUN: | FileCheck -match-full-lines %s -check-prefix=EMP \
266 ; RUN: -implicit-check-not='remark:'
267 ; RUN: %ProtectFileCheckOutput \
268 ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk -v 2>&1 \
269 ; RUN: | FileCheck -match-full-lines %s -check-prefixes=EMP,EMP-V \
270 ; RUN: -implicit-check-not='remark:'
271 ; RUN: %ProtectFileCheckOutput \
272 ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk -vv 2>&1 \
273 ; RUN: | FileCheck -match-full-lines %s -check-prefixes=EMP,EMP-V,EMP-VV \
274 ; RUN: -implicit-check-not='remark:' -allow-unused-prefixes
276 ; Verbose diagnostics are suppressed but not errors.
277 ; EMP: {{.*}}error:{{.*}}
281 ; EMP-V-NEXT: check:1 ^~~~~
283 ; EMP-V-NEXT: empty:2 ^
284 ; EMP-NEXT: empty:3 X error: no match found
286 ; EMP-NEXT: empty:3 ~~~~~~
288 ; EMP-V-NEXT: label:4 ^~~~~
289 ; EMP-NEXT: empty:3 ~~~~~
295 ; RUN: echo 'hello' > %t.in
296 ; RUN: echo 'world' >> %t.in
298 ; RUN: echo 'CHECK: hello' > %t.chk
299 ; RUN: echo 'CHECK-EMPTY:' >> %t.chk
301 ; RUN: %ProtectFileCheckOutput \
302 ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk 2>&1 \
303 ; RUN: | FileCheck -match-full-lines %s -check-prefix=EMP2 \
304 ; RUN: -implicit-check-not='remark:'
305 ; RUN: %ProtectFileCheckOutput \
306 ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk -v 2>&1 \
307 ; RUN: | FileCheck -match-full-lines %s -check-prefixes=EMP2,EMP2-V \
308 ; RUN: -implicit-check-not='remark:'
309 ; RUN: %ProtectFileCheckOutput \
310 ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk -vv 2>&1 \
311 ; RUN: | FileCheck -match-full-lines %s -check-prefixes=EMP2,EMP2-V,EMP2-VV \
312 ; RUN: -implicit-check-not='remark:' -allow-unused-prefixes
314 ; Verbose diagnostics are suppressed but not errors.
315 ; EMP2: {{.*}}error:{{.*}}
318 ; EMP2-NEXT: 1: hello
319 ; EMP2-V-NEXT: check:1 ^~~~~
320 ; EMP2-NEXT: 2: world
322 ; EMP2-NEXT: empty:2 ! error: match on wrong line
326 ;--------------------------------------------------
327 ; CHECK-NOT (also: EOF pattern, and multiline range that ends before EOL)
328 ;--------------------------------------------------
330 ; No match (success) and unexpected match (error).
332 ; RUN: echo 'hello' > %t.in
333 ; RUN: echo 'world' >> %t.in
334 ; RUN: echo 'again' >> %t.in
336 ; RUN: echo 'CHECK-NOT: goodbye' > %t.chk
337 ; RUN: echo 'CHECK-NOT: world' >> %t.chk
339 ; RUN: %ProtectFileCheckOutput \
340 ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk 2>&1 \
341 ; RUN: | FileCheck -match-full-lines %s -check-prefix=NOT \
342 ; RUN: -implicit-check-not='remark:'
343 ; RUN: %ProtectFileCheckOutput \
344 ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk -v 2>&1 \
345 ; RUN: | FileCheck -match-full-lines %s -check-prefixes=NOT,NOT-V \
346 ; RUN: -implicit-check-not='remark:' -allow-unused-prefixes
347 ; RUN: %ProtectFileCheckOutput \
348 ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk -vv 2>&1 \
349 ; RUN: | FileCheck -match-full-lines %s -check-prefixes=NOT,NOT-V,NOT-VV \
350 ; RUN: -implicit-check-not='remark:' -allow-unused-prefixes
352 ; Verbose diagnostics are suppressed but not errors.
353 ; NOT: {{.*}}error:{{.*}}
357 ; NOT-VV-NEXT: not:1 X~~~~~
359 ; NOT-VV-NEXT: not:1 ~~~~~~
360 ; NOT-NEXT: not:2 !~~~~ error: no match expected
362 ; NOT-VV-NEXT: not:1 ~~~~~~
364 ; NOT-VV-NEXT: eof:2 ^
368 ; Again, but with a CHECK instead of EOF as search range end.
370 ; RUN: echo 'CHECK: ain' >> %t.chk
372 ; RUN: %ProtectFileCheckOutput \
373 ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk 2>&1 \
374 ; RUN: | FileCheck -match-full-lines %s -check-prefix=NOT2 \
375 ; RUN: -implicit-check-not='remark:'
376 ; RUN: %ProtectFileCheckOutput \
377 ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk -v 2>&1 \
378 ; RUN: | FileCheck -match-full-lines %s -check-prefixes=NOT2,NOT2-V \
379 ; RUN: -implicit-check-not='remark:'
380 ; RUN: %ProtectFileCheckOutput \
381 ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk -vv 2>&1 \
382 ; RUN: | FileCheck -match-full-lines %s -check-prefixes=NOT2,NOT2-V,NOT2-VV \
383 ; RUN: -implicit-check-not='remark:'
385 ; Verbose diagnostics are suppressed but not errors.
386 ; NOT2: {{.*}}error:{{.*}}
389 ; NOT2-NEXT: 1: hello
390 ; NOT2-VV-NEXT: not:1 X~~~~~
391 ; NOT2-NEXT: 2: world
392 ; NOT2-VV-NEXT: not:1 ~~~~~~
393 ; NOT2-NEXT: not:2 !~~~~ error: no match expected
394 ; NOT2-NEXT: 3: again
395 ; NOT2-V-NEXT: check:3 ^~~
396 ; NOT2-VV-NEXT: not:1 ~~
400 ;--------------------------------------------------
401 ; CHECK-DAG (also: matches in different order than directives, discarded match)
402 ;--------------------------------------------------
404 ; Good match, discarded match plus good match, and no match.
406 ; RUN: echo 'abc' > %t.in
407 ; RUN: echo 'def' >> %t.in
408 ; RUN: echo 'abc' >> %t.in
410 ; RUN: echo 'CHECK-DAG: def' > %t.chk
411 ; RUN: echo 'CHECK-DAG: abc' >> %t.chk
412 ; RUN: echo 'CHECK-DAG: abc' >> %t.chk
413 ; RUN: echo 'CHECK-DAG: def' >> %t.chk
415 ; Prefixes used here:
416 ; DAG = quiet, -v, or -vv
418 ; DAG-V = -v or -vv (-vv implies -v)
419 ; DAG-VQ = -v and not -vv
422 ; RUN: %ProtectFileCheckOutput \
423 ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk 2>&1 \
424 ; RUN: | FileCheck -match-full-lines %s -check-prefixes=DAG,DAG-Q \
425 ; RUN: -implicit-check-not='remark:'
426 ; RUN: %ProtectFileCheckOutput \
427 ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk -v 2>&1 \
428 ; RUN: | FileCheck -match-full-lines %s -check-prefixes=DAG,DAG-V,DAG-VQ \
429 ; RUN: -implicit-check-not='remark:'
430 ; RUN: %ProtectFileCheckOutput \
431 ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk -vv 2>&1 \
432 ; RUN: | FileCheck -match-full-lines %s -check-prefixes=DAG,DAG-V,DAG-VV \
433 ; RUN: -implicit-check-not='remark:'
435 ; Verbose diagnostics are suppressed but not errors.
436 ; DAG: {{.*}}error:{{.*}}
440 ; DAG-V-NEXT: dag:2 ^~~
441 ; DAG-VV-NEXT: dag:3'0 !~~ discard: overlaps earlier match
443 ; DAG-V-NEXT: dag:1 ^~~
444 ; DAG-VV-NEXT: dag:4'0 !~~ discard: overlaps earlier match
445 ; DAG-Q-NEXT: dag:4 X error: no match found
446 ; DAG-VQ-NEXT: dag:4 X error: no match found
447 ; DAG-VV-NEXT: dag:4'1 X error: no match found
449 ; DAG-VQ-NEXT: dag:3 ^~~
450 ; DAG-VV-NEXT: dag:3'1 ^~~
451 ; DAG-Q-NEXT: dag:4 ~~~~
452 ; DAG-VQ-NEXT: dag:4 ~~~~
453 ; DAG-VV-NEXT: dag:4'1 ~~~~
457 ; Check sorting of annotations when the order of diagnostics across an input
458 ; line is different than the order of the associated directives in the check
459 ; file. Try cases when diagnostics' input ranges overlap but are not
460 ; identical to check how that affects sorting.
462 ; RUN: echo 'abc def abc def' > %t.in
464 ; RUN: echo 'CHECK-DAG: def' > %t.chk
465 ; RUN: echo 'CHECK-DAG: bc' >> %t.chk
466 ; RUN: echo 'CHECK-DAG: abc' >> %t.chk
467 ; RUN: echo 'CHECK-DAG: de' >> %t.chk
468 ; RUN: echo 'CHECK-DAG: def' >> %t.chk
470 ; RUN: %ProtectFileCheckOutput \
471 ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk 2>&1 \
472 ; RUN: | FileCheck -match-full-lines %s -check-prefixes=DAG1L,DAG1L-Q \
473 ; RUN: -implicit-check-not='remark:'
474 ; RUN: %ProtectFileCheckOutput \
475 ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk -v 2>&1 \
476 ; RUN: | FileCheck -match-full-lines %s -check-prefixes=DAG1L,DAG1L-V,DAG1L-VQ \
477 ; RUN: -implicit-check-not='remark:'
478 ; RUN: %ProtectFileCheckOutput \
479 ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk -vv 2>&1 \
480 ; RUN: | FileCheck -match-full-lines %s -check-prefixes=DAG1L,DAG1L-V,DAG1L-VV \
481 ; RUN: -implicit-check-not='remark:'
483 ; Verbose diagnostics are suppressed but not errors.
484 ; DAG1L:{{.*}}error:{{.*}}
487 ; DAG1L-NEXT: 1: abc def abc def
488 ; DAG1L-V-NEXT:dag:1 ^~~
489 ; DAG1L-V-NEXT:dag:2 ^~
490 ; DAG1L-VV-NEXT:dag:3'0 !~~ discard: overlaps earlier match
491 ; DAG1L-VQ-NEXT:dag:3 ^~~
492 ; DAG1L-VV-NEXT:dag:3'1 ^~~
493 ; DAG1L-VV-NEXT:dag:4'0 !~ discard: overlaps earlier match
494 ; DAG1L-VQ-NEXT:dag:4 ^~
495 ; DAG1L-VV-NEXT:dag:4'1 ^~
496 ; DAG1L-VV-NEXT:dag:5'0 !~~ discard: overlaps earlier match
497 ; DAG1L-VV-NEXT:dag:5'1 !~~ discard: overlaps earlier match
498 ; DAG1L-Q-NEXT:dag:5 X~ error: no match found
499 ; DAG1L-VQ-NEXT:dag:5 X~ error: no match found
500 ; DAG1L-VV-NEXT:dag:5'2 X~ error: no match found
504 ;--------------------------------------------------
507 ; Each CHECK-LABEL is processed twice: once before other patterns in the
508 ; preceding section, and once afterward.
510 ; As expected, the search range for a negative pattern preceding a CHECK-LABEL
511 ; ends at the start of the CHECK-LABEL match. not:7 and not:11 below
512 ; demonstrate this behavior.
514 ; The search range for a positive pattern preceding a CHECK-LABEL ends at the
515 ; end of the CHECK-LABEL match. check:3 and check:5 below demonstrate this
516 ; behavior. As in the case of check:5, an effect of this behavior is that the
517 ; second CHECK-LABEL match might fail even though the first succeeded.
519 ; FIXME: It seems like the search range for such a positive pattern should be
520 ; the same as in the case of a negative pattern. Note that -dump-input is
521 ; correct here. It's the matching behavior that's strange.
522 ;--------------------------------------------------
524 ; RUN: echo 'text' > %t.in
525 ; RUN: echo 'labelA' >> %t.in
526 ; RUN: echo 'textA' >> %t.in
527 ; RUN: echo 'labelB' >> %t.in
528 ; RUN: echo 'textB' >> %t.in
529 ; RUN: echo 'labelC' >> %t.in
530 ; RUN: echo 'textC' >> %t.in
531 ; RUN: echo 'labelD' >> %t.in
532 ; RUN: echo 'textD' >> %t.in
533 ; RUN: echo 'labelE' >> %t.in
534 ; RUN: echo 'textE' >> %t.in
535 ; RUN: echo 'labelF' >> %t.in
537 ; RUN: echo 'CHECK: text' > %t.chk
538 ; RUN: echo 'CHECK-LABEL: labelA' >> %t.chk
539 ; RUN: echo 'CHECK: foobar' >> %t.chk
540 ; RUN: echo 'CHECK-LABEL: labelB' >> %t.chk
541 ; RUN: echo 'CHECK: labelC' >> %t.chk
542 ; RUN: echo 'CHECK-LABEL: labelC' >> %t.chk
543 ; RUN: echo 'CHECK-NOT: foobar' >> %t.chk
544 ; RUN: echo 'CHECK-LABEL: labelD' >> %t.chk
545 ; RUN: echo 'CHECK-NOT: textD' >> %t.chk
546 ; RUN: echo 'CHECK-LABEL: labelE' >> %t.chk
547 ; RUN: echo 'CHECK-NOT: labelF' >> %t.chk
548 ; RUN: echo 'CHECK-LABEL: labelF' >> %t.chk
550 ; RUN: %ProtectFileCheckOutput \
551 ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk 2>&1 \
552 ; RUN: | FileCheck -match-full-lines %s -check-prefixes=LAB,LAB-Q \
553 ; RUN: -implicit-check-not='{{remark:|error:}}'
554 ; RUN: %ProtectFileCheckOutput \
555 ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk -v 2>&1 \
556 ; RUN: | FileCheck -match-full-lines %s -check-prefixes=LAB,LAB-V \
557 ; RUN: -implicit-check-not='{{remark:|error:}}'
558 ; RUN: %ProtectFileCheckOutput \
559 ; RUN: not FileCheck -dump-input=always -input-file %t.in %t.chk -vv 2>&1 \
560 ; RUN: | FileCheck -match-full-lines %s -check-prefixes=LAB,LAB-V,LAB-VV \
561 ; RUN: -implicit-check-not='{{remark:|error:}}'
563 ; Verbose diagnostics are suppressed but not errors.
564 ; LAB:{{.*}}.chk:3:8: error: CHECK: expected string not found in input
565 ; LAB:{{.*}}.chk:6:14: error: CHECK-LABEL: expected string not found in input
566 ; LAB:{{.*}}.chk:9:12: error: CHECK-NOT: excluded string found in input
570 ; LAB-V-NEXT:check:1 ^~~~
571 ; LAB-NEXT: 2: labelA
572 ; LAB-V-NEXT:label:2'0 ^~~~~~
573 ; LAB-V-NEXT:label:2'1 ^~~~~~
574 ; LAB-NEXT:check:3 X error: no match found
576 ; LAB-NEXT:check:3 ~~~~~~
577 ; LAB-NEXT: 4: labelB
578 ; LAB-V-NEXT:label:4 ^~~~~~
579 ; LAB-NEXT:check:3 ~~~~~~
581 ; LAB-NEXT: 6: labelC
582 ; LAB-V-NEXT:label:6'0 ^~~~~~
583 ; LAB-V-NEXT:check:5 ^~~~~~
584 ; LAB-Q-NEXT:label:6 X error: no match found
585 ; LAB-V-NEXT:label:6'1 X error: no match found
586 ; LAB-VV-NEXT:not:7 X
588 ; LAB-VV-NEXT:not:7 ~~~~~~
589 ; LAB-NEXT: 8: labelD
590 ; LAB-V-NEXT:label:8'0 ^~~~~~
591 ; LAB-V-NEXT:label:8'1 ^~~~~~
593 ; LAB-NEXT:not:9 !~~~~ error: no match expected
594 ; LAB-NEXT: 10: labelE
595 ; LAB-V-NEXT:label:10'0 ^~~~~~
596 ; LAB-V-NEXT:label:10'1 ^~~~~~
597 ; LAB-VV-NEXT:not:11 X
598 ; LAB-NEXT: 11: textE
599 ; LAB-VV-NEXT:not:11 ~~~~~~
600 ; LAB-NEXT: 12: labelF
601 ; LAB-V-NEXT:label:12'0 ^~~~~~
602 ; LAB-V-NEXT:label:12'1 ^~~~~~
606 ;--------------------------------------------------
607 ; --implicit-check-not
609 ; The first two --implicit-check-not patterns have no match (success). The
610 ; third has an unexpected match (error). To check per-input-line annotation
611 ; sorting, all of those plus the CHECK directives have annotations on the same
613 ;--------------------------------------------------
615 ; RUN: echo 'hello world again!' > %t.in
617 ; RUN: echo 'CHECK: hel' > %t.chk
618 ; RUN: echo 'CHECK: wor' >> %t.chk
619 ; RUN: echo 'CHECK: !' >> %t.chk
621 ; Prefixes used here:
622 ; IMPNOT = quiet, -v, or -vv
624 ; IMPNOT-V = -v or -vv (-vv implies -v)
625 ; IMPNOT-VQ = -v and not -vv
628 ; RUN: %ProtectFileCheckOutput \
629 ; RUN: not FileCheck -dump-input=always -input-file=%t.in %t.chk 2>&1 \
630 ; RUN: --implicit-check-not='goodbye' \
631 ; RUN: --implicit-check-not='world' \
632 ; RUN: --implicit-check-not='again' \
633 ; RUN: | FileCheck -match-full-lines %s -check-prefixes=IMPNOT,IMPNOT-Q \
634 ; RUN: -implicit-check-not='{{remark:|error:}}'
635 ; RUN: %ProtectFileCheckOutput \
636 ; RUN: not FileCheck -dump-input=always -input-file=%t.in %t.chk -v 2>&1 \
637 ; RUN: --implicit-check-not='goodbye' \
638 ; RUN: --implicit-check-not='world' \
639 ; RUN: --implicit-check-not='again' \
640 ; RUN: | FileCheck -match-full-lines %s \
641 ; RUN: -check-prefixes=IMPNOT,IMPNOT-V,IMPNOT-VQ \
642 ; RUN: -implicit-check-not='{{remark:|error:}}'
643 ; RUN: %ProtectFileCheckOutput \
644 ; RUN: not FileCheck -dump-input=always -input-file=%t.in %t.chk -vv 2>&1 \
645 ; RUN: --implicit-check-not='goodbye' \
646 ; RUN: --implicit-check-not='world' \
647 ; RUN: --implicit-check-not='again' \
648 ; RUN: | FileCheck -match-full-lines %s \
649 ; RUN: -check-prefixes=IMPNOT,IMPNOT-V,IMPNOT-VV \
650 ; RUN: -implicit-check-not='{{remark:|error:}}'
652 ; Verbose diagnostics are suppressed but not errors.
653 ; IMPNOT:{{.*}}command line:1:22: error: IMPLICIT-CHECK-NOT: excluded string found in input
656 ; IMPNOT-NEXT: 1: hello world again!
657 ; IMPNOT-V-NEXT:check:1 ^~~
658 ; IMPNOT-VV-NEXT:not:imp1'0 X
659 ; IMPNOT-VV-NEXT:not:imp2'0 X
660 ; IMPNOT-VV-NEXT:not:imp3'0 X
661 ; IMPNOT-V-NEXT:check:2 ^~~
662 ; IMPNOT-VV-NEXT:not:imp1'1 X~~
663 ; IMPNOT-VV-NEXT:not:imp2'1 X~~
664 ; IMPNOT-VV-NEXT:not:imp3'1 X~~
665 ; IMPNOT-V-NEXT:check:3 ^
666 ; IMPNOT-VV-NEXT:not:imp1'2 X~~~~~~~
667 ; IMPNOT-VV-NEXT:not:imp2'2 X~~~~~~~
668 ; IMPNOT-Q-NEXT:not:imp3 !~~~~ error: no match expected
669 ; IMPNOT-VQ-NEXT:not:imp3 !~~~~ error: no match expected
670 ; IMPNOT-VV-NEXT:not:imp3'2 !~~~~ error: no match expected
674 ;--------------------------------------------------
675 ; Substitutions: successful and failed positive directives.
676 ;--------------------------------------------------
678 ; RUN: echo 'def-match1 def-match2' > %t.in
679 ; RUN: echo 'def-match1 def-nomatch' >> %t.in
681 ; RUN: echo 'CHECK: [[DEF_MATCH1]] [[DEF_MATCH2]]' > %t.chk
682 ; RUN: echo 'CHECK: [[DEF_MATCH1]] [[UNDEF]] [[DEF_NOMATCH]]' >> %t.chk
684 ; RUN: %ProtectFileCheckOutput \
685 ; RUN: not FileCheck -dump-input=always -vv -input-file=%t.in %t.chk 2>&1 \
686 ; RUN: -DDEF_MATCH1=def-match1 -DDEF_MATCH2=def-match2 \
687 ; RUN: -DDEF_NOMATCH=foobar \
688 ; RUN: | FileCheck -match-full-lines %s -check-prefix=SUBST-POS
691 ; SUBST-POS-NEXT: 1: def-match1 def-match2
692 ; SUBST-POS-NEXT:check:1'0 ^~~~~~~~~~~~~~~~~~~~~
693 ; SUBST-POS-NEXT:check:1'1 with "DEF_MATCH1" equal to "def-match1"
694 ; SUBST-POS-NEXT:check:1'2 with "DEF_MATCH2" equal to "def-match2"
695 ; SUBST-POS-NEXT:check:2'0 X error: match failed for invalid pattern
696 ; SUBST-POS-NEXT:check:2'1 undefined variable: UNDEF
697 ; SUBST-POS-NEXT:check:2'2 with "DEF_MATCH1" equal to "def-match1"
698 ; SUBST-POS-NEXT:check:2'3 with "DEF_NOMATCH" equal to "foobar"
699 ; SUBST-POS-NEXT: 2: def-match1 def-nomatch
700 ; SUBST-POS-NEXT:check:2'0 ~~~~~~~~~~~~~~~~~~~~~~~
701 ; SUBST-POS-NEXT:check:2'4 ? possible intended match
702 ; SUBST-POS-NEXT:>>>>>>
704 ;--------------------------------------------------
705 ; Substitutions: successful and failed negative directives.
706 ;--------------------------------------------------
708 ; RUN: echo 'def-match1 def-nomatch' > %t.in
709 ; RUN: echo 'def-match1 def-match2' >> %t.in
710 ; RUN: echo 'END' >> %t.in
712 ; RUN: echo 'CHECK-NOT: [[DEF_MATCH1]] [[UNDEF]] [[DEF_NOMATCH]]' > %t.chk
713 ; RUN: echo 'CHECK-NOT: [[DEF_MATCH1]] [[DEF_MATCH2]]' >> %t.chk
714 ; RUN: echo 'CHECK: END' >> %t.chk
716 ; RUN: %ProtectFileCheckOutput \
717 ; RUN: not FileCheck -dump-input=always -vv -input-file=%t.in %t.chk 2>&1 \
718 ; RUN: -DDEF_MATCH1=def-match1 -DDEF_MATCH2=def-match2 \
719 ; RUN: -DDEF_NOMATCH=foobar \
720 ; RUN: | FileCheck -match-full-lines %s -check-prefix=SUBST-NEG
723 ; SUBST-NEG-NEXT: 1: def-match1 def-nomatch
724 ; SUBST-NEG-NEXT:not:1'0 X~~~~~~~~~~~~~~~~~~~~~~ error: match failed for invalid pattern
725 ; SUBST-NEG-NEXT:not:1'1 undefined variable: UNDEF
726 ; SUBST-NEG-NEXT:not:1'2 with "DEF_MATCH1" equal to "def-match1"
727 ; SUBST-NEG-NEXT:not:1'3 with "DEF_NOMATCH" equal to "foobar"
728 ; SUBST-NEG-NEXT: 2: def-match1 def-match2
729 ; SUBST-NEG-NEXT:not:1'0 ~~~~~~~~~~~~~~~~~~~~~~
730 ; SUBST-NEG-NEXT:not:2'0 !~~~~~~~~~~~~~~~~~~~~ error: no match expected
731 ; SUBST-NEG-NEXT:not:2'1 with "DEF_MATCH1" equal to "def-match1"
732 ; SUBST-NEG-NEXT:not:2'2 with "DEF_MATCH2" equal to "def-match2"
733 ; SUBST-NEG-NEXT: 3: END
734 ; SUBST-NEG-NEXT:check:3 ^~~
735 ; SUBST-NEG-NEXT:>>>>>>
737 ;--------------------------------------------------
739 ;--------------------------------------------------
741 ; RUN: echo 'strvar: foo' > %t.in
742 ; RUN: echo 'numvar no expr: 51' >> %t.in
743 ; RUN: echo 'numvar expr: -49' >> %t.in
744 ; RUN: echo 'many: foo 100 8 bar' >> %t.in
745 ; RUN: echo 'var in neg match: foo' >> %t.in
746 ; RUN: echo 'END' >> %t.in
748 ; RUN: echo 'CHECK: strvar: [[STRVAR:[a-z]+]]' > %t.chk
749 ; RUN: echo 'CHECK: numvar no expr: [[#NUMVAR_NO_EXPR:]]' >> %t.chk
750 ; RUN: echo 'CHECK: numvar expr: [[#%d,NUMVAR_EXPR:2-NUMVAR_NO_EXPR]]' >> %t.chk
752 ; Capture many variables of different kinds in a different order than their
753 ; names sort alphabetically to ensure they're sorted in capture order.
754 ; RUN: echo 'CHECK: many: [[VAR1:foo]] [[#%d,VAR3:]] [[#VAR2:]] [[VAR4:bar]]' \
757 ; RUN: echo 'CHECK-NOT: var in neg match: [[VAR:foo]]' >> %t.chk
758 ; RUN: echo 'CHECK: END' >> %t.chk
760 ; RUN: %ProtectFileCheckOutput \
761 ; RUN: not FileCheck -dump-input=always -vv -input-file=%t.in %t.chk 2>&1 \
762 ; RUN: | FileCheck -strict-whitespace -match-full-lines %s -check-prefix=CAPTURE-NEG
765 ; CAPTURE-NEG-NEXT: 1: strvar: foo
766 ; CAPTURE-NEG-NEXT:check:1'0 ^~~~~~~~~~~
767 ; CAPTURE-NEG-NEXT:check:1'1 ^~~ captured var "STRVAR"
768 ; CAPTURE-NEG-NEXT: 2: numvar no expr: 51
769 ; CAPTURE-NEG-NEXT:check:2'0 ^~~~~~~~~~~~~~~~~~
770 ; CAPTURE-NEG-NEXT:check:2'1 ^~ captured var "NUMVAR_NO_EXPR"
771 ; CAPTURE-NEG-NEXT: 3: numvar expr: -49
772 ; CAPTURE-NEG-NEXT:check:3'0 ^~~~~~~~~~~~~~~~
773 ; CAPTURE-NEG-NEXT:check:3'1 with "%d,NUMVAR_EXPR:2-NUMVAR_NO_EXPR" equal to "-49"
774 ; CAPTURE-NEG-NEXT:check:3'2 ^~~ captured var "NUMVAR_EXPR"
775 ; CAPTURE-NEG-NEXT: 4: many: foo 100 8 bar
776 ; CAPTURE-NEG-NEXT:check:4'0 ^~~~~~~~~~~~~~~~~~~
777 ; CAPTURE-NEG-NEXT:check:4'1 ^~~ captured var "VAR1"
778 ; CAPTURE-NEG-NEXT:check:4'2 ^~~ captured var "VAR3"
779 ; CAPTURE-NEG-NEXT:check:4'3 ^ captured var "VAR2"
780 ; CAPTURE-NEG-NEXT:check:4'4 ^~~ captured var "VAR4"
781 ; CAPTURE-NEG-NEXT: 5: var in neg match: foo
782 ; CAPTURE-NEG-NEXT:not:5'0 !~~~~~~~~~~~~~~~~~~~~ error: no match expected
783 ; CAPTURE-NEG-NEXT:not:5'1 !~~ captured var "VAR"
784 ; CAPTURE-NEG-NEXT: 6: END
785 ; CAPTURE-NEG-NEXT:check:6 ^~~
786 ; CAPTURE-NEG-NEXT:>>>>>>
788 ;--------------------------------------------------
789 ; CHECK-NEXT, CHECK-SAME, CHECK-DAG note fixups.
791 ; When CHECK-NEXT or CHECK-SAME fails for the wrong line, or when a CHECK-DAG
792 ; match is discarded, the associated diagnostic type must be converted from
793 ; successful to failed or discarded. However, any note annotation must be
794 ; traversed to find that diagnostic. We check this behavior here only for
795 ; substitutions, but it's the same mechanism for all note annotations.
796 ;--------------------------------------------------
798 ;- - - - - - - - - - - - - - - - - - - - - - - - -
800 ;- - - - - - - - - - - - - - - - - - - - - - - - -
802 ; RUN: echo 'pre var' > %t.in
804 ; RUN: echo 'CHECK: pre' > %t.chk
805 ; RUN: echo 'CHECK-NEXT: [[VAR]]' >> %t.chk
807 ; RUN: %ProtectFileCheckOutput \
808 ; RUN: not FileCheck -dump-input=always -vv -input-file=%t.in %t.chk 2>&1 \
810 ; RUN: | FileCheck -match-full-lines %s -check-prefix=SUBST_NEXT
813 ; SUBST_NEXT-NEXT: 1: pre var
814 ; SUBST_NEXT-NEXT:check:1 ^~~
815 ; SUBST_NEXT-NEXT:next:2'0 !~~ error: match on wrong line
816 ; SUBST_NEXT-NEXT:next:2'1 with "VAR" equal to "var"
817 ; SUBST_NEXT-NEXT:>>>>>>
819 ;- - - - - - - - - - - - - - - - - - - - - - - - -
821 ;- - - - - - - - - - - - - - - - - - - - - - - - -
823 ; RUN: echo 'pre' > %t.in
824 ; RUN: echo 'var' >> %t.in
826 ; RUN: echo 'CHECK: pre' > %t.chk
827 ; RUN: echo 'CHECK-SAME: [[VAR]]' >> %t.chk
829 ; RUN: %ProtectFileCheckOutput \
830 ; RUN: not FileCheck -dump-input=always -vv -input-file=%t.in %t.chk 2>&1 \
832 ; RUN: | FileCheck -match-full-lines %s -check-prefix=SUBST_SAME
835 ; SUBST_SAME-NEXT: 1: pre
836 ; SUBST_SAME-NEXT:check:1 ^~~
837 ; SUBST_SAME-NEXT: 2: var
838 ; SUBST_SAME-NEXT:same:2'0 !~~ error: match on wrong line
839 ; SUBST_SAME-NEXT:same:2'1 with "VAR" equal to "var"
840 ; SUBST_SAME-NEXT:>>>>>>
842 ;- - - - - - - - - - - - - - - - - - - - - - - - -
844 ;- - - - - - - - - - - - - - - - - - - - - - - - -
846 ; RUN: echo 'var' > %t.in
847 ; RUN: echo 'var' >> %t.in
848 ; RUN: echo 'END' >> %t.in
850 ; RUN: echo 'CHECK-DAG: var' > %t.chk
851 ; RUN: echo 'CHECK-DAG: [[VAR]]' >> %t.chk
852 ; RUN: echo 'CHECK: END' >> %t.chk
854 ; RUN: %ProtectFileCheckOutput \
855 ; RUN: FileCheck -dump-input=always -vv -input-file=%t.in %t.chk 2>&1 \
857 ; RUN: | FileCheck -match-full-lines %s -check-prefix=SUBST_DAG
860 ; SUBST_DAG-NEXT: 1: var
861 ; SUBST_DAG-NEXT:dag:1 ^~~
862 ; SUBST_DAG-NEXT:dag:2'0 !~~ discard: overlaps earlier match
863 ; SUBST_DAG-NEXT:dag:2'1 with "VAR" equal to "var"
864 ; SUBST_DAG-NEXT: 2: var
865 ; SUBST_DAG-NEXT:dag:2'2 ^~~
866 ; SUBST_DAG-NEXT:dag:2'3 with "VAR" equal to "var"
867 ; SUBST_DAG-NEXT: 3: END
868 ; SUBST_DAG-NEXT:check:3 ^~~
869 ; SUBST_DAG-NEXT:>>>>>>