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