If you are new to FileCheck, please make sure you have read the tutorials: Tutorial: Hello World and Tutorial: LIT and FileCheck because they show how FileCheck is used: standalone and in combination with LIT.
For all of the examples below, please note:
.check
extension is chosen arbitrarily. FileCheck can work with any file
names.CHECK
command means that a given string or a regular expression must be
present in input provided to FileCheck.
Create a new file CHECK.check
with the following contents:
CHECK: String1
CHECK: String2
CHECK: String3
Valid input results in the exit code 0
that indicates success:
printf "String1\nString2\nString3" | filecheck CHECK.check
/Users/Stanislaw/.pyenv/versions/3.5.0/bin/filecheck
Invalid input results in the exit code 1
and error message:
echo "String1" | filecheck CHECK.check
/Users/Stanislaw/.pyenv/versions/3.5.0/bin/filecheck
CHECK.check:2:8: error: CHECK: expected string not found in input
CHECK: String2
^
<stdin>:1:8: note: scanning from here
String1
^
CHECK commands are checked one after another. If a CHECK string is not found in output, FileCheck exits with error immediately.
Create a new file order-of-matching.check
with the following contents:
CHECK: String1
CHECK: String2
CHECK: String3
And run with invalid input:
echo "String1" | filecheck order-of-matching.check
...
order-of-matching.check:2:8: error: CHECK: expected string not found in input
CHECK: String2
^
<stdin>:1:8: note: scanning from here
String1
^
CHECK-NOT
is the opposite of CHECK
: a given string or a regular
expression must not be present in input provided to FileCheck.
CHECK-NOT.check
file:
CHECK-NOT: String1
CHECK-NOT: String2
CHECK-NOT: String3
$ echo "String3" | filecheck CHECK-NOT.check
filecheck
CHECK-NOT.check:3:12: error: CHECK-NOT: excluded string found in input
CHECK-NOT: String3
^
<stdin>:1:1: note: found here
String3
^~~~~~~
CHECK-NEXT
command means that a given string or a regular expression must be
present in input provided to FileCheck. Additionally, there must be another
check right before CHECK-NEXT
, that has passed on the input line just before
the current input line. CHECK-NEXT
cannot be the first check in the check
file.
Check file CHECK-NEXT.check
:
CHECK: String1
CHECK-NEXT: String2
$ printf "String1\nString2" | filecheck CHECK-NEXT.check
...filecheck
$ echo $?
0
$ printf "String1\nfoo\nString2" | filecheck CHECK-NEXT.check
...filecheck
CHECK-NEXT.check:2:13: error: CHECK-NEXT: is not on the line after the previous match
CHECK-NEXT: String2
^
<stdin>:3:1: note: 'next' match was here
String2
^
<stdin>:1:8: note: previous match ended here
String1
^
<stdin>:2:1: note: non-matching line after previous match is here
foo
^
CHECK-EMPTY
command is used to match empty lines.
Consider the following check file:
CHECK: String1
CHECK-EMPTY:
CHECK: String2
In the following example, there is an empty line so the test will pass:
$ printf "String1\n\nString2" | filecheck CHECK-EMPTY.check
...filecheck
$ echo $?
0
If the empty line is removed, the test will fail:
$ printf "String1\nString2" | filecheck CHECK-EMPTY.check
...filecheck
...CHECK-EMPTY.check:2:13: error: CHECK-EMPTY: expected string not found in input
CHECK-EMPTY:
^
<stdin>:2:1: note: scanning from here
String2
^
$ echo $?
1