1FileCheck - Flexible pattern matching file verifier
2===================================================
3
4.. program:: FileCheck
5
6SYNOPSIS
7--------
8
9:program:`FileCheck` *match-filename* [*--check-prefix=XXX*] [*--strict-whitespace*]
10
11DESCRIPTION
12-----------
13
14:program:`FileCheck` reads two files (one from standard input, and one
15specified on the command line) and uses one to verify the other.  This
16behavior is particularly useful for the testsuite, which wants to verify that
17the output of some tool (e.g. :program:`llc`) contains the expected information
18(for example, a movsd from esp or whatever is interesting).  This is similar to
19using :program:`grep`, but it is optimized for matching multiple different
20inputs in one file in a specific order.
21
22The ``match-filename`` file specifies the file that contains the patterns to
23match.  The file to verify is read from standard input unless the
24:option:`--input-file` option is used.
25
26OPTIONS
27-------
28
29Options are parsed from the environment variable ``FILECHECK_OPTS``
30and from the command line.
31
32.. option:: -help
33
34 Print a summary of command line options.
35
36.. option:: --check-prefix prefix
37
38 FileCheck searches the contents of ``match-filename`` for patterns to
39 match.  By default, these patterns are prefixed with "``CHECK:``".
40 If you'd like to use a different prefix (e.g. because the same input
41 file is checking multiple different tool or options), the
42 :option:`--check-prefix` argument allows you to specify one or more
43 prefixes to match. Multiple prefixes are useful for tests which might
44 change for different run options, but most lines remain the same.
45
46.. option:: --check-prefixes prefix1,prefix2,...
47
48 An alias of :option:`--check-prefix` that allows multiple prefixes to be
49 specified as a comma separated list.
50
51.. option:: --input-file filename
52
53  File to check (defaults to stdin).
54
55.. option:: --match-full-lines
56
57 By default, FileCheck allows matches of anywhere on a line. This
58 option will require all positive matches to cover an entire
59 line. Leading and trailing whitespace is ignored, unless
60 :option:`--strict-whitespace` is also specified. (Note: negative
61 matches from ``CHECK-NOT`` are not affected by this option!)
62
63 Passing this option is equivalent to inserting ``{{^ *}}`` or
64 ``{{^}}`` before, and ``{{ *$}}`` or ``{{$}}`` after every positive
65 check pattern.
66
67.. option:: --strict-whitespace
68
69 By default, FileCheck canonicalizes input horizontal whitespace (spaces and
70 tabs) which causes it to ignore these differences (a space will match a tab).
71 The :option:`--strict-whitespace` argument disables this behavior. End-of-line
72 sequences are canonicalized to UNIX-style ``\n`` in all modes.
73
74.. option:: --implicit-check-not check-pattern
75
76  Adds implicit negative checks for the specified patterns between positive
77  checks. The option allows writing stricter tests without stuffing them with
78  ``CHECK-NOT``\ s.
79
80  For example, "``--implicit-check-not warning:``" can be useful when testing
81  diagnostic messages from tools that don't have an option similar to ``clang
82  -verify``. With this option FileCheck will verify that input does not contain
83  warnings not covered by any ``CHECK:`` patterns.
84
85.. option:: --dump-input <mode>
86
87  Dump input to stderr, adding annotations representing currently enabled
88  diagnostics.  Do this either 'always', on 'fail', or 'never'.  Specify 'help'
89  to explain the dump format and quit.
90
91.. option:: --dump-input-on-failure
92
93  When the check fails, dump all of the original input.  This option is
94  deprecated in favor of `--dump-input=fail`.
95
96.. option:: --enable-var-scope
97
98  Enables scope for regex variables.
99
100  Variables with names that start with ``$`` are considered global and
101  remain set throughout the file.
102
103  All other variables get undefined after each encountered ``CHECK-LABEL``.
104
105.. option:: -D<VAR=VALUE>
106
107  Sets a filecheck pattern variable ``VAR`` with value ``VALUE`` that can be
108  used in ``CHECK:`` lines.
109
110.. option:: -D#<NUMVAR>=<VALUE>
111
112  Sets a filecheck numeric variable ``NUMVAR`` to ``<VALUE>`` that can be used
113  in ``CHECK:`` lines.
114
115.. option:: -version
116
117 Show the version number of this program.
118
119.. option:: -v
120
121  Print good directive pattern matches.  However, if ``-input-dump=fail`` or
122  ``-input-dump=always``, add those matches as input annotations instead.
123
124.. option:: -vv
125
126  Print information helpful in diagnosing internal FileCheck issues, such as
127  discarded overlapping ``CHECK-DAG:`` matches, implicit EOF pattern matches,
128  and ``CHECK-NOT:`` patterns that do not have matches.  Implies ``-v``.
129  However, if ``-input-dump=fail`` or ``-input-dump=always``, just add that
130  information as input annotations instead.
131
132.. option:: --allow-deprecated-dag-overlap
133
134  Enable overlapping among matches in a group of consecutive ``CHECK-DAG:``
135  directives.  This option is deprecated and is only provided for convenience
136  as old tests are migrated to the new non-overlapping ``CHECK-DAG:``
137  implementation.
138
139.. option:: --color
140
141  Use colors in output (autodetected by default).
142
143EXIT STATUS
144-----------
145
146If :program:`FileCheck` verifies that the file matches the expected contents,
147it exits with 0.  Otherwise, if not, or if an error occurs, it will exit with a
148non-zero value.
149
150TUTORIAL
151--------
152
153FileCheck is typically used from LLVM regression tests, being invoked on the RUN
154line of the test.  A simple example of using FileCheck from a RUN line looks
155like this:
156
157.. code-block:: llvm
158
159   ; RUN: llvm-as < %s | llc -march=x86-64 | FileCheck %s
160
161This syntax says to pipe the current file ("``%s``") into ``llvm-as``, pipe
162that into ``llc``, then pipe the output of ``llc`` into ``FileCheck``.  This
163means that FileCheck will be verifying its standard input (the llc output)
164against the filename argument specified (the original ``.ll`` file specified by
165"``%s``").  To see how this works, let's look at the rest of the ``.ll`` file
166(after the RUN line):
167
168.. code-block:: llvm
169
170   define void @sub1(i32* %p, i32 %v) {
171   entry:
172   ; CHECK: sub1:
173   ; CHECK: subl
174           %0 = tail call i32 @llvm.atomic.load.sub.i32.p0i32(i32* %p, i32 %v)
175           ret void
176   }
177
178   define void @inc4(i64* %p) {
179   entry:
180   ; CHECK: inc4:
181   ; CHECK: incq
182           %0 = tail call i64 @llvm.atomic.load.add.i64.p0i64(i64* %p, i64 1)
183           ret void
184   }
185
186Here you can see some "``CHECK:``" lines specified in comments.  Now you can
187see how the file is piped into ``llvm-as``, then ``llc``, and the machine code
188output is what we are verifying.  FileCheck checks the machine code output to
189verify that it matches what the "``CHECK:``" lines specify.
190
191The syntax of the "``CHECK:``" lines is very simple: they are fixed strings that
192must occur in order.  FileCheck defaults to ignoring horizontal whitespace
193differences (e.g. a space is allowed to match a tab) but otherwise, the contents
194of the "``CHECK:``" line is required to match some thing in the test file exactly.
195
196One nice thing about FileCheck (compared to grep) is that it allows merging
197test cases together into logical groups.  For example, because the test above
198is checking for the "``sub1:``" and "``inc4:``" labels, it will not match
199unless there is a "``subl``" in between those labels.  If it existed somewhere
200else in the file, that would not count: "``grep subl``" matches if "``subl``"
201exists anywhere in the file.
202
203The FileCheck -check-prefix option
204~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
205
206The FileCheck `-check-prefix` option allows multiple test
207configurations to be driven from one `.ll` file.  This is useful in many
208circumstances, for example, testing different architectural variants with
209:program:`llc`.  Here's a simple example:
210
211.. code-block:: llvm
212
213   ; RUN: llvm-as < %s | llc -mtriple=i686-apple-darwin9 -mattr=sse41 \
214   ; RUN:              | FileCheck %s -check-prefix=X32
215   ; RUN: llvm-as < %s | llc -mtriple=x86_64-apple-darwin9 -mattr=sse41 \
216   ; RUN:              | FileCheck %s -check-prefix=X64
217
218   define <4 x i32> @pinsrd_1(i32 %s, <4 x i32> %tmp) nounwind {
219           %tmp1 = insertelement <4 x i32>; %tmp, i32 %s, i32 1
220           ret <4 x i32> %tmp1
221   ; X32: pinsrd_1:
222   ; X32:    pinsrd $1, 4(%esp), %xmm0
223
224   ; X64: pinsrd_1:
225   ; X64:    pinsrd $1, %edi, %xmm0
226   }
227
228In this case, we're testing that we get the expected code generation with
229both 32-bit and 64-bit code generation.
230
231The "CHECK-NEXT:" directive
232~~~~~~~~~~~~~~~~~~~~~~~~~~~
233
234Sometimes you want to match lines and would like to verify that matches
235happen on exactly consecutive lines with no other lines in between them.  In
236this case, you can use "``CHECK:``" and "``CHECK-NEXT:``" directives to specify
237this.  If you specified a custom check prefix, just use "``<PREFIX>-NEXT:``".
238For example, something like this works as you'd expect:
239
240.. code-block:: llvm
241
242   define void @t2(<2 x double>* %r, <2 x double>* %A, double %B) {
243 	%tmp3 = load <2 x double>* %A, align 16
244 	%tmp7 = insertelement <2 x double> undef, double %B, i32 0
245 	%tmp9 = shufflevector <2 x double> %tmp3,
246                               <2 x double> %tmp7,
247                               <2 x i32> < i32 0, i32 2 >
248 	store <2 x double> %tmp9, <2 x double>* %r, align 16
249 	ret void
250
251   ; CHECK:          t2:
252   ; CHECK: 	        movl	8(%esp), %eax
253   ; CHECK-NEXT: 	movapd	(%eax), %xmm0
254   ; CHECK-NEXT: 	movhpd	12(%esp), %xmm0
255   ; CHECK-NEXT: 	movl	4(%esp), %eax
256   ; CHECK-NEXT: 	movapd	%xmm0, (%eax)
257   ; CHECK-NEXT: 	ret
258   }
259
260"``CHECK-NEXT:``" directives reject the input unless there is exactly one
261newline between it and the previous directive.  A "``CHECK-NEXT:``" cannot be
262the first directive in a file.
263
264The "CHECK-SAME:" directive
265~~~~~~~~~~~~~~~~~~~~~~~~~~~
266
267Sometimes you want to match lines and would like to verify that matches happen
268on the same line as the previous match.  In this case, you can use "``CHECK:``"
269and "``CHECK-SAME:``" directives to specify this.  If you specified a custom
270check prefix, just use "``<PREFIX>-SAME:``".
271
272"``CHECK-SAME:``" is particularly powerful in conjunction with "``CHECK-NOT:``"
273(described below).
274
275For example, the following works like you'd expect:
276
277.. code-block:: llvm
278
279   !0 = !DILocation(line: 5, scope: !1, inlinedAt: !2)
280
281   ; CHECK:       !DILocation(line: 5,
282   ; CHECK-NOT:               column:
283   ; CHECK-SAME:              scope: ![[SCOPE:[0-9]+]]
284
285"``CHECK-SAME:``" directives reject the input if there are any newlines between
286it and the previous directive.  A "``CHECK-SAME:``" cannot be the first
287directive in a file.
288
289The "CHECK-EMPTY:" directive
290~~~~~~~~~~~~~~~~~~~~~~~~~~~~
291
292If you need to check that the next line has nothing on it, not even whitespace,
293you can use the "``CHECK-EMPTY:``" directive.
294
295.. code-block:: llvm
296
297   declare void @foo()
298
299   declare void @bar()
300   ; CHECK: foo
301   ; CHECK-EMPTY:
302   ; CHECK-NEXT: bar
303
304Just like "``CHECK-NEXT:``" the directive will fail if there is more than one
305newline before it finds the next blank line, and it cannot be the first
306directive in a file.
307
308The "CHECK-NOT:" directive
309~~~~~~~~~~~~~~~~~~~~~~~~~~
310
311The "``CHECK-NOT:``" directive is used to verify that a string doesn't occur
312between two matches (or before the first match, or after the last match).  For
313example, to verify that a load is removed by a transformation, a test like this
314can be used:
315
316.. code-block:: llvm
317
318   define i8 @coerce_offset0(i32 %V, i32* %P) {
319     store i32 %V, i32* %P
320
321     %P2 = bitcast i32* %P to i8*
322     %P3 = getelementptr i8* %P2, i32 2
323
324     %A = load i8* %P3
325     ret i8 %A
326   ; CHECK: @coerce_offset0
327   ; CHECK-NOT: load
328   ; CHECK: ret i8
329   }
330
331The "CHECK-COUNT:" directive
332~~~~~~~~~~~~~~~~~~~~~~~~~~~~
333
334If you need to match multiple lines with the same pattern over and over again
335you can repeat a plain ``CHECK:`` as many times as needed. If that looks too
336boring you can instead use a counted check "``CHECK-COUNT-<num>:``", where
337``<num>`` is a positive decimal number. It will match the pattern exactly
338``<num>`` times, no more and no less. If you specified a custom check prefix,
339just use "``<PREFIX>-COUNT-<num>:``" for the same effect.
340Here is a simple example:
341
342.. code-block:: text
343
344   Loop at depth 1
345   Loop at depth 1
346   Loop at depth 1
347   Loop at depth 1
348     Loop at depth 2
349       Loop at depth 3
350
351   ; CHECK-COUNT-6: Loop at depth {{[0-9]+}}
352   ; CHECK-NOT:     Loop at depth {{[0-9]+}}
353
354The "CHECK-DAG:" directive
355~~~~~~~~~~~~~~~~~~~~~~~~~~
356
357If it's necessary to match strings that don't occur in a strictly sequential
358order, "``CHECK-DAG:``" could be used to verify them between two matches (or
359before the first match, or after the last match). For example, clang emits
360vtable globals in reverse order. Using ``CHECK-DAG:``, we can keep the checks
361in the natural order:
362
363.. code-block:: c++
364
365    // RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s
366
367    struct Foo { virtual void method(); };
368    Foo f;  // emit vtable
369    // CHECK-DAG: @_ZTV3Foo =
370
371    struct Bar { virtual void method(); };
372    Bar b;
373    // CHECK-DAG: @_ZTV3Bar =
374
375``CHECK-NOT:`` directives could be mixed with ``CHECK-DAG:`` directives to
376exclude strings between the surrounding ``CHECK-DAG:`` directives. As a result,
377the surrounding ``CHECK-DAG:`` directives cannot be reordered, i.e. all
378occurrences matching ``CHECK-DAG:`` before ``CHECK-NOT:`` must not fall behind
379occurrences matching ``CHECK-DAG:`` after ``CHECK-NOT:``. For example,
380
381.. code-block:: llvm
382
383   ; CHECK-DAG: BEFORE
384   ; CHECK-NOT: NOT
385   ; CHECK-DAG: AFTER
386
387This case will reject input strings where ``BEFORE`` occurs after ``AFTER``.
388
389With captured variables, ``CHECK-DAG:`` is able to match valid topological
390orderings of a DAG with edges from the definition of a variable to its use.
391It's useful, e.g., when your test cases need to match different output
392sequences from the instruction scheduler. For example,
393
394.. code-block:: llvm
395
396   ; CHECK-DAG: add [[REG1:r[0-9]+]], r1, r2
397   ; CHECK-DAG: add [[REG2:r[0-9]+]], r3, r4
398   ; CHECK:     mul r5, [[REG1]], [[REG2]]
399
400In this case, any order of that two ``add`` instructions will be allowed.
401
402If you are defining `and` using variables in the same ``CHECK-DAG:`` block,
403be aware that the definition rule can match `after` its use.
404
405So, for instance, the code below will pass:
406
407.. code-block:: text
408
409  ; CHECK-DAG: vmov.32 [[REG2:d[0-9]+]][0]
410  ; CHECK-DAG: vmov.32 [[REG2]][1]
411  vmov.32 d0[1]
412  vmov.32 d0[0]
413
414While this other code, will not:
415
416.. code-block:: text
417
418  ; CHECK-DAG: vmov.32 [[REG2:d[0-9]+]][0]
419  ; CHECK-DAG: vmov.32 [[REG2]][1]
420  vmov.32 d1[1]
421  vmov.32 d0[0]
422
423While this can be very useful, it's also dangerous, because in the case of
424register sequence, you must have a strong order (read before write, copy before
425use, etc). If the definition your test is looking for doesn't match (because
426of a bug in the compiler), it may match further away from the use, and mask
427real bugs away.
428
429In those cases, to enforce the order, use a non-DAG directive between DAG-blocks.
430
431A ``CHECK-DAG:`` directive skips matches that overlap the matches of any
432preceding ``CHECK-DAG:`` directives in the same ``CHECK-DAG:`` block.  Not only
433is this non-overlapping behavior consistent with other directives, but it's
434also necessary to handle sets of non-unique strings or patterns.  For example,
435the following directives look for unordered log entries for two tasks in a
436parallel program, such as the OpenMP runtime:
437
438.. code-block:: text
439
440    // CHECK-DAG: [[THREAD_ID:[0-9]+]]: task_begin
441    // CHECK-DAG: [[THREAD_ID]]: task_end
442    //
443    // CHECK-DAG: [[THREAD_ID:[0-9]+]]: task_begin
444    // CHECK-DAG: [[THREAD_ID]]: task_end
445
446The second pair of directives is guaranteed not to match the same log entries
447as the first pair even though the patterns are identical and even if the text
448of the log entries is identical because the thread ID manages to be reused.
449
450The "CHECK-LABEL:" directive
451~~~~~~~~~~~~~~~~~~~~~~~~~~~~
452
453Sometimes in a file containing multiple tests divided into logical blocks, one
454or more ``CHECK:`` directives may inadvertently succeed by matching lines in a
455later block. While an error will usually eventually be generated, the check
456flagged as causing the error may not actually bear any relationship to the
457actual source of the problem.
458
459In order to produce better error messages in these cases, the "``CHECK-LABEL:``"
460directive can be used. It is treated identically to a normal ``CHECK``
461directive except that FileCheck makes an additional assumption that a line
462matched by the directive cannot also be matched by any other check present in
463``match-filename``; this is intended to be used for lines containing labels or
464other unique identifiers. Conceptually, the presence of ``CHECK-LABEL`` divides
465the input stream into separate blocks, each of which is processed independently,
466preventing a ``CHECK:`` directive in one block matching a line in another block.
467If ``--enable-var-scope`` is in effect, all local variables are cleared at the
468beginning of the block.
469
470For example,
471
472.. code-block:: llvm
473
474  define %struct.C* @C_ctor_base(%struct.C* %this, i32 %x) {
475  entry:
476  ; CHECK-LABEL: C_ctor_base:
477  ; CHECK: mov [[SAVETHIS:r[0-9]+]], r0
478  ; CHECK: bl A_ctor_base
479  ; CHECK: mov r0, [[SAVETHIS]]
480    %0 = bitcast %struct.C* %this to %struct.A*
481    %call = tail call %struct.A* @A_ctor_base(%struct.A* %0)
482    %1 = bitcast %struct.C* %this to %struct.B*
483    %call2 = tail call %struct.B* @B_ctor_base(%struct.B* %1, i32 %x)
484    ret %struct.C* %this
485  }
486
487  define %struct.D* @D_ctor_base(%struct.D* %this, i32 %x) {
488  entry:
489  ; CHECK-LABEL: D_ctor_base:
490
491The use of ``CHECK-LABEL:`` directives in this case ensures that the three
492``CHECK:`` directives only accept lines corresponding to the body of the
493``@C_ctor_base`` function, even if the patterns match lines found later in
494the file. Furthermore, if one of these three ``CHECK:`` directives fail,
495FileCheck will recover by continuing to the next block, allowing multiple test
496failures to be detected in a single invocation.
497
498There is no requirement that ``CHECK-LABEL:`` directives contain strings that
499correspond to actual syntactic labels in a source or output language: they must
500simply uniquely match a single line in the file being verified.
501
502``CHECK-LABEL:`` directives cannot contain variable definitions or uses.
503
504FileCheck Regex Matching Syntax
505~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
506
507All FileCheck directives take a pattern to match.
508For most uses of FileCheck, fixed string matching is perfectly sufficient.  For
509some things, a more flexible form of matching is desired.  To support this,
510FileCheck allows you to specify regular expressions in matching strings,
511surrounded by double braces: ``{{yourregex}}``. FileCheck implements a POSIX
512regular expression matcher; it supports Extended POSIX regular expressions
513(ERE). Because we want to use fixed string matching for a majority of what we
514do, FileCheck has been designed to support mixing and matching fixed string
515matching with regular expressions.  This allows you to write things like this:
516
517.. code-block:: llvm
518
519   ; CHECK: movhpd	{{[0-9]+}}(%esp), {{%xmm[0-7]}}
520
521In this case, any offset from the ESP register will be allowed, and any xmm
522register will be allowed.
523
524Because regular expressions are enclosed with double braces, they are
525visually distinct, and you don't need to use escape characters within the double
526braces like you would in C.  In the rare case that you want to match double
527braces explicitly from the input, you can use something ugly like
528``{{[{][{]}}`` as your pattern.
529
530FileCheck String Substitution Blocks
531~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
532
533It is often useful to match a pattern and then verify that it occurs again
534later in the file.  For codegen tests, this can be useful to allow any
535register, but verify that that register is used consistently later.  To do
536this, :program:`FileCheck` supports string substitution blocks that allow
537string variables to be defined and substituted into patterns.  Here is a simple
538example:
539
540.. code-block:: llvm
541
542   ; CHECK: test5:
543   ; CHECK:    notw	[[REGISTER:%[a-z]+]]
544   ; CHECK:    andw	{{.*}}[[REGISTER]]
545
546The first check line matches a regex ``%[a-z]+`` and captures it into the
547string variable ``REGISTER``.  The second line verifies that whatever is in
548``REGISTER`` occurs later in the file after an "``andw``". :program:`FileCheck`
549string substitution blocks are always contained in ``[[ ]]`` pairs, and string
550variable names can be formed with the regex ``[a-zA-Z_][a-zA-Z0-9_]*``.  If a
551colon follows the name, then it is a definition of the variable; otherwise, it
552is a substitution.
553
554:program:`FileCheck` variables can be defined multiple times, and substitutions
555always get the latest value.  Variables can also be substituted later on the
556same line they were defined on. For example:
557
558.. code-block:: llvm
559
560    ; CHECK: op [[REG:r[0-9]+]], [[REG]]
561
562Can be useful if you want the operands of ``op`` to be the same register,
563and don't care exactly which register it is.
564
565If ``--enable-var-scope`` is in effect, variables with names that
566start with ``$`` are considered to be global. All others variables are
567local.  All local variables get undefined at the beginning of each
568CHECK-LABEL block. Global variables are not affected by CHECK-LABEL.
569This makes it easier to ensure that individual tests are not affected
570by variables set in preceding tests.
571
572FileCheck Numeric Substitution Blocks
573~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
574
575:program:`FileCheck` also supports numeric substitution blocks that allow
576defining numeric variables and checking for numeric values that satisfy a
577numeric expression constraint based on those variables via a numeric
578substitution. This allows ``CHECK:`` directives to verify a numeric relation
579between two numbers, such as the need for consecutive registers to be used.
580
581The syntax to define a numeric variable is ``[[#<NUMVAR>:]]`` where
582``<NUMVAR>`` is the name of the numeric variable to define to the matching
583value.
584
585For example:
586
587.. code-block:: llvm
588
589    ; CHECK: mov r[[#REG:]], 42
590
591would match ``mov r5, 42`` and set ``REG`` to the value ``5``.
592
593The syntax of a numeric substitution is ``[[#<NUMVAR><op><offset>]]`` where:
594
595* ``<NUMVAR>`` is the name of a defined numeric variable.
596
597* ``<op>`` is an optional operation to perform on the value of ``<NUMVAR>``.
598  Currently supported operations are ``+`` and ``-``.
599
600* ``<offset>`` is the immediate value that constitutes the second operand of
601  the operation ``<op>``. It must be present if ``<op>`` is present, absent
602  otherwise.
603
604Spaces are accepted before, after and between any of these elements.
605
606For example:
607
608.. code-block:: llvm
609
610    ; CHECK: load r[[#REG:]], [r0]
611    ; CHECK: load r[[#REG+1]], [r1]
612
613The above example would match the text:
614
615.. code-block:: gas
616
617    load r5, [r0]
618    load r6, [r1]
619
620but would not match the text:
621
622.. code-block:: gas
623
624    load r5, [r0]
625    load r7, [r1]
626
627due to ``7`` being unequal to ``5 + 1``.
628
629The ``--enable-var-scope`` option has the same effect on numeric variables as
630on string variables.
631
632Important note: In its current implementation, an expression cannot use a
633numeric variable defined on the same line.
634
635FileCheck Pseudo Numeric Variables
636~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
637
638Sometimes there's a need to verify output that contains line numbers of the
639match file, e.g. when testing compiler diagnostics.  This introduces a certain
640fragility of the match file structure, as "``CHECK:``" lines contain absolute
641line numbers in the same file, which have to be updated whenever line numbers
642change due to text addition or deletion.
643
644To support this case, FileCheck expressions understand the ``@LINE`` pseudo
645numeric variable which evaluates to the line number of the CHECK pattern where
646it is found.
647
648This way match patterns can be put near the relevant test lines and include
649relative line number references, for example:
650
651.. code-block:: c++
652
653   // CHECK: test.cpp:[[# @LINE + 4]]:6: error: expected ';' after top level declarator
654   // CHECK-NEXT: {{^int a}}
655   // CHECK-NEXT: {{^     \^}}
656   // CHECK-NEXT: {{^     ;}}
657   int a
658
659To support legacy uses of ``@LINE`` as a special string variable,
660:program:`FileCheck` also accepts the following uses of ``@LINE`` with string
661substitution block syntax: ``[[@LINE]]``, ``[[@LINE+<offset>]]`` and
662``[[@LINE-<offset>]]`` without any spaces inside the brackets and where
663``offset`` is an integer.
664
665Matching Newline Characters
666~~~~~~~~~~~~~~~~~~~~~~~~~~~
667
668To match newline characters in regular expressions the character class
669``[[:space:]]`` can be used. For example, the following pattern:
670
671.. code-block:: c++
672
673   // CHECK: DW_AT_location [DW_FORM_sec_offset] ([[DLOC:0x[0-9a-f]+]]){{[[:space:]].*}}"intd"
674
675matches output of the form (from llvm-dwarfdump):
676
677.. code-block:: text
678
679       DW_AT_location [DW_FORM_sec_offset]   (0x00000233)
680       DW_AT_name [DW_FORM_strp]  ( .debug_str[0x000000c9] = "intd")
681
682letting us set the :program:`FileCheck` variable ``DLOC`` to the desired value
683``0x00000233``, extracted from the line immediately preceding "``intd``".
684