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
25312
254NUMEXPR-CONSTRAINT-NOMATCH-LABEL: USE DEF FMT EXPL NO MATCH
255NUMEXPR-CONSTRAINT-NOMATCH-NEXT: [[#==UNSI]]
256NUMEXPR-CONSTRAINT-NOMATCH-MSG: numeric-expression.txt:[[#@LINE-1]]:34: error: {{N}}UMEXPR-CONSTRAINT-NOMATCH-NEXT: expected string not found in input
257NUMEXPR-CONSTRAINT-NOMATCH-MSG-NEXT: {{N}}UMEXPR-CONSTRAINT-NOMATCH-NEXT: {{\[\[#==UNSI\]\]}}
258NUMEXPR-CONSTRAINT-NOMATCH-MSG-NEXT:   {{^}}                                 ^{{$}}
259
260; Empty numeric expression with matching constraint.
261RUN: %ProtectFileCheckOutput \
262RUN: not FileCheck --check-prefix EMPTY-NUMEXPR-CONSTRAINT --input-file %s %s 2>&1 \
263RUN:   | FileCheck --check-prefix EMPTY-NUMEXPR-CONSTRAINT-MSG --strict-whitespace %s
264
265EMPTY NUMEXPR USE WITH CONSTRAINT
26618
267EMPTY-NUMEXPR-CONSTRAINT-LABEL: EMPTY NUMEXPR USE WITH CONSTRAINT
268EMPTY-NUMEXPR-CONSTRAINT-NEXT: [[# ==]]
269EMPTY-NUMEXPR-CONSTRAINT-MSG: numeric-expression.txt:[[#@LINE-1]]:38: error: empty numeric expression should not have a constraint
270EMPTY-NUMEXPR-CONSTRAINT-MSG-NEXT: {{E}}MPTY-NUMEXPR-CONSTRAINT-NEXT: {{\[\[# ==\]\]}}
271EMPTY-NUMEXPR-CONSTRAINT-MSG-NEXT:     {{^}}                                     ^{{$}}
272
273; Definition from empty numeric expression with matching constraint.
274RUN: %ProtectFileCheckOutput \
275RUN: not FileCheck --check-prefix EMPTY-NUMDEF-CONSTRAINT --input-file %s %s 2>&1 \
276RUN:   | FileCheck --check-prefix EMPTY-NUMDEF-CONSTRAINT-MSG %s
277
278EMPTY NUMEXPR DEF WITH CONSTRAINT
27918
280EMPTY-NUMDEF-CONSTRAINT-LABEL: EMPTY NUMEXPR CONSTRAINT
281EMPTY-NUMDEF-CONSTRAINT-NEXT: [[#VARDEF: ==]]
282EMPTY-NUMDEF-CONSTRAINT-MSG: numeric-expression.txt:[[#@LINE-1]]:44: error: empty numeric expression should not have a constraint
283EMPTY-NUMDEF-CONSTRAINT-MSG-NEXT: {{E}}MPTY-NUMDEF-CONSTRAINT-NEXT: {{\[\[#VARDEF: ==\]\]}}
284EMPTY-NUMDEF-CONSTRAINT-MSG-NEXT:     {{^}}                                           ^{{$}}
285
286; Numeric expressions with matching format overriding the implicit format of
287; variables defined on other lines.
288USE CONV FMT IMPL MATCH  // CHECK-LABEL: USE CONV FMT IMPL MATCH
289b   // CHECK-NEXT: {{^}}[[# %x, UNSI]]
290B   // CHECK-NEXT: {{^}}[[# %X, UNSI]]
291-1  // CHECK-NEXT: {{^}}[[# %d, UNSI-12]]
29212  // CHECK-NEXT: {{^}}[[# %u, LHEX]]
293C   // CHECK-NEXT: {{^}}[[# %X, LHEX]]
294-2  // CHECK-NEXT: {{^}}[[# %d, LHEX-14]]
29513  // CHECK-NEXT: {{^}}[[# %u, UHEX]]
296d   // CHECK-NEXT: {{^}}[[# %x, UHEX]]
297-5  // CHECK-NEXT: {{^}}[[# %d, UHEX-18]]
29815  // CHECK-NEXT: {{^}}[[# %u, SIGN+45]]
299f   // CHECK-NEXT: {{^}}[[# %x, SIGN+45]]
300F   // CHECK-NEXT: {{^}}[[# %X, SIGN+45]]
301
302; Conflicting implicit format.
303RUN: %ProtectFileCheckOutput \
304RUN: not FileCheck --check-prefixes CHECK,FMT-CONFLICT1 --input-file %s %s 2>&1 \
305RUN:   | FileCheck --strict-whitespace --check-prefix FMT-CONFLICT1-MSG %s
306RUN: %ProtectFileCheckOutput \
307RUN: not FileCheck --check-prefixes CHECK,FMT-CONFLICT2 --input-file %s %s 2>&1 \
308RUN:   | FileCheck --strict-whitespace --check-prefix FMT-CONFLICT2-MSG %s
309
310VAR USE IMPL FMT CONFLICT
31123
312FMT-CONFLICT1-LABEL: VAR USE IMPL FMT CONFLICT
313FMT-CONFLICT1-NEXT: [[#UNSI + LHEX]]
314FMT-CONFLICT1-MSG: numeric-expression.txt:[[#@LINE-1]]:24: error: implicit format conflict between 'UNSI' (%u) and 'LHEX' (%x), need an explicit format specifier
315FMT-CONFLICT1-MSG-NEXT: {{F}}MT-CONFLICT1-NEXT: {{\[\[#UNSI \+ LHEX\]\]}}
316FMT-CONFLICT1-MSG-NEXT: {{^                       \^$}}
317
318VAR USE IMPL FMT CONFLICT COMPLEX
31934
320FMT-CONFLICT2-LABEL: VAR USE IMPL FMT CONFLICT
321FMT-CONFLICT2-NEXT: [[#UNSI + UNSIa + LHEX]]
322FMT-CONFLICT2-MSG: numeric-expression.txt:[[#@LINE-1]]:24: error: implicit format conflict between 'UNSI + UNSIa' (%u) and 'LHEX' (%x), need an explicit format specifier
323FMT-CONFLICT2-MSG-NEXT: {{F}}MT-CONFLICT2-NEXT: {{\[\[#UNSI \+ UNSIa \+ LHEX\]\]}}
324FMT-CONFLICT2-MSG-NEXT: {{^                       \^$}}
325
326; Explicitly specified format can override conflicting implicit formats.
327VAR USE IMPL OVERRIDE FMT CONFLICT  // CHECK-LABEL: VAR USE IMPL OVERRIDE FMT CONFLICT
32823  // CHECK-NEXT: {{^}}[[# %u, UNSI + LHEX]]
329
330; Numeric expressions using more than one variable defined on other lines.
331USE MULTI VAR  // CHECK-LABEL: USE MULTI VAR
33222  // CHECK-NEXT: {{^}}[[#UNSI+UNSIa]]
333
334; Numeric expression using a variable defined from a numeric expression.
335DEF EXPR GOOD MATCH  // CHECK-LABEL: DEF EXPR GOOD MATCH
33642  // CHECK-NEXT: {{^}}[[# VAR42:UNSI+31]]
33741  // CHECK-NEXT: {{^}}[[# VAR42-1]]
338
339; Empty numeric expression.
340EMPTY NUM EXPR  // CHECK-LABEL: EMPTY NUM EXPR
341foo 104 bar  // CHECK-NEXT: {{^}}foo [[#]] bar
342
343; Numeric expressions using parentheses.
344RUN: %ProtectFileCheckOutput \
345RUN: not FileCheck -D#NUMVAR=10 --check-prefix PAREN-OP \
346RUN:               --input-file %s %s 2>&1 \
347RUN:   | FileCheck --strict-whitespace --check-prefix PAREN-OP-MSG %s
348
349PAREN EXPRESSIONS // PAREN-OP-LABEL: PAREN EXPRESSIONS
35011  // PAREN-OP-NEXT: [[#(NUMVAR+2)-1]]
35111  // PAREN-OP-NEXT: [[#NUMVAR+(2-1)]]
35211  // PAREN-OP-NEXT: [[#NUMVAR+(2-1]]
353PAREN-OP-MSG: numeric-expression.txt:[[#@LINE-1]]:36: error: missing ')' at end of nested expression
354PAREN-OP-MSG-NEXT: {{P}}AREN-OP-NEXT: {{\[\[#NUMVAR\+\(2\-1]\]}}
355PAREN-OP-MSG-NEXT: {{^}}                                   ^{{$}}
356
357; Numeric expression using undefined variables.
358RUN: %ProtectFileCheckOutput \
359RUN: not FileCheck --check-prefix UNDEF-USE --input-file %s %s 2>&1 \
360RUN:   | FileCheck --strict-whitespace --check-prefix UNDEF-USE-MSG %s
361
362UNDEF VAR USE
363UNDEFVAR: 11
364UNDEF-USE-LABEL: UNDEF VAR USE
365UNDEF-USE-NEXT: UNDEFVAR: [[#UNDEFVAR1+UNDEFVAR2]]
366UNDEF-USE-MSG: numeric-expression.txt:[[#@LINE-1]]:17: error: {{U}}NDEF-USE-NEXT: expected string not found in input
367UNDEF-USE-MSG-NEXT:      {{U}}NDEF-USE-NEXT: UNDEFVAR: {{\[\[#UNDEFVAR1\+UNDEFVAR2\]\]}}
368UNDEF-USE-MSG-NEXT:     {{^}}                ^{{$}}
369UNDEF-USE-MSG-NEXT:      numeric-expression.txt:[[#@LINE-6]]:1: note: scanning from here
370UNDEF-USE-MSG-NEXT:      UNDEFVAR: 11
371UNDEF-USE-MSG-NEXT: {{^}}^{{$}}
372UNDEF-USE-MSG-NEXT:      numeric-expression.txt:[[#@LINE-9]]:1: note: uses undefined variable(s): "UNDEFVAR1" "UNDEFVAR2"
373UNDEF-USE-MSG-NEXT:      UNDEFVAR: 11
374UNDEF-USE-MSG-NEXT: {{^}}^{{$}}
375
376; Numeric expression with unsupported operator.
377RUN: %ProtectFileCheckOutput \
378RUN: not FileCheck -D#NUMVAR=10 --check-prefix INVAL-OP \
379RUN:               --input-file %s %s 2>&1 \
380RUN:   | FileCheck --strict-whitespace --check-prefix INVAL-OP-MSG %s
381
382INVALID OPERATOR
383NUMVAR*2: 22
384INVAL-OP-LABEL: INVALID OPERATOR
385INVAL-OP-NEXT: NUMVAR*2: [[#NUMVAR*2]]
386INVAL-OP-MSG: numeric-expression.txt:[[#@LINE-1]]:35: error: unsupported operation '*'
387INVAL-OP-MSG-NEXT: {{I}}NVAL-OP-NEXT: NUMVAR*2: {{\[\[#NUMVAR\*2\]\]}}
388INVAL-OP-MSG-NEXT:     {{^}}                                  ^{{$}}
389
390; Name conflict between Numeric variable definition and string variable
391; definition whether from the command-line or input text.
392RUN: %ProtectFileCheckOutput \
393RUN: not FileCheck --check-prefixes CONFLICT,CONFLICT1,CONFLICT2 \
394RUN:               --input-file %s %s 2>&1 \
395RUN:   | FileCheck --strict-whitespace --check-prefix INPUT-STR-CONFLICT %s
396RUN: %ProtectFileCheckOutput \
397RUN: not FileCheck -D#NUMVAR=42 --check-prefixes CONFLICT,CONFLICT2 \
398RUN:               --input-file %s %s 2>&1 \
399RUN:   | FileCheck --strict-whitespace --check-prefix INPUT-STR-CONFLICT %s
400RUN: %ProtectFileCheckOutput \
401RUN: not FileCheck -D#NUMVAR=42 -DNUMVAR=foobar --check-prefix CONFLICT \
402RUN:               --input-file %s %s 2>&1 \
403RUN:   | FileCheck --strict-whitespace --check-prefix CLI-STR-CONFLICT %s
404RUN: %ProtectFileCheckOutput \
405RUN: not FileCheck --check-prefixes CONFLICT,CONFLICT3,CONFLICT4 \
406RUN:               --input-file %s %s 2>&1 \
407RUN:   | FileCheck --strict-whitespace --check-prefix INPUT-NUM-CONFLICT %s
408RUN: %ProtectFileCheckOutput \
409RUN: not FileCheck -DSTRVAR=foobar --check-prefixes CONFLICT,CONFLICT4 \
410RUN:               --input-file %s %s 2>&1 \
411RUN:   | FileCheck --strict-whitespace --check-prefix INPUT-NUM-CONFLICT %s
412RUN: %ProtectFileCheckOutput \
413RUN: not FileCheck -DSTRVAR=foobar -D#STRVAR=42 --check-prefix CONFLICT \
414RUN:               --input-file %s %s 2>&1 \
415RUN:   | FileCheck --strict-whitespace --check-prefix CLI-NUM-CONFLICT %s
416
417STRVAR NUMVAR CONFLICT
418redef1 42
419foobar
420redef2 42
421CONFLICT-LABEL: STRVAR NUMVAR CONFLICT
422CONFLICT1-NEXT: redef1 [[#NUMVAR:]]
423CONFLICT2: [[NUMVAR:foo.*]]
424CONFLICT3: [[STRVAR:foo.*]]
425CONFLICT4: redef2 [[#STRVAR:]]
426INPUT-STR-CONFLICT: numeric-expression.txt:[[#@LINE-3]]:14: error: numeric variable with name 'NUMVAR' already exists
427INPUT-STR-CONFLICT-NEXT: {{C}}ONFLICT2: {{\[\[NUMVAR:foo\.\*\]\]}}
428INPUT-STR-CONFLICT-NEXT:    {{^}}             ^{{$}}
429CLI-STR-CONFLICT: Global defines:2:19: error: numeric variable with name 'NUMVAR' already exists
430CLI-STR-CONFLICT-NEXT:      Global define #2: NUMVAR=foobar
431CLI-STR-CONFLICT-NEXT: {{^}}                  ^{{$}}
432INPUT-NUM-CONFLICT: numeric-expression.txt:[[#@LINE-7]]:22: error: string variable with name 'STRVAR' already exists
433 INPUT-NUM-CONFLICT-NEXT: CONFLICT4: redef2 {{\[\[#STRVAR:\]\]}}
434INPUT-NUM-CONFLICT-NEXT: {{^}}                     ^{{$}}
435CLI-NUM-CONFLICT: Global defines:2:45: error: string variable with name 'STRVAR' already exists
436 CLI-NUM-CONFLICT-NEXT: Global define #2: #STRVAR=42 (parsed as: {{\[\[#STRVAR:42\]\]}})
437CLI-NUM-CONFLICT-NEXT: {{^}}                                            ^{{$}}
438
439; Numeric variable definition with too big value.
440RUN: %ProtectFileCheckOutput \
441RUN: not FileCheck --check-prefix BIGVAL --input-file %s %s 2>&1 \
442RUN:   | FileCheck --strict-whitespace --check-prefix BIGVAL-MSG %s
443
444BIG VALUE
445NUMVAR: 10000000000000000000000
446BIGVAL-LABEL: BIG VALUE
447BIGVAL-NEXT: NUMVAR: [[#NUMVAR:]]
448BIGVAL-MSG: numeric-expression.txt:[[#@LINE-3]]:9: error: unable to represent numeric value
449 BIGVAL-MSG-NEXT: {{N}}UMVAR: 10000000000000000000000
450BIGVAL-MSG-NEXT: {{^}}        ^{{$}}
451
452; Verify that when a variable is set to an expression the expression is still
453; checked.
454RUN: %ProtectFileCheckOutput \
455RUN: not FileCheck --check-prefix DEF-EXPR-FAIL --input-file %s %s 2>&1 \
456RUN:   | FileCheck --strict-whitespace --check-prefix DEF-EXPR-FAIL-MSG %s
457
458DEF EXPR WRONG MATCH
45920
46043
461DEF-EXPR-FAIL-LABEL: DEF EXPR WRONG MATCH
462DEF-EXPR-FAIL-NEXT: [[# VAR20:]]
463DEF-EXPR-FAIL-NEXT: [[# VAR42: VAR20+22]]
464DEF-EXPR-FAIL-MSG: numeric-expression.txt:[[#@LINE-1]]:21: error: {{D}}EF-EXPR-FAIL-NEXT: is not on the line after the previous match
465DEF-EXPR-FAIL-MSG-NEXT: {{D}}EF-EXPR-FAIL-NEXT: {{\[\[# VAR42: VAR20\+22\]\]}}
466DEF-EXPR-FAIL-MSG-NEXT:   {{^}}                    ^{{$}}
467
468; Verify that using a numeric variable defined on the same line (whether from
469; input or from an expression) is rejected.
470RUN: %ProtectFileCheckOutput \
471RUN: not FileCheck --check-prefix SAME-LINE-USE1 --input-file %s %s 2>&1 \
472RUN:   | FileCheck --strict-whitespace --check-prefix SAME-LINE-USE-MSG1 %s
473RUN: %ProtectFileCheckOutput \
474RUN: not FileCheck --check-prefix SAME-LINE-USE2 --input-file %s %s 2>&1 \
475RUN:   | FileCheck --strict-whitespace --check-prefix SAME-LINE-USE-MSG2 %s
476
477SAME LINE USE
4783
4794 5
480SAME-LINE-USE1-LABEL: SAME LINE USE
481SAME-LINE-USE1-NEXT: [[#]]
482SAME-LINE-USE1-NEXT: [[#UNSI:]] [[#UNSI+1]]
483SAME-LINE-USE-MSG1: numeric-expression.txt:[[#@LINE-1]]:36: error: numeric variable 'UNSI' defined earlier in the same CHECK directive
484SAME-LINE-USE-MSG1-NEXT: {{S}}AME-LINE-USE1-NEXT: {{\[\[#UNSI:\]\] \[\[#UNSI\+1\]\]}}
485SAME-LINE-USE-MSG1-NEXT:        {{^}}                                   ^{{$}}
486
487SAME-LINE-USE2-LABEL: SAME LINE USE
488SAME-LINE-USE2-NEXT: [[#UNSI:]]
489SAME-LINE-USE2-NEXT: [[#UNSI2:UNSI+1]] [[#UNSI2+1]]
490SAME-LINE-USE-MSG2: numeric-expression.txt:[[#@LINE-1]]:43: error: numeric variable 'UNSI2' defined earlier in the same CHECK directive
491SAME-LINE-USE-MSG2-NEXT: {{S}}AME-LINE-USE2-NEXT: {{\[\[#UNSI2:UNSI\+1\]\] \[\[#UNSI2\+1\]\]}}
492SAME-LINE-USE-MSG2-NEXT:        {{^}}                                          ^{{$}}
493
494; Invalid change of format in variable redefinition.
495RUN: %ProtectFileCheckOutput \
496RUN: not FileCheck --check-prefix REDEF-NEW-FMT --input-file %s %s 2>&1 \
497RUN:   | FileCheck --strict-whitespace --check-prefix REDEF-NEW-FMT-MSG %s
498
499VAR REDEF FMT CHANGE
50022
501DC
502REDEF-NEW-FMT-LABEL: VAR REDEF FMT CHANGE
503REDEF-NEW-FMT-NEXT: [[#UNSI:]]
504REDEF-NEW-FMT-NEXT: [[#%X,UNSI:]]
505REDEF-NEW-FMT-MSG: numeric-expression.txt:[[#@LINE-1]]:31: error: format different from previous variable definition
506REDEF-NEW-FMT-MSG-NEXT: {{R}}EDEF-NEW-FMT-NEXT: {{\[\[#%X,UNSI:\]\]}}
507REDEF-NEW-FMT-MSG-NEXT:    {{^}}                              ^{{$}}
508
509; Numeric expression with overflow.
510RUN: %ProtectFileCheckOutput \
511RUN: not FileCheck --check-prefix OVERFLOW --input-file %s %s 2>&1 \
512RUN:   | FileCheck --check-prefix OVERFLOW-MSG --strict-whitespace %s
513
514OVERFLOW
515BIGVAR=10000000000000000
516OVERFLOW-LABEL: OVERFLOW
517OVERFLOW-NEXT: BIGVAR: [[#BIGVAR:0x8000000000000000+0x8000000000000000]]
518OVERFLOW-MSG: numeric-expression.txt:[[#@LINE-1]]:27: error: unable to substitute variable or numeric expression
519OVERFLOW-MSG-NEXT: {{O}}VERFLOW-NEXT: BIGVAR: {{\[\[#BIGVAR:0x8000000000000000\+0x8000000000000000\]\]}}
520OVERFLOW-MSG-NEXT:    {{^}}                          ^{{$}}
521
522; Numeric expression with underflow.
523RUN: %ProtectFileCheckOutput \
524RUN: not FileCheck --check-prefix UNDERFLOW --input-file %s %s 2>&1 \
525RUN:   | FileCheck --check-prefix UNDERFLOW-MSG --strict-whitespace %s
526
527UNDERFLOW
528TINYVAR=-10000000000000000
529UNDERFLOW-LABEL: UNDERFLOW
530UNDERFLOW-NEXT: TINYVAR: [[#%d,TINYVAR:-0x8000000000000000-0x8000000000000000]]
531UNDERFLOW-MSG: numeric-expression.txt:[[#@LINE-1]]:29: error: unable to substitute variable or numeric expression
532UNDERFLOW-MSG-NEXT: {{U}}NDERFLOW-NEXT: TINYVAR: {{\[\[#%d,TINYVAR:-0x8000000000000000-0x8000000000000000\]\]}}
533UNDERFLOW-MSG-NEXT:    {{^}}                            ^{{$}}
534
535RUN: %ProtectFileCheckOutput \
536RUN: not FileCheck -D#NUMVAR=10 --check-prefix CALL-MISSING-CLOSING-BRACKET --input-file %s %s 2>&1 \
537RUN:   | FileCheck --strict-whitespace --check-prefix CALL-MISSING-CLOSING-BRACKET-MSG %s
538
539CALL MISSING CLOSING BRACKET
54030
541CALL-MISSING-CLOSING-BRACKET-LABEL: CALL MISSING CLOSING BRACKET
542CALL-MISSING-CLOSING-BRACKET-NEXT: [[#add(NUMVAR,3]]
543CALL-MISSING-CLOSING-BRACKET-MSG: numeric-expression.txt:[[#@LINE-1]]:51: error: missing ')' at end of call expression
544CALL-MISSING-CLOSING-BRACKET-MSG-NEXT: {{C}}ALL-MISSING-CLOSING-BRACKET-NEXT: {{\[\[#add\(NUMVAR,3\]\]}}
545CALL-MISSING-CLOSING-BRACKET-MSG-NEXT:      {{^}}                                                  ^{{$}}
546
547RUN: %ProtectFileCheckOutput \
548RUN: not FileCheck -D#NUMVAR=10 --check-prefix CALL-MISSING-ARGUMENT --input-file %s %s 2>&1 \
549RUN:   | FileCheck --strict-whitespace --check-prefix CALL-MISSING-ARGUMENT-MSG %s
550
551CALL MISSING ARGUMENT
55230
553CALL-MISSING-ARGUMENT-LABEL: CALL MISSING ARGUMENT
554CALL-MISSING-ARGUMENT-NEXT: [[#add(NUMVAR,)]]
555CALL-MISSING-ARGUMENT-MSG: numeric-expression.txt:[[#@LINE-1]]:43: error: missing argument
556CALL-MISSING-ARGUMENT-MSG-NEXT: {{C}}ALL-MISSING-ARGUMENT-NEXT: {{\[\[#add\(NUMVAR,\)\]\]}}
557CALL-MISSING-ARGUMENT-MSG-NEXT:      {{^}}                                          ^{{$}}
558
559RUN: %ProtectFileCheckOutput \
560RUN: not FileCheck -D#NUMVAR=10 --check-prefix CALL-WRONG-ARGUMENT-COUNT --input-file %s %s 2>&1 \
561RUN:   | FileCheck --strict-whitespace --check-prefix CALL-WRONG-ARGUMENT-COUNT-MSG %s
562
563CALL WRONG ARGUMENT COUNT
56430
565CALL-WRONG-ARGUMENT-COUNT-LABEL: CALL WRONG ARGUMENT COUNT
566CALL-WRONG-ARGUMENT-COUNT-NEXT: [[#add(NUMVAR)]]
567CALL-WRONG-ARGUMENT-COUNT-MSG: numeric-expression.txt:[[#@LINE-1]]:36: error: function 'add' takes 2 arguments but 1 given
568CALL-WRONG-ARGUMENT-COUNT-MSG-NEXT: {{C}}ALL-WRONG-ARGUMENT-COUNT-NEXT: {{\[\[#add\(NUMVAR\)\]\]}}
569CALL-WRONG-ARGUMENT-COUNT-MSG-NEXT:    {{^}}                                   ^{{$}}
570
571RUN: %ProtectFileCheckOutput \
572RUN: not FileCheck -D#NUMVAR=10 --check-prefix CALL-UNDEFINED-FUNCTION --input-file %s %s 2>&1 \
573RUN:   | FileCheck --strict-whitespace --check-prefix CALL-UNDEFINED-FUNCTION-MSG %s
574
575CALL UNDEFINED FUNCTION
57630
577CALL-UNDEFINED-FUNCTION-LABEL: CALL UNDEFINED FUNCTION
578CALL-UNDEFINED-FUNCTION-NEXT: [[#bogus_function(NUMVAR)]]
579CALL-UNDEFINED-FUNCTION-MSG: numeric-expression.txt:[[#@LINE-1]]:34: error: call to undefined function 'bogus_function'
580CALL-UNDEFINED-FUNCTION-MSG-NEXT: {{C}}ALL-UNDEFINED-FUNCTION-NEXT: {{\[\[#bogus_function\(NUMVAR\)\]\]}}
581CALL-UNDEFINED-FUNCTION-MSG-NEXT:    {{^}}                                 ^{{$}}
582