1RUN: FileCheck --input-file %s %s
2
3; We use CHECK-NEXT directives to force a match on all lines with digits.
4
5; Numeric variable definition with default matching format without spaces.
6DEF DEFAULT FMT NO SPC  // CHECK-LABEL: DEF DEFAULT FMT NO SPC
710  // CHECK-NEXT: {{^}}[[#UNSI:]]
8
9; Numeric variable definition with default matching format with different
10; spacing.
11DEF DEFAULT FMT SPC  // CHECK-LABEL: DEF DEFAULT FMT SPC
1211  // CHECK-NEXT: {{^}}[[# UNSIa:]]
1311  // CHECK-NEXT: {{^}}[[# UNSIb :]]
1411  // CHECK-NEXT: {{^}}[[# UNSIc : ]]
15
16; Numeric variable redefinition.
17REDEF NO SPC  // CHECK-LABEL: REDEF
1811  // CHECK-NEXT: {{^}}[[#UNSI:]]
19
20; Numeric variable definition with explicit matching format.
21DEF FMT  // CHECK-LABEL: DEF FMT
22c    // CHECK-NEXT: {{^}}[[#%x,LHEX:]]
23D    // CHECK-NEXT: {{^}}[[#%X,UHEX:]]
24-30  // CHECK-NEXT: {{^}}[[#%d,SIGN:]]
25
26; Numeric variable definition with explicit matching format with different
27; spacing.
28DEF FMT SPC  // CHECK-LABEL: DEF FMT SPC
29c  // CHECK-NEXT: {{^}}[[# %x , LHEXa : ]]
30
31; Numeric variable definition with unsupported matching format.
32RUN: %ProtectFileCheckOutput \
33RUN: not FileCheck --check-prefixes ERR,INVALID-FMT-SPEC1 --input-file %s %s 2>&1 \
34RUN:   | FileCheck --check-prefix INVALID-FMT-SPEC-MSG1 --strict-whitespace %s
35RUN: %ProtectFileCheckOutput \
36RUN: not FileCheck --check-prefixes ERR,INVALID-FMT-SPEC2 --input-file %s %s 2>&1 \
37RUN:   | FileCheck --check-prefix INVALID-FMT-SPEC-MSG2 --strict-whitespace %s
38
39DEF INVALID FMT
40INVVAR1=a
41INVVAR2=11
42ERR-LABEL: DEF INVALID FMT
43INVALID-FMT-SPEC1-NEXT: INVVAR1=[[#%c,INVVAR1:]]
44INVALID-FMT-SPEC2-NEXT: INVVAR2=[[#%hhd,INVVAR2:]]
45INVALID-FMT-SPEC-MSG1: numeric-expression.txt:[[#@LINE-2]]:37: error: invalid format specifier in expression
46INVALID-FMT-SPEC-MSG1-NEXT: {{I}}NVALID-FMT-SPEC1-NEXT: INVVAR1={{\[\[#%c,INVVAR1:\]\]}}
47INVALID-FMT-SPEC-MSG1-NEXT:    {{^}}                                    ^{{$}}
48INVALID-FMT-SPEC-MSG2: numeric-expression.txt:[[#@LINE-4]]:37: error: invalid format specifier in expression
49INVALID-FMT-SPEC-MSG2-NEXT: {{I}}NVALID-FMT-SPEC2-NEXT: INVVAR2={{\[\[#%hhd,INVVAR2:\]\]}}
50INVALID-FMT-SPEC-MSG2-NEXT:    {{^}}                                    ^{{$}}
51
52; Numeric variable definition with precision specifier.
53DEF PREC FMT  // CHECK-LABEL: DEF PREC FMT
5400000022    // CHECK-NEXT: {{^}}[[#%.8,PADDED_UNSI:]]
55323232323   // CHECK-NEXT: {{^}}[[#%.8,PADDED_UNSI2:]]
5600000018    // CHECK-NEXT: {{^}}[[#%.8u,PADDED_UNSI3:]]
57181818181   // CHECK-NEXT: {{^}}[[#%.8u,PADDED_UNSI4:]]
580000000f    // CHECK-NEXT: {{^}}[[#%.8x,PADDED_LHEX:]]
59fffffffff   // CHECK-NEXT: {{^}}[[#%.8x,PADDED_LHEX2:]]
600000000E    // CHECK-NEXT: {{^}}[[#%.8X,PADDED_UHEX:]]
61EEEEEEEEE   // CHECK-NEXT: {{^}}[[#%.8X,PADDED_UHEX2:]]
62-00000055   // CHECK-NEXT: {{^}}[[#%.8d,PADDED_SIGN:]]
63-555555555  // CHECK-NEXT: {{^}}[[#%.8d,PADDED_SIGN2:]]
64
65; Numeric variable definition with precision specifier with value not padded
66; enough.
67RUN: FileCheck --check-prefix INVALID-PADDING-DEF --input-file %s %s
68
69FAIL DEF PREC FMT  // INVALID-PADDING-DEF-LABEL: FAIL DEF PREC FMT
70INVALID_PADDED_UNSI: 0000022   // INVALID-PADDING-DEF-NOT: {{^}}INVALID_PADDED_UNSI: [[#%.8,INVALID_PADDED_UNSI:]]
71INVALID_PADDED_UNSI2: 0000018  // INVALID-PADDING-DEF-NOT: {{^}}INVALID_PADDED_UNSI2: [[#%.8u,INVALID_PADDED_UNSI2:]]
72INVALID_PADDED_LHEX: 000000f   // INVALID-PADDING-DEF-NOT: {{^}}INVALID_PADDED_LHEX: [[#%.8x,INVALID_PADDED_LHEX:]]
73INVALID_PADDED_UHEX: 000000E   // INVALID-PADDING-DEF-NOT: {{^}}INVALID_PADDED_UHEX: [[#%.8X,INVALID_PADDED_UHEX:]]
74INVALID_PADDED_SIGN: -0000055  // INVALID-PADDING-DEF-NOT: {{^}}INVALID_PADDED_SIGN: [[#%.8d,INVALID_PADDED_SIGN:]]
75
76; Numeric expressions with explicit matching format and default matching rule
77; using variables defined on other lines without spaces.
78USE EXPL FMT IMPL MATCH  // CHECK-LABEL: USE EXPL FMT IMPL MATCH
7911  // CHECK-NEXT: {{^}}[[#%u,UNSI]]
8012  // CHECK-NEXT: {{^}}[[#%u,UNSI+1]]
8110  // CHECK-NEXT: {{^}}[[#%u,UNSI-1]]
8215  // CHECK-NEXT: {{^}}[[#%u,add(UNSI,4)]]
8311  // CHECK-NEXT: {{^}}[[#%u,max(UNSI,7)]]
8499  // CHECK-NEXT: {{^}}[[#%u,max(UNSI,99)]]
857   // CHECK-NEXT: {{^}}[[#%u,min(UNSI,7)]]
8611  // CHECK-NEXT: {{^}}[[#%u,min(UNSI,99)]]
878   // CHECK-NEXT: {{^}}[[#%u,sub(UNSI,3)]]
88c   // CHECK-NEXT: {{^}}[[#%x,LHEX]]
89d   // CHECK-NEXT: {{^}}[[#%x,LHEX+1]]
90b   // CHECK-NEXT: {{^}}[[#%x,LHEX-1]]
911a  // CHECK-NEXT: {{^}}[[#%x,LHEX+0xe]]
921a  // CHECK-NEXT: {{^}}[[#%x,LHEX+0xE]]
93e   // CHECK-NEXT: {{^}}[[#%x,add(LHEX,2)]]
94ff  // CHECK-NEXT: {{^}}[[#%x,max(LHEX,0xff)]]
95a   // CHECK-NEXT: {{^}}[[#%x,min(LHEX,0xa)]]
96a   // CHECK-NEXT: {{^}}[[#%x,sub(LHEX,2)]]
97D   // CHECK-NEXT: {{^}}[[#%X,UHEX]]
98E   // CHECK-NEXT: {{^}}[[#%X,UHEX+1]]
99C   // CHECK-NEXT: {{^}}[[#%X,UHEX-1]]
1001B  // CHECK-NEXT: {{^}}[[#%X,UHEX+0xe]]
1011B  // CHECK-NEXT: {{^}}[[#%X,UHEX+0xE]]
102F   // CHECK-NEXT: {{^}}[[#%X,add(UHEX,2)]]
103FF  // CHECK-NEXT: {{^}}[[#%X,max(UHEX,0xff)]]
104A   // CHECK-NEXT: {{^}}[[#%X,min(UHEX,0xa)]]
105B   // CHECK-NEXT: {{^}}[[#%X,sub(UHEX,2)]]
106-30 // CHECK-NEXT: {{^}}[[#%d,SIGN]]
107-29 // CHECK-NEXT: {{^}}[[#%d,SIGN+1]]
108-31 // CHECK-NEXT: {{^}}[[#%d,SIGN-1]]
10942  // CHECK-NEXT: {{^}}[[#%d,SIGN+72]]
110-29 // CHECK-NEXT: {{^}}[[#%d,add(SIGN,1)]]
111-17 // CHECK-NEXT: {{^}}[[#%d,max(SIGN,-17)]]
112-30 // CHECK-NEXT: {{^}}[[#%d,min(SIGN,-17)]]
113-31 // CHECK-NEXT: {{^}}[[#%d,sub(SIGN,1)]]
11411  // CHECK-NEXT: {{^}}[[#%u,UNSIa]]
11511  // CHECK-NEXT: {{^}}[[#%u,UNSIb]]
11611  // CHECK-NEXT: {{^}}[[#%u,UNSIc]]
117c   // CHECK-NEXT: {{^}}[[#%x,LHEXa]]
118
119; Numeric expressions with explicit matching format and default matching rule
120; using variables defined on other lines with different spacing.
121USE EXPL FMT IMPL MATCH SPC  // CHECK-LABEL: USE EXPL FMT IMPL MATCH SPC
12211  // CHECK-NEXT: {{^}}[[#%u, UNSI]]
12311  // CHECK-NEXT: {{^}}[[# %u, UNSI]]
12411  // CHECK-NEXT: {{^}}[[# %u, UNSI ]]
12512  // CHECK-NEXT: {{^}}[[#%u, UNSI+1]]
12612  // CHECK-NEXT: {{^}}[[# %u, UNSI+1]]
12712  // CHECK-NEXT: {{^}}[[# %u , UNSI+1]]
12812  // CHECK-NEXT: {{^}}[[# %u , UNSI +1]]
12912  // CHECK-NEXT: {{^}}[[# %u , UNSI + 1]]
13012  // CHECK-NEXT: {{^}}[[# %u , UNSI + 1 ]]
13110  // CHECK-NEXT: {{^}}[[#%u, UNSI-1]]
13210  // CHECK-NEXT: {{^}}[[# %u, UNSI-1]]
13310  // CHECK-NEXT: {{^}}[[# %u , UNSI-1]]
13410  // CHECK-NEXT: {{^}}[[# %u , UNSI -1]]
13510  // CHECK-NEXT: {{^}}[[# %u , UNSI - 1]]
13610  // CHECK-NEXT: {{^}}[[# %u , UNSI - 1 ]]
13713  // CHECK-NEXT: {{^}}[[#%u, add(UNSI,2)]]
13813  // CHECK-NEXT: {{^}}[[# %u, add(UNSI,2)]]
13913  // CHECK-NEXT: {{^}}[[# %u , add(UNSI,2)]]
14013  // CHECK-NEXT: {{^}}[[# %u , add(UNSI, 2)]]
14113  // CHECK-NEXT: {{^}}[[# %u , add( UNSI, 2)]]
14213  // CHECK-NEXT: {{^}}[[# %u , add( UNSI,2)]]
14313  // CHECK-NEXT: {{^}}[[# %u , add(UNSI,2) ]]
14413  // CHECK-NEXT: {{^}}[[# %u , add (UNSI,2)]]
145104 // CHECK-NEXT: {{^}}[[# %u , UNSI + sub( add (100 , UNSI+ 1 ), 20) +1 ]]
146
147; Numeric expressions with explicit matching format, precision, and default
148; matching rule using variables defined on other lines without spaces.
149USE EXPL FMT WITH PREC IMPL MATCH  // CHECK-LABEL: USE EXPL FMT WITH PREC IMPL MATCH
15011         // CHECK-NEXT: {{^}}[[#%.1u,UNSI]]
15100000011   // CHECK-NEXT: {{^}}[[#%.8u,UNSI]]
1521c         // CHECK-NEXT: {{^}}[[#%.1x,LHEX+16]]
1530000000c   // CHECK-NEXT: {{^}}[[#%.8x,LHEX]]
1541D         // CHECK-NEXT: {{^}}[[#%.1X,UHEX+16]]
1550000000D   // CHECK-NEXT: {{^}}[[#%.8X,UHEX]]
156-30        // CHECK-NEXT: {{^}}[[#%.1d,SIGN]]
157-00000030  // CHECK-NEXT: {{^}}[[#%.8d,SIGN]]
158
159; Numeric expressions with explicit matching format, precision and wrong
160; padding, and default matching rule using variables defined on other lines
161; without spaces.
162RUN: FileCheck --check-prefixes CHECK,INVALID-PADDING-EXPL-USE --input-file %s %s
163
164FAIL USE IMPL FMT WITH PREC EXPL MATCH  // INVALID-PADDING-EXPL-USE-LABEL: FAIL USE IMPL FMT WITH PREC IMPL MATCH
165INVALID UNSI+1: 0000012     // INVALID-PADDING-EXPL-USE-NOT: {{^}}INVALID UNSI+1: [[#%.8u,UNSI+1]]
166INVALID UNSI-1: 000000010   // INVALID-PADDING-EXPL-USE-NOT: {{^}}INVALID UNSI-1: [[#%.8u,UNSI-1]]
167INVALID LHEX+1: 000000d     // INVALID-PADDING-EXPL-USE-NOT: {{^}}INVALID LHEX+1: [[#%.8x,LHEX+1]]
168INVALID LHEX-1: 00000000b   // INVALID-PADDING-EXPL-USE-NOT: {{^}}INVALID LHEX-1: [[#%.8x,LHEX-1]]
169INVALID UHEX+1: 000000E     // INVALID-PADDING-EXPL-USE-NOT: {{^}}INVALID UHEX+1: [[#%.8X,UHEX+1]]
170INVALID UHEX-1: 00000000C   // INVALID-PADDING-EXPL-USE-NOT: {{^}}INVALID UHEX-1: [[#%.8X,UHEX-1]]
171INVALID SIGN+1: -0000029    // INVALID-PADDING-EXPL-USE-NOT: {{^}}INVALID SIGN+1: [[#%.8d,SIGN+1]]
172INVALID SIGN-1: -000000031  // INVALID-PADDING-EXPL-USE-NOT: {{^}}INVALID SIGN-1: [[#%.8d,SIGN-1]]
173
174; Numeric expressions with implicit matching format and default matching rule
175; using variables defined on other lines.
176USE IMPL FMT IMPL MATCH  // CHECK-LABEL: USE IMPL FMT IMPL MATCH
17711  // CHECK-NEXT: {{^}}[[#UNSI]]
17812  // CHECK-NEXT: {{^}}[[#UNSI+1]]
17910  // CHECK-NEXT: {{^}}[[#UNSI-1]]
18099  // CHECK-NEXT: {{^}}[[#max(UNSI,99)]]
1817   // CHECK-NEXT: {{^}}[[#min(UNSI,7)]]
182c   // CHECK-NEXT: {{^}}[[#LHEX]]
183d   // CHECK-NEXT: {{^}}[[#LHEX+1]]
184b   // CHECK-NEXT: {{^}}[[#LHEX-1]]
1851a  // CHECK-NEXT: {{^}}[[#LHEX+0xe]]
1861a  // CHECK-NEXT: {{^}}[[#LHEX+0xE]]
187ff  // CHECK-NEXT: {{^}}[[#max(LHEX,255)]]
188a   // CHECK-NEXT: {{^}}[[#min(LHEX,10)]]
189D   // CHECK-NEXT: {{^}}[[#UHEX]]
190E   // CHECK-NEXT: {{^}}[[#UHEX+1]]
191C   // CHECK-NEXT: {{^}}[[#UHEX-1]]
1921B  // CHECK-NEXT: {{^}}[[#UHEX+0xe]]
1931B  // CHECK-NEXT: {{^}}[[#UHEX+0xE]]
194FF  // CHECK-NEXT: {{^}}[[#max(UHEX,255)]]
195A   // CHECK-NEXT: {{^}}[[#min(UHEX,10)]]
196-30 // CHECK-NEXT: {{^}}[[#SIGN]]
197-29 // CHECK-NEXT: {{^}}[[#SIGN+1]]
198-31 // CHECK-NEXT: {{^}}[[#SIGN-1]]
199
200; Numeric expressions with implicit matching format, precision, and default
201; matching rule using variables defined on other lines.
202USE IMPL FMT WITH PREC IMPL MATCH  // CHECK-LABEL: USE IMPL FMT WITH PREC IMPL MATCH
20300000023    // CHECK-NEXT: {{^}}[[#PADDED_UNSI+1]]
204323232324   // CHECK-NEXT: {{^}}[[#PADDED_UNSI2+1]]
20500000019    // CHECK-NEXT: {{^}}[[#PADDED_UNSI3+1]]
206181818182   // CHECK-NEXT: {{^}}[[#PADDED_UNSI4+1]]
20700000010    // CHECK-NEXT: {{^}}[[#PADDED_LHEX+1]]
2081000000000  // CHECK-NEXT: {{^}}[[#PADDED_LHEX2+1]]
2090000000F    // CHECK-NEXT: {{^}}[[#PADDED_UHEX+1]]
210EEEEEEEEF   // CHECK-NEXT: {{^}}[[#PADDED_UHEX2+1]]
211-00000054   // CHECK-NEXT: {{^}}[[#PADDED_SIGN+1]]
212-555555554  // CHECK-NEXT: {{^}}[[#PADDED_SIGN2+1]]
213
214; Numeric expression with implicit matching format, precision and wrong amount
215; of padding, and default matching rule using variables defined on other lines.
216RUN: FileCheck --check-prefixes CHECK,INVALID-PADDING-IMPL-USE --input-file %s %s
217
218FAIL USE IMPL FMT WITH PREC IMPL MATCH  // INVALID-PADDING-IMPL-USE-LABEL: FAIL USE IMPL FMT WITH PREC IMPL MATCH
219INVALID PADDED_UNSI+1: 0000023     // INVALID-PADDING-IMPL-USE-NOT: {{^}}INVALID PADDED_UNSI+1: [[#PADDED_UNSI+1]]
220INVALID PADDED_UNSI-1: 000000021   // INVALID-PADDING-IMPL-USE-NOT: {{^}}INVALID PADDED_UNSI-1: [[#PADDED_UNSI-1]]
221INVALID PADDED_UNSI3+1: 0000019    // INVALID-PADDING-IMPL-USE-NOT: {{^}}INVALID PADDED_UNSI3+1: [[#PADDED_UNSI3+1]]
222INVALID PADDED_UNSI3-1: 000000017  // INVALID-PADDING-IMPL-USE-NOT: {{^}}INVALID PADDED_UNSI3-1: [[#PADDED_UNSI3-1]]
223INVALID PADDED_LHEX+1: 0000010     // INVALID-PADDING-IMPL-USE-NOT: {{^}}INVALID PADDED_LHEX+1: [[#PADDED_LHEX+1]]
224INVALID PADDED_LHEX-1: 00000000e   // INVALID-PADDING-IMPL-USE-NOT: {{^}}INVALID PADDED_LHEX-1: [[#PADDED_LHEX-1]]
225INVALID PADDED_UHEX+1: 000000F     // INVALID-PADDING-IMPL-USE-NOT: {{^}}INVALID PADDED_UHEX+1: [[#PADDED_UHEX+1]]
226INVALID PADDED_UHEX-1: 00000000D   // INVALID-PADDING-IMPL-USE-NOT: {{^}}INVALID PADDED_UHEX-1: [[#PADDED_UHEX-1]]
227INVALID PADDED_SIGN+1: -0000054    // INVALID-PADDING-IMPL-USE-NOT: {{^}}INVALID PADDED_SIGN+1: [[#PADDED_SIGN+1]]
228INVALID PADDED_SIGN-1: -000000056  // INVALID-PADDING-IMPL-USE-NOT: {{^}}INVALID PADDED_SIGN-1: [[#PADDED_SIGN-1]]
229
230; Numeric expressions using variables defined on other lines and an immediate
231; interpreted as an unsigned value.
232; Note: 9223372036854775819 = 0x8000000000000000 + 11
233USE IMPL FMT IMPL MATCH UNSIGNED IMM
2349223372036854775819
235CHECK-LABEL: USE IMPL FMT IMPL MATCH UNSIGNED IMM
236CHECK-NEXT: [[#UNSI+0x8000000000000000]]
237
238; Numeric expressions in default matching format and explicit matching rule using
239; variables defined on other lines.
240USE DEF FMT EXPL MATCH  // CHECK-LABEL: USE DEF FMT EXPL MATCH
24111  // CHECK-NEXT: {{^}}[[#==UNSI]]
24211  // CHECK-NEXT: {{^}}[[# == UNSI]]
24312  // CHECK-NEXT: {{^}}[[#UNSI2: == UNSI + 1]]
24412  // CHECK-NEXT: {{^}}[[#==UNSI2]]
245
246; Numeric expressions in default matching format and explicit matching rule using
247; variable defined on other lines with match failure.
248RUN: %ProtectFileCheckOutput \
249RUN: not FileCheck --check-prefix NUMEXPR-CONSTRAINT-NOMATCH --input-file %s %s 2>&1 \
250RUN:   | FileCheck --check-prefix NUMEXPR-CONSTRAINT-NOMATCH-MSG --strict-whitespace %s
251
252USE DEF FMT EXPL NO MATCH
253UNSI=11
254UNSI: 12
255NUMEXPR-CONSTRAINT-NOMATCH-LABEL: USE DEF FMT EXPL NO MATCH
256NUMEXPR-CONSTRAINT-NOMATCH-NEXT: UNSI=[[#UNSI:]]
257NUMEXPR-CONSTRAINT-NOMATCH-NEXT: UNSI: [[#==UNSI]]
258NUMEXPR-CONSTRAINT-NOMATCH-MSG: numeric-expression.txt:[[#@LINE-1]]:34: error: {{N}}UMEXPR-CONSTRAINT-NOMATCH-NEXT: expected string not found in input
259NUMEXPR-CONSTRAINT-NOMATCH-MSG-NEXT:  {{N}}UMEXPR-CONSTRAINT-NOMATCH-NEXT: UNSI: {{\[\[#==UNSI\]\]}}
260NUMEXPR-CONSTRAINT-NOMATCH-MSG-NEXT: {{^}}                                 ^{{$}}
261
262; Empty numeric expression with matching constraint.
263RUN: %ProtectFileCheckOutput \
264RUN: not FileCheck --check-prefix EMPTY-NUMEXPR-CONSTRAINT --input-file %s %s 2>&1 \
265RUN:   | FileCheck --check-prefix EMPTY-NUMEXPR-CONSTRAINT-MSG --strict-whitespace %s
266
267EMPTY NUMEXPR USE WITH CONSTRAINT
26818
269EMPTY-NUMEXPR-CONSTRAINT-LABEL: EMPTY NUMEXPR USE WITH CONSTRAINT
270EMPTY-NUMEXPR-CONSTRAINT-NEXT: [[# ==]]
271EMPTY-NUMEXPR-CONSTRAINT-MSG: numeric-expression.txt:[[#@LINE-1]]:38: error: empty numeric expression should not have a constraint
272EMPTY-NUMEXPR-CONSTRAINT-MSG-NEXT: {{E}}MPTY-NUMEXPR-CONSTRAINT-NEXT: {{\[\[# ==\]\]}}
273EMPTY-NUMEXPR-CONSTRAINT-MSG-NEXT:     {{^}}                                     ^{{$}}
274
275; Definition from empty numeric expression with matching constraint.
276RUN: %ProtectFileCheckOutput \
277RUN: not FileCheck --check-prefix EMPTY-NUMDEF-CONSTRAINT --input-file %s %s 2>&1 \
278RUN:   | FileCheck --check-prefix EMPTY-NUMDEF-CONSTRAINT-MSG %s
279
280EMPTY NUMEXPR DEF WITH CONSTRAINT
28118
282EMPTY-NUMDEF-CONSTRAINT-LABEL: EMPTY NUMEXPR CONSTRAINT
283EMPTY-NUMDEF-CONSTRAINT-NEXT: [[#VARDEF: ==]]
284EMPTY-NUMDEF-CONSTRAINT-MSG: numeric-expression.txt:[[#@LINE-1]]:44: error: empty numeric expression should not have a constraint
285EMPTY-NUMDEF-CONSTRAINT-MSG-NEXT: {{E}}MPTY-NUMDEF-CONSTRAINT-NEXT: {{\[\[#VARDEF: ==\]\]}}
286EMPTY-NUMDEF-CONSTRAINT-MSG-NEXT:     {{^}}                                           ^{{$}}
287
288; Numeric expressions with matching format overriding the implicit format of
289; variables defined on other lines.
290USE CONV FMT IMPL MATCH  // CHECK-LABEL: USE CONV FMT IMPL MATCH
291b   // CHECK-NEXT: {{^}}[[# %x, UNSI]]
292B   // CHECK-NEXT: {{^}}[[# %X, UNSI]]
293-1  // CHECK-NEXT: {{^}}[[# %d, UNSI-12]]
29412  // CHECK-NEXT: {{^}}[[# %u, LHEX]]
295C   // CHECK-NEXT: {{^}}[[# %X, LHEX]]
296-2  // CHECK-NEXT: {{^}}[[# %d, LHEX-14]]
29713  // CHECK-NEXT: {{^}}[[# %u, UHEX]]
298d   // CHECK-NEXT: {{^}}[[# %x, UHEX]]
299-5  // CHECK-NEXT: {{^}}[[# %d, UHEX-18]]
30015  // CHECK-NEXT: {{^}}[[# %u, SIGN+45]]
301f   // CHECK-NEXT: {{^}}[[# %x, SIGN+45]]
302F   // CHECK-NEXT: {{^}}[[# %X, SIGN+45]]
303
304; Conflicting implicit format.
305RUN: %ProtectFileCheckOutput \
306RUN: not FileCheck --check-prefixes CHECK,FMT-CONFLICT1 --input-file %s %s 2>&1 \
307RUN:   | FileCheck --strict-whitespace --check-prefix FMT-CONFLICT1-MSG %s
308RUN: %ProtectFileCheckOutput \
309RUN: not FileCheck --check-prefixes CHECK,FMT-CONFLICT2 --input-file %s %s 2>&1 \
310RUN:   | FileCheck --strict-whitespace --check-prefix FMT-CONFLICT2-MSG %s
311
312VAR USE IMPL FMT CONFLICT
31323
314FMT-CONFLICT1-LABEL: VAR USE IMPL FMT CONFLICT
315FMT-CONFLICT1-NEXT: [[#UNSI + LHEX]]
316FMT-CONFLICT1-MSG: numeric-expression.txt:[[#@LINE-1]]:24: error: implicit format conflict between 'UNSI' (%u) and 'LHEX' (%x), need an explicit format specifier
317FMT-CONFLICT1-MSG-NEXT: {{F}}MT-CONFLICT1-NEXT: {{\[\[#UNSI \+ LHEX\]\]}}
318FMT-CONFLICT1-MSG-NEXT: {{^                       \^$}}
319
320VAR USE IMPL FMT CONFLICT COMPLEX
32134
322FMT-CONFLICT2-LABEL: VAR USE IMPL FMT CONFLICT
323FMT-CONFLICT2-NEXT: [[#UNSI + UNSIa + LHEX]]
324FMT-CONFLICT2-MSG: numeric-expression.txt:[[#@LINE-1]]:24: error: implicit format conflict between 'UNSI + UNSIa' (%u) and 'LHEX' (%x), need an explicit format specifier
325FMT-CONFLICT2-MSG-NEXT: {{F}}MT-CONFLICT2-NEXT: {{\[\[#UNSI \+ UNSIa \+ LHEX\]\]}}
326FMT-CONFLICT2-MSG-NEXT: {{^                       \^$}}
327
328; Explicitly specified format can override conflicting implicit formats.
329VAR USE IMPL OVERRIDE FMT CONFLICT  // CHECK-LABEL: VAR USE IMPL OVERRIDE FMT CONFLICT
33023  // CHECK-NEXT: {{^}}[[# %u, UNSI + LHEX]]
331
332; Numeric expressions using more than one variable defined on other lines.
333USE MULTI VAR  // CHECK-LABEL: USE MULTI VAR
33422  // CHECK-NEXT: {{^}}[[#UNSI+UNSIa]]
335
336; Numeric expression using a variable defined from a numeric expression.
337DEF EXPR GOOD MATCH  // CHECK-LABEL: DEF EXPR GOOD MATCH
33842  // CHECK-NEXT: {{^}}[[# VAR42:UNSI+31]]
33941  // CHECK-NEXT: {{^}}[[# VAR42-1]]
340
341; Empty numeric expression.
342EMPTY NUM EXPR  // CHECK-LABEL: EMPTY NUM EXPR
343foo 104 bar  // CHECK-NEXT: {{^}}foo [[#]] bar
344
345; Numeric expressions using parentheses.
346RUN: %ProtectFileCheckOutput \
347RUN: not FileCheck -D#NUMVAR=10 --check-prefix PAREN-OP \
348RUN:               --input-file %s %s 2>&1 \
349RUN:   | FileCheck --strict-whitespace --check-prefix PAREN-OP-MSG %s
350
351PAREN EXPRESSIONS // PAREN-OP-LABEL: PAREN EXPRESSIONS
35211  // PAREN-OP-NEXT: [[#(NUMVAR+2)-1]]
35311  // PAREN-OP-NEXT: [[#NUMVAR+(2-1)]]
35411  // PAREN-OP-NEXT: [[#NUMVAR+(2-1]]
355PAREN-OP-MSG: numeric-expression.txt:[[#@LINE-1]]:36: error: missing ')' at end of nested expression
356PAREN-OP-MSG-NEXT: {{P}}AREN-OP-NEXT: {{\[\[#NUMVAR\+\(2\-1]\]}}
357PAREN-OP-MSG-NEXT: {{^}}                                   ^{{$}}
358
359; Numeric expression using undefined variables.
360RUN: %ProtectFileCheckOutput \
361RUN: not FileCheck --check-prefix UNDEF-USE --input-file %s %s 2>&1 \
362RUN:   | FileCheck --strict-whitespace --check-prefix UNDEF-USE-MSG %s
363
364UNDEF VAR USE
365UNDEFVAR: 11
366UNDEF-USE-LABEL: UNDEF VAR USE
367UNDEF-USE-NEXT: UNDEFVAR: [[#UNDEFVAR1+UNDEFVAR2]]
368UNDEF-USE-MSG: numeric-expression.txt:[[#@LINE-1]]:17: error: {{U}}NDEF-USE-NEXT: expected string not found in input
369UNDEF-USE-MSG-NEXT:      {{U}}NDEF-USE-NEXT: UNDEFVAR: {{\[\[#UNDEFVAR1\+UNDEFVAR2\]\]}}
370UNDEF-USE-MSG-NEXT:     {{^}}                ^{{$}}
371UNDEF-USE-MSG-NEXT:      numeric-expression.txt:[[#@LINE-7]]:14: note: scanning from here
372UNDEF-USE-MSG-NEXT:      UNDEF VAR USE
373UNDEF-USE-MSG-NEXT: {{^}}             ^{{$}}
374UNDEF-USE-MSG-NEXT:      numeric-expression.txt:[[#@LINE-10]]:14: note: uses undefined variable(s): "UNDEFVAR1" "UNDEFVAR2"
375UNDEF-USE-MSG-NEXT:      UNDEF VAR USE
376UNDEF-USE-MSG-NEXT: {{^}}             ^{{$}}
377
378; Numeric expression with unsupported operator.
379RUN: %ProtectFileCheckOutput \
380RUN: not FileCheck -D#NUMVAR=10 --check-prefix INVAL-OP \
381RUN:               --input-file %s %s 2>&1 \
382RUN:   | FileCheck --strict-whitespace --check-prefix INVAL-OP-MSG %s
383
384INVALID OPERATOR
385NUMVAR*2: 22
386INVAL-OP-LABEL: INVALID OPERATOR
387INVAL-OP-NEXT: NUMVAR*2: [[#NUMVAR*2]]
388INVAL-OP-MSG: numeric-expression.txt:[[#@LINE-1]]:35: error: unsupported operation '*'
389INVAL-OP-MSG-NEXT: {{I}}NVAL-OP-NEXT: NUMVAR*2: {{\[\[#NUMVAR\*2\]\]}}
390INVAL-OP-MSG-NEXT:     {{^}}                                  ^{{$}}
391
392; Name conflict between Numeric variable definition and string variable
393; definition whether from the command-line or input text.
394RUN: %ProtectFileCheckOutput \
395RUN: not FileCheck --check-prefixes CONFLICT,CONFLICT1,CONFLICT2 \
396RUN:               --input-file %s %s 2>&1 \
397RUN:   | FileCheck --strict-whitespace --check-prefix INPUT-STR-CONFLICT %s
398RUN: %ProtectFileCheckOutput \
399RUN: not FileCheck -D#NUMVAR=42 --check-prefixes CONFLICT,CONFLICT2 \
400RUN:               --input-file %s %s 2>&1 \
401RUN:   | FileCheck --strict-whitespace --check-prefix INPUT-STR-CONFLICT %s
402RUN: %ProtectFileCheckOutput \
403RUN: not FileCheck -D#NUMVAR=42 -DNUMVAR=foobar --check-prefix CONFLICT \
404RUN:               --input-file %s %s 2>&1 \
405RUN:   | FileCheck --strict-whitespace --check-prefix CLI-STR-CONFLICT %s
406RUN: %ProtectFileCheckOutput \
407RUN: not FileCheck --check-prefixes CONFLICT,CONFLICT3,CONFLICT4 \
408RUN:               --input-file %s %s 2>&1 \
409RUN:   | FileCheck --strict-whitespace --check-prefix INPUT-NUM-CONFLICT %s
410RUN: %ProtectFileCheckOutput \
411RUN: not FileCheck -DSTRVAR=foobar --check-prefixes CONFLICT,CONFLICT4 \
412RUN:               --input-file %s %s 2>&1 \
413RUN:   | FileCheck --strict-whitespace --check-prefix INPUT-NUM-CONFLICT %s
414RUN: %ProtectFileCheckOutput \
415RUN: not FileCheck -DSTRVAR=foobar -D#STRVAR=42 --check-prefix CONFLICT \
416RUN:               --input-file %s %s 2>&1 \
417RUN:   | FileCheck --strict-whitespace --check-prefix CLI-NUM-CONFLICT %s
418
419STRVAR NUMVAR CONFLICT
420redef1 42
421foobar
422redef2 42
423CONFLICT-LABEL: STRVAR NUMVAR CONFLICT
424CONFLICT1-NEXT: redef1 [[#NUMVAR:]]
425CONFLICT2: [[NUMVAR:foo.*]]
426CONFLICT3: [[STRVAR:foo.*]]
427CONFLICT4: redef2 [[#STRVAR:]]
428INPUT-STR-CONFLICT: numeric-expression.txt:[[#@LINE-3]]:14: error: numeric variable with name 'NUMVAR' already exists
429INPUT-STR-CONFLICT-NEXT: {{C}}ONFLICT2: {{\[\[NUMVAR:foo\.\*\]\]}}
430INPUT-STR-CONFLICT-NEXT:    {{^}}             ^{{$}}
431CLI-STR-CONFLICT: Global defines:2:19: error: numeric variable with name 'NUMVAR' already exists
432CLI-STR-CONFLICT-NEXT:      Global define #2: NUMVAR=foobar
433CLI-STR-CONFLICT-NEXT: {{^}}                  ^{{$}}
434INPUT-NUM-CONFLICT: numeric-expression.txt:[[#@LINE-7]]:22: error: string variable with name 'STRVAR' already exists
435 INPUT-NUM-CONFLICT-NEXT: CONFLICT4: redef2 {{\[\[#STRVAR:\]\]}}
436INPUT-NUM-CONFLICT-NEXT: {{^}}                     ^{{$}}
437CLI-NUM-CONFLICT: Global defines:2:45: error: string variable with name 'STRVAR' already exists
438 CLI-NUM-CONFLICT-NEXT: Global define #2: #STRVAR=42 (parsed as: {{\[\[#STRVAR:42\]\]}})
439CLI-NUM-CONFLICT-NEXT: {{^}}                                            ^{{$}}
440
441; Numeric variable definition with too big value.
442RUN: %ProtectFileCheckOutput \
443RUN: not FileCheck --check-prefix BIGVAL --input-file %s %s 2>&1 \
444RUN:   | FileCheck --strict-whitespace --check-prefix BIGVAL-MSG %s
445
446BIG VALUE
447NUMVAR: 10000000000000000000000
448BIGVAL-LABEL: BIG VALUE
449BIGVAL-NEXT: NUMVAR: [[#NUMVAR:]]
450BIGVAL-MSG: numeric-expression.txt:[[#@LINE-3]]:9: error: unable to represent numeric value
451 BIGVAL-MSG-NEXT: {{N}}UMVAR: 10000000000000000000000
452BIGVAL-MSG-NEXT: {{^}}        ^{{$}}
453
454; Verify that when a variable is set to an expression the expression is still
455; checked.
456RUN: %ProtectFileCheckOutput \
457RUN: not FileCheck --check-prefix DEF-EXPR-FAIL --input-file %s %s 2>&1 \
458RUN:   | FileCheck --strict-whitespace --check-prefix DEF-EXPR-FAIL-MSG %s
459
460DEF EXPR WRONG MATCH
46120
46243
463DEF-EXPR-FAIL-LABEL: DEF EXPR WRONG MATCH
464DEF-EXPR-FAIL-NEXT: [[# VAR20:]]
465DEF-EXPR-FAIL-NEXT: [[# VAR42: VAR20+22]]
466DEF-EXPR-FAIL-MSG: numeric-expression.txt:[[#@LINE-1]]:21: error: {{D}}EF-EXPR-FAIL-NEXT: is not on the line after the previous match
467DEF-EXPR-FAIL-MSG-NEXT: {{D}}EF-EXPR-FAIL-NEXT: {{\[\[# VAR42: VAR20\+22\]\]}}
468DEF-EXPR-FAIL-MSG-NEXT:   {{^}}                    ^{{$}}
469
470; Verify that using a numeric variable defined on the same line (whether from
471; input or from an expression) is rejected.
472RUN: %ProtectFileCheckOutput \
473RUN: not FileCheck --check-prefix SAME-LINE-USE1 --input-file %s %s 2>&1 \
474RUN:   | FileCheck --strict-whitespace --check-prefix SAME-LINE-USE-MSG1 %s
475RUN: %ProtectFileCheckOutput \
476RUN: not FileCheck --check-prefix SAME-LINE-USE2 --input-file %s %s 2>&1 \
477RUN:   | FileCheck --strict-whitespace --check-prefix SAME-LINE-USE-MSG2 %s
478
479SAME LINE USE
4803
4814 5
482SAME-LINE-USE1-LABEL: SAME LINE USE
483SAME-LINE-USE1-NEXT: [[#]]
484SAME-LINE-USE1-NEXT: [[#UNSI:]] [[#UNSI+1]]
485SAME-LINE-USE-MSG1: numeric-expression.txt:[[#@LINE-1]]:36: error: numeric variable 'UNSI' defined earlier in the same CHECK directive
486SAME-LINE-USE-MSG1-NEXT: {{S}}AME-LINE-USE1-NEXT: {{\[\[#UNSI:\]\] \[\[#UNSI\+1\]\]}}
487SAME-LINE-USE-MSG1-NEXT:        {{^}}                                   ^{{$}}
488
489SAME-LINE-USE2-LABEL: SAME LINE USE
490SAME-LINE-USE2-NEXT: [[#UNSI:]]
491SAME-LINE-USE2-NEXT: [[#UNSI2:UNSI+1]] [[#UNSI2+1]]
492SAME-LINE-USE-MSG2: numeric-expression.txt:[[#@LINE-1]]:43: error: numeric variable 'UNSI2' defined earlier in the same CHECK directive
493SAME-LINE-USE-MSG2-NEXT: {{S}}AME-LINE-USE2-NEXT: {{\[\[#UNSI2:UNSI\+1\]\] \[\[#UNSI2\+1\]\]}}
494SAME-LINE-USE-MSG2-NEXT:        {{^}}                                          ^{{$}}
495
496; Invalid change of format in variable redefinition.
497RUN: %ProtectFileCheckOutput \
498RUN: not FileCheck --check-prefix REDEF-NEW-FMT --input-file %s %s 2>&1 \
499RUN:   | FileCheck --strict-whitespace --check-prefix REDEF-NEW-FMT-MSG %s
500
501VAR REDEF FMT CHANGE
50222
503DC
504REDEF-NEW-FMT-LABEL: VAR REDEF FMT CHANGE
505REDEF-NEW-FMT-NEXT: [[#UNSI:]]
506REDEF-NEW-FMT-NEXT: [[#%X,UNSI:]]
507REDEF-NEW-FMT-MSG: numeric-expression.txt:[[#@LINE-1]]:31: error: format different from previous variable definition
508REDEF-NEW-FMT-MSG-NEXT: {{R}}EDEF-NEW-FMT-NEXT: {{\[\[#%X,UNSI:\]\]}}
509REDEF-NEW-FMT-MSG-NEXT:    {{^}}                              ^{{$}}
510
511; Numeric expression with overflow.
512RUN: %ProtectFileCheckOutput \
513RUN: not FileCheck --check-prefix OVERFLOW --input-file %s %s 2>&1 \
514RUN:   | FileCheck --check-prefix OVERFLOW-MSG --strict-whitespace %s
515
516OVERFLOW
517BIGVAR=10000000000000000
518OVERFLOW-LABEL: OVERFLOW
519OVERFLOW-NEXT: BIGVAR: [[#BIGVAR:0x8000000000000000+0x8000000000000000]]
520OVERFLOW-MSG: numeric-expression.txt:[[#@LINE-1]]:27: error: unable to substitute variable or numeric expression
521OVERFLOW-MSG-NEXT: {{O}}VERFLOW-NEXT: BIGVAR: {{\[\[#BIGVAR:0x8000000000000000\+0x8000000000000000\]\]}}
522OVERFLOW-MSG-NEXT:    {{^}}                          ^{{$}}
523
524; Numeric expression with underflow.
525RUN: %ProtectFileCheckOutput \
526RUN: not FileCheck --check-prefix UNDERFLOW --input-file %s %s 2>&1 \
527RUN:   | FileCheck --check-prefix UNDERFLOW-MSG --strict-whitespace %s
528
529UNDERFLOW
530TINYVAR=-10000000000000000
531UNDERFLOW-LABEL: UNDERFLOW
532UNDERFLOW-NEXT: TINYVAR: [[#%d,TINYVAR:-0x8000000000000000-0x8000000000000000]]
533UNDERFLOW-MSG: numeric-expression.txt:[[#@LINE-1]]:29: error: unable to substitute variable or numeric expression
534UNDERFLOW-MSG-NEXT: {{U}}NDERFLOW-NEXT: TINYVAR: {{\[\[#%d,TINYVAR:-0x8000000000000000-0x8000000000000000\]\]}}
535UNDERFLOW-MSG-NEXT:    {{^}}                            ^{{$}}
536
537RUN: %ProtectFileCheckOutput \
538RUN: not FileCheck -D#NUMVAR=10 --check-prefix CALL-MISSING-CLOSING-BRACKET --input-file %s %s 2>&1 \
539RUN:   | FileCheck --strict-whitespace --check-prefix CALL-MISSING-CLOSING-BRACKET-MSG %s
540
541CALL MISSING CLOSING BRACKET
54230
543CALL-MISSING-CLOSING-BRACKET-LABEL: CALL MISSING CLOSING BRACKET
544CALL-MISSING-CLOSING-BRACKET-NEXT: [[#add(NUMVAR,3]]
545CALL-MISSING-CLOSING-BRACKET-MSG: numeric-expression.txt:[[#@LINE-1]]:51: error: missing ')' at end of call expression
546CALL-MISSING-CLOSING-BRACKET-MSG-NEXT: {{C}}ALL-MISSING-CLOSING-BRACKET-NEXT: {{\[\[#add\(NUMVAR,3\]\]}}
547CALL-MISSING-CLOSING-BRACKET-MSG-NEXT:      {{^}}                                                  ^{{$}}
548
549RUN: %ProtectFileCheckOutput \
550RUN: not FileCheck -D#NUMVAR=10 --check-prefix CALL-MISSING-ARGUMENT --input-file %s %s 2>&1 \
551RUN:   | FileCheck --strict-whitespace --check-prefix CALL-MISSING-ARGUMENT-MSG %s
552
553CALL MISSING ARGUMENT
55430
555CALL-MISSING-ARGUMENT-LABEL: CALL MISSING ARGUMENT
556CALL-MISSING-ARGUMENT-NEXT: [[#add(NUMVAR,)]]
557CALL-MISSING-ARGUMENT-MSG: numeric-expression.txt:[[#@LINE-1]]:43: error: missing argument
558CALL-MISSING-ARGUMENT-MSG-NEXT: {{C}}ALL-MISSING-ARGUMENT-NEXT: {{\[\[#add\(NUMVAR,\)\]\]}}
559CALL-MISSING-ARGUMENT-MSG-NEXT:      {{^}}                                          ^{{$}}
560
561RUN: %ProtectFileCheckOutput \
562RUN: not FileCheck -D#NUMVAR=10 --check-prefix CALL-WRONG-ARGUMENT-COUNT --input-file %s %s 2>&1 \
563RUN:   | FileCheck --strict-whitespace --check-prefix CALL-WRONG-ARGUMENT-COUNT-MSG %s
564
565CALL WRONG ARGUMENT COUNT
56630
567CALL-WRONG-ARGUMENT-COUNT-LABEL: CALL WRONG ARGUMENT COUNT
568CALL-WRONG-ARGUMENT-COUNT-NEXT: [[#add(NUMVAR)]]
569CALL-WRONG-ARGUMENT-COUNT-MSG: numeric-expression.txt:[[#@LINE-1]]:36: error: function 'add' takes 2 arguments but 1 given
570CALL-WRONG-ARGUMENT-COUNT-MSG-NEXT: {{C}}ALL-WRONG-ARGUMENT-COUNT-NEXT: {{\[\[#add\(NUMVAR\)\]\]}}
571CALL-WRONG-ARGUMENT-COUNT-MSG-NEXT:    {{^}}                                   ^{{$}}
572
573RUN: %ProtectFileCheckOutput \
574RUN: not FileCheck -D#NUMVAR=10 --check-prefix CALL-UNDEFINED-FUNCTION --input-file %s %s 2>&1 \
575RUN:   | FileCheck --strict-whitespace --check-prefix CALL-UNDEFINED-FUNCTION-MSG %s
576
577CALL UNDEFINED FUNCTION
57830
579CALL-UNDEFINED-FUNCTION-LABEL: CALL UNDEFINED FUNCTION
580CALL-UNDEFINED-FUNCTION-NEXT: [[#bogus_function(NUMVAR)]]
581CALL-UNDEFINED-FUNCTION-MSG: numeric-expression.txt:[[#@LINE-1]]:34: error: call to undefined function 'bogus_function'
582CALL-UNDEFINED-FUNCTION-MSG-NEXT: {{C}}ALL-UNDEFINED-FUNCTION-NEXT: {{\[\[#bogus_function\(NUMVAR\)\]\]}}
583CALL-UNDEFINED-FUNCTION-MSG-NEXT:    {{^}}                                 ^{{$}}
584