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 expressions in explicit matching format and default matching rule using
53; variables defined on other lines without spaces.
54USE EXPL FMT IMPL MATCH  // CHECK-LABEL: USE EXPL FMT IMPL MATCH
5511  // CHECK-NEXT: {{^}}[[#%u,UNSI]]
5612  // CHECK-NEXT: {{^}}[[#%u,UNSI+1]]
5710  // CHECK-NEXT: {{^}}[[#%u,UNSI-1]]
5815  // CHECK-NEXT: {{^}}[[#%u,add(UNSI,4)]]
5911  // CHECK-NEXT: {{^}}[[#%u,max(UNSI,7)]]
6099  // CHECK-NEXT: {{^}}[[#%u,max(UNSI,99)]]
617   // CHECK-NEXT: {{^}}[[#%u,min(UNSI,7)]]
6211  // CHECK-NEXT: {{^}}[[#%u,min(UNSI,99)]]
638   // CHECK-NEXT: {{^}}[[#%u,sub(UNSI,3)]]
64c   // CHECK-NEXT: {{^}}[[#%x,LHEX]]
65d   // CHECK-NEXT: {{^}}[[#%x,LHEX+1]]
66b   // CHECK-NEXT: {{^}}[[#%x,LHEX-1]]
671a  // CHECK-NEXT: {{^}}[[#%x,LHEX+0xe]]
681a  // CHECK-NEXT: {{^}}[[#%x,LHEX+0xE]]
69e   // CHECK-NEXT: {{^}}[[#%x,add(LHEX,2)]]
70ff  // CHECK-NEXT: {{^}}[[#%x,max(LHEX,0xff)]]
71a   // CHECK-NEXT: {{^}}[[#%x,min(LHEX,0xa)]]
72a   // CHECK-NEXT: {{^}}[[#%x,sub(LHEX,2)]]
73D   // CHECK-NEXT: {{^}}[[#%X,UHEX]]
74E   // CHECK-NEXT: {{^}}[[#%X,UHEX+1]]
75C   // CHECK-NEXT: {{^}}[[#%X,UHEX-1]]
761B  // CHECK-NEXT: {{^}}[[#%X,UHEX+0xe]]
771B  // CHECK-NEXT: {{^}}[[#%X,UHEX+0xE]]
78F   // CHECK-NEXT: {{^}}[[#%X,add(UHEX,2)]]
79FF  // CHECK-NEXT: {{^}}[[#%X,max(UHEX,0xff)]]
80A   // CHECK-NEXT: {{^}}[[#%X,min(UHEX,0xa)]]
81B   // CHECK-NEXT: {{^}}[[#%X,sub(UHEX,2)]]
82-30 // CHECK-NEXT: {{^}}[[#%d,SIGN]]
83-29 // CHECK-NEXT: {{^}}[[#%d,SIGN+1]]
84-31 // CHECK-NEXT: {{^}}[[#%d,SIGN-1]]
8542  // CHECK-NEXT: {{^}}[[#%d,SIGN+72]]
86-29 // CHECK-NEXT: {{^}}[[#%d,add(SIGN,1)]]
87-17 // CHECK-NEXT: {{^}}[[#%d,max(SIGN,-17)]]
88-30 // CHECK-NEXT: {{^}}[[#%d,min(SIGN,-17)]]
89-31 // CHECK-NEXT: {{^}}[[#%d,sub(SIGN,1)]]
9011  // CHECK-NEXT: {{^}}[[#%u,UNSIa]]
9111  // CHECK-NEXT: {{^}}[[#%u,UNSIb]]
9211  // CHECK-NEXT: {{^}}[[#%u,UNSIc]]
93c   // CHECK-NEXT: {{^}}[[#%x,LHEXa]]
94
95; Numeric expressions in explicit matching format and default matching rule using
96; variables defined on other lines with different spacing.
97USE EXPL FMT IMPL MATCH SPC  // CHECK-LABEL: USE EXPL FMT IMPL MATCH SPC
9811  // CHECK-NEXT: {{^}}[[#%u, UNSI]]
9911  // CHECK-NEXT: {{^}}[[# %u, UNSI]]
10011  // CHECK-NEXT: {{^}}[[# %u, UNSI ]]
10112  // CHECK-NEXT: {{^}}[[#%u, UNSI+1]]
10212  // CHECK-NEXT: {{^}}[[# %u, UNSI+1]]
10312  // CHECK-NEXT: {{^}}[[# %u , UNSI+1]]
10412  // CHECK-NEXT: {{^}}[[# %u , UNSI +1]]
10512  // CHECK-NEXT: {{^}}[[# %u , UNSI + 1]]
10612  // CHECK-NEXT: {{^}}[[# %u , UNSI + 1 ]]
10710  // CHECK-NEXT: {{^}}[[#%u, UNSI-1]]
10810  // CHECK-NEXT: {{^}}[[# %u, UNSI-1]]
10910  // CHECK-NEXT: {{^}}[[# %u , UNSI-1]]
11010  // CHECK-NEXT: {{^}}[[# %u , UNSI -1]]
11110  // CHECK-NEXT: {{^}}[[# %u , UNSI - 1]]
11210  // CHECK-NEXT: {{^}}[[# %u , UNSI - 1 ]]
11313  // CHECK-NEXT: {{^}}[[#%u, add(UNSI,2)]]
11413  // CHECK-NEXT: {{^}}[[# %u, add(UNSI,2)]]
11513  // CHECK-NEXT: {{^}}[[# %u , add(UNSI,2)]]
11613  // CHECK-NEXT: {{^}}[[# %u , add(UNSI, 2)]]
11713  // CHECK-NEXT: {{^}}[[# %u , add( UNSI, 2)]]
11813  // CHECK-NEXT: {{^}}[[# %u , add( UNSI,2)]]
11913  // CHECK-NEXT: {{^}}[[# %u , add(UNSI,2) ]]
12013  // CHECK-NEXT: {{^}}[[# %u , add (UNSI,2)]]
121104 // CHECK-NEXT: {{^}}[[# %u , UNSI + sub( add (100 , UNSI+ 1 ), 20) +1 ]]
122
123; Numeric expressions in implicit matching format and default matching rule using
124; variables defined on other lines.
125USE IMPL FMT IMPL MATCH  // CHECK-LABEL: USE IMPL FMT IMPL MATCH
12611  // CHECK-NEXT: {{^}}[[#UNSI]]
12712  // CHECK-NEXT: {{^}}[[#UNSI+1]]
12810  // CHECK-NEXT: {{^}}[[#UNSI-1]]
12999  // CHECK-NEXT: {{^}}[[#max(UNSI,99)]]
1307   // CHECK-NEXT: {{^}}[[#min(UNSI,7)]]
131c   // CHECK-NEXT: {{^}}[[#LHEX]]
132d   // CHECK-NEXT: {{^}}[[#LHEX+1]]
133b   // CHECK-NEXT: {{^}}[[#LHEX-1]]
1341a  // CHECK-NEXT: {{^}}[[#LHEX+0xe]]
1351a  // CHECK-NEXT: {{^}}[[#LHEX+0xE]]
136ff  // CHECK-NEXT: {{^}}[[#max(LHEX,255)]]
137a   // CHECK-NEXT: {{^}}[[#min(LHEX,10)]]
138D   // CHECK-NEXT: {{^}}[[#UHEX]]
139E   // CHECK-NEXT: {{^}}[[#UHEX+1]]
140C   // CHECK-NEXT: {{^}}[[#UHEX-1]]
1411B  // CHECK-NEXT: {{^}}[[#UHEX+0xe]]
1421B  // CHECK-NEXT: {{^}}[[#UHEX+0xE]]
143FF  // CHECK-NEXT: {{^}}[[#max(UHEX,255)]]
144A   // CHECK-NEXT: {{^}}[[#min(UHEX,10)]]
145-30 // CHECK-NEXT: {{^}}[[#SIGN]]
146-29 // CHECK-NEXT: {{^}}[[#SIGN+1]]
147-31 // CHECK-NEXT: {{^}}[[#SIGN-1]]
148
149; Numeric expressions using variables defined on other lines and an immediate
150; interpreted as an unsigned value.
151; Note: 9223372036854775819 = 0x8000000000000000 + 11
152USE IMPL FMT IMPL MATCH UNSIGNED IMM
1539223372036854775819
154CHECK-LABEL: USE IMPL FMT IMPL MATCH UNSIGNED IMM
155CHECK-NEXT: [[#UNSI+0x8000000000000000]]
156
157; Numeric expressions in default matching format and explicit matching rule using
158; variables defined on other lines.
159USE DEF FMT EXPL MATCH  // CHECK-LABEL: USE DEF FMT EXPL MATCH
16011  // CHECK-NEXT: {{^}}[[#==UNSI]]
16111  // CHECK-NEXT: {{^}}[[# == UNSI]]
16212  // CHECK-NEXT: {{^}}[[#UNSI2: == UNSI + 1]]
16312  // CHECK-NEXT: {{^}}[[#==UNSI2]]
164
165; Numeric expressions in default matching format and explicit matching rule using
166; variable defined on other lines with match failure.
167RUN: %ProtectFileCheckOutput \
168RUN: not FileCheck --check-prefix NUMEXPR-CONSTRAINT-NOMATCH --input-file %s %s 2>&1 \
169RUN:   | FileCheck --check-prefix NUMEXPR-CONSTRAINT-NOMATCH-MSG --strict-whitespace %s
170
171USE DEF FMT EXPL NO MATCH
17212
173NUMEXPR-CONSTRAINT-NOMATCH-LABEL: USE DEF FMT EXPL NO MATCH
174NUMEXPR-CONSTRAINT-NOMATCH-NEXT: [[#==UNSI]]
175NUMEXPR-CONSTRAINT-NOMATCH-MSG: numeric-expression.txt:[[#@LINE-1]]:34: error: {{N}}UMEXPR-CONSTRAINT-NOMATCH-NEXT: expected string not found in input
176NUMEXPR-CONSTRAINT-NOMATCH-MSG-NEXT: {{N}}UMEXPR-CONSTRAINT-NOMATCH-NEXT: {{\[\[#==UNSI\]\]}}
177NUMEXPR-CONSTRAINT-NOMATCH-MSG-NEXT:   {{^}}                                 ^{{$}}
178
179; Empty numeric expression with matching constraint.
180RUN: %ProtectFileCheckOutput \
181RUN: not FileCheck --check-prefix EMPTY-NUMEXPR-CONSTRAINT --input-file %s %s 2>&1 \
182RUN:   | FileCheck --check-prefix EMPTY-NUMEXPR-CONSTRAINT-MSG --strict-whitespace %s
183
184EMPTY NUMEXPR USE WITH CONSTRAINT
18518
186EMPTY-NUMEXPR-CONSTRAINT-LABEL: EMPTY NUMEXPR USE WITH CONSTRAINT
187EMPTY-NUMEXPR-CONSTRAINT-NEXT: [[# ==]]
188EMPTY-NUMEXPR-CONSTRAINT-MSG: numeric-expression.txt:[[#@LINE-1]]:38: error: empty numeric expression should not have a constraint
189EMPTY-NUMEXPR-CONSTRAINT-MSG-NEXT: {{E}}MPTY-NUMEXPR-CONSTRAINT-NEXT: {{\[\[# ==\]\]}}
190EMPTY-NUMEXPR-CONSTRAINT-MSG-NEXT:     {{^}}                                     ^{{$}}
191
192; Definition from empty numeric expression with matching constraint.
193RUN: %ProtectFileCheckOutput \
194RUN: not FileCheck --check-prefix EMPTY-NUMDEF-CONSTRAINT --input-file %s %s 2>&1 \
195RUN:   | FileCheck --check-prefix EMPTY-NUMDEF-CONSTRAINT-MSG %s
196
197EMPTY NUMEXPR DEF WITH CONSTRAINT
19818
199EMPTY-NUMDEF-CONSTRAINT-LABEL: EMPTY NUMEXPR CONSTRAINT
200EMPTY-NUMDEF-CONSTRAINT-NEXT: [[#VARDEF: ==]]
201EMPTY-NUMDEF-CONSTRAINT-MSG: numeric-expression.txt:[[#@LINE-1]]:44: error: empty numeric expression should not have a constraint
202EMPTY-NUMDEF-CONSTRAINT-MSG-NEXT: {{E}}MPTY-NUMDEF-CONSTRAINT-NEXT: {{\[\[#VARDEF: ==\]\]}}
203EMPTY-NUMDEF-CONSTRAINT-MSG-NEXT:     {{^}}                                           ^{{$}}
204
205; Numeric expressions with matching format overriding the implicit format of
206; variables defined on other lines.
207USE CONV FMT IMPL MATCH  // CHECK-LABEL: USE CONV FMT IMPL MATCH
208b   // CHECK-NEXT: {{^}}[[# %x, UNSI]]
209B   // CHECK-NEXT: {{^}}[[# %X, UNSI]]
210-1  // CHECK-NEXT: {{^}}[[# %d, UNSI-12]]
21112  // CHECK-NEXT: {{^}}[[# %u, LHEX]]
212C   // CHECK-NEXT: {{^}}[[# %X, LHEX]]
213-2  // CHECK-NEXT: {{^}}[[# %d, LHEX-14]]
21413  // CHECK-NEXT: {{^}}[[# %u, UHEX]]
215d   // CHECK-NEXT: {{^}}[[# %x, UHEX]]
216-5  // CHECK-NEXT: {{^}}[[# %d, UHEX-18]]
21715  // CHECK-NEXT: {{^}}[[# %u, SIGN+45]]
218f   // CHECK-NEXT: {{^}}[[# %x, SIGN+45]]
219F   // CHECK-NEXT: {{^}}[[# %X, SIGN+45]]
220
221; Conflicting implicit format.
222RUN: %ProtectFileCheckOutput \
223RUN: not FileCheck --check-prefixes CHECK,FMT-CONFLICT1 --input-file %s %s 2>&1 \
224RUN:   | FileCheck --strict-whitespace --check-prefix FMT-CONFLICT1-MSG %s
225RUN: %ProtectFileCheckOutput \
226RUN: not FileCheck --check-prefixes CHECK,FMT-CONFLICT2 --input-file %s %s 2>&1 \
227RUN:   | FileCheck --strict-whitespace --check-prefix FMT-CONFLICT2-MSG %s
228
229VAR USE IMPL FMT CONFLICT
23023
231FMT-CONFLICT1-LABEL: VAR USE IMPL FMT CONFLICT
232FMT-CONFLICT1-NEXT: [[#UNSI + LHEX]]
233FMT-CONFLICT1-MSG: numeric-expression.txt:[[#@LINE-1]]:24: error: implicit format conflict between 'UNSI' (%u) and 'LHEX' (%x), need an explicit format specifier
234FMT-CONFLICT1-MSG-NEXT: {{F}}MT-CONFLICT1-NEXT: {{\[\[#UNSI \+ LHEX\]\]}}
235FMT-CONFLICT1-MSG-NEXT: {{^                       \^$}}
236
237VAR USE IMPL FMT CONFLICT COMPLEX
23834
239FMT-CONFLICT2-LABEL: VAR USE IMPL FMT CONFLICT
240FMT-CONFLICT2-NEXT: [[#UNSI + UNSIa + LHEX]]
241FMT-CONFLICT2-MSG: numeric-expression.txt:[[#@LINE-1]]:24: error: implicit format conflict between 'UNSI + UNSIa' (%u) and 'LHEX' (%x), need an explicit format specifier
242FMT-CONFLICT2-MSG-NEXT: {{F}}MT-CONFLICT2-NEXT: {{\[\[#UNSI \+ UNSIa \+ LHEX\]\]}}
243FMT-CONFLICT2-MSG-NEXT: {{^                       \^$}}
244
245; Explicitly specified format can override conflicting implicit formats.
246VAR USE IMPL OVERRIDE FMT CONFLICT  // CHECK-LABEL: VAR USE IMPL OVERRIDE FMT CONFLICT
24723  // CHECK-NEXT: {{^}}[[# %u, UNSI + LHEX]]
248
249; Numeric expressions using more than one variable defined on other lines.
250USE MULTI VAR  // CHECK-LABEL: USE MULTI VAR
25122  // CHECK-NEXT: {{^}}[[#UNSI+UNSIa]]
252
253; Numeric expression using a variable defined from a numeric expression.
254DEF EXPR GOOD MATCH  // CHECK-LABEL: DEF EXPR GOOD MATCH
25542  // CHECK-NEXT: {{^}}[[# VAR42:UNSI+31]]
25641  // CHECK-NEXT: {{^}}[[# VAR42-1]]
257
258; Empty numeric expression.
259EMPTY NUM EXPR  // CHECK-LABEL: EMPTY NUM EXPR
260foo 104 bar  // CHECK-NEXT: {{^}}foo [[#]] bar
261
262; Numeric expressions using parentheses.
263RUN: %ProtectFileCheckOutput \
264RUN: not FileCheck -D#NUMVAR=10 --check-prefix PAREN-OP \
265RUN:               --input-file %s %s 2>&1 \
266RUN:   | FileCheck --strict-whitespace --check-prefix PAREN-OP-MSG %s
267
268PAREN EXPRESSIONS // PAREN-OP-LABEL: PAREN EXPRESSIONS
26911  // PAREN-OP-NEXT: [[#(NUMVAR+2)-1]]
27011  // PAREN-OP-NEXT: [[#NUMVAR+(2-1)]]
27111  // PAREN-OP-NEXT: [[#NUMVAR+(2-1]]
272PAREN-OP-MSG: numeric-expression.txt:[[#@LINE-1]]:36: error: missing ')' at end of nested expression
273PAREN-OP-MSG-NEXT: {{P}}AREN-OP-NEXT: {{\[\[#NUMVAR\+\(2\-1]\]}}
274PAREN-OP-MSG-NEXT: {{^}}                                   ^{{$}}
275
276; Numeric expression using undefined variables.
277RUN: %ProtectFileCheckOutput \
278RUN: not FileCheck --check-prefix UNDEF-USE --input-file %s %s 2>&1 \
279RUN:   | FileCheck --strict-whitespace --check-prefix UNDEF-USE-MSG %s
280
281UNDEF VAR USE
282UNDEFVAR: 11
283UNDEF-USE-LABEL: UNDEF VAR USE
284UNDEF-USE-NEXT: UNDEFVAR: [[#UNDEFVAR1+UNDEFVAR2]]
285UNDEF-USE-MSG: numeric-expression.txt:[[#@LINE-1]]:17: error: {{U}}NDEF-USE-NEXT: expected string not found in input
286UNDEF-USE-MSG-NEXT:      {{U}}NDEF-USE-NEXT: UNDEFVAR: {{\[\[#UNDEFVAR1\+UNDEFVAR2\]\]}}
287UNDEF-USE-MSG-NEXT:     {{^}}                ^{{$}}
288UNDEF-USE-MSG-NEXT:      numeric-expression.txt:[[#@LINE-6]]:1: note: scanning from here
289UNDEF-USE-MSG-NEXT:      UNDEFVAR: 11
290UNDEF-USE-MSG-NEXT: {{^}}^{{$}}
291UNDEF-USE-MSG-NEXT:      numeric-expression.txt:[[#@LINE-9]]:1: note: uses undefined variable(s): "UNDEFVAR1" "UNDEFVAR2"
292UNDEF-USE-MSG-NEXT:      UNDEFVAR: 11
293UNDEF-USE-MSG-NEXT: {{^}}^{{$}}
294
295; Numeric expression with unsupported operator.
296RUN: %ProtectFileCheckOutput \
297RUN: not FileCheck -D#NUMVAR=10 --check-prefix INVAL-OP \
298RUN:               --input-file %s %s 2>&1 \
299RUN:   | FileCheck --strict-whitespace --check-prefix INVAL-OP-MSG %s
300
301INVALID OPERATOR
302NUMVAR*2: 22
303INVAL-OP-LABEL: INVALID OPERATOR
304INVAL-OP-NEXT: NUMVAR*2: [[#NUMVAR*2]]
305INVAL-OP-MSG: numeric-expression.txt:[[#@LINE-1]]:35: error: unsupported operation '*'
306INVAL-OP-MSG-NEXT: {{I}}NVAL-OP-NEXT: NUMVAR*2: {{\[\[#NUMVAR\*2\]\]}}
307INVAL-OP-MSG-NEXT:     {{^}}                                  ^{{$}}
308
309; Name conflict between Numeric variable definition and string variable
310; definition whether from the command-line or input text.
311RUN: %ProtectFileCheckOutput \
312RUN: not FileCheck --check-prefixes CONFLICT,CONFLICT1,CONFLICT2 \
313RUN:               --input-file %s %s 2>&1 \
314RUN:   | FileCheck --strict-whitespace --check-prefix INPUT-STR-CONFLICT %s
315RUN: %ProtectFileCheckOutput \
316RUN: not FileCheck -D#NUMVAR=42 --check-prefixes CONFLICT,CONFLICT2 \
317RUN:               --input-file %s %s 2>&1 \
318RUN:   | FileCheck --strict-whitespace --check-prefix INPUT-STR-CONFLICT %s
319RUN: %ProtectFileCheckOutput \
320RUN: not FileCheck -D#NUMVAR=42 -DNUMVAR=foobar --check-prefix CONFLICT \
321RUN:               --input-file %s %s 2>&1 \
322RUN:   | FileCheck --strict-whitespace --check-prefix CLI-STR-CONFLICT %s
323RUN: %ProtectFileCheckOutput \
324RUN: not FileCheck --check-prefixes CONFLICT,CONFLICT3,CONFLICT4 \
325RUN:               --input-file %s %s 2>&1 \
326RUN:   | FileCheck --strict-whitespace --check-prefix INPUT-NUM-CONFLICT %s
327RUN: %ProtectFileCheckOutput \
328RUN: not FileCheck -DSTRVAR=foobar --check-prefixes CONFLICT,CONFLICT4 \
329RUN:               --input-file %s %s 2>&1 \
330RUN:   | FileCheck --strict-whitespace --check-prefix INPUT-NUM-CONFLICT %s
331RUN: %ProtectFileCheckOutput \
332RUN: not FileCheck -DSTRVAR=foobar -D#STRVAR=42 --check-prefix CONFLICT \
333RUN:               --input-file %s %s 2>&1 \
334RUN:   | FileCheck --strict-whitespace --check-prefix CLI-NUM-CONFLICT %s
335
336STRVAR NUMVAR CONFLICT
337redef1 42
338foobar
339redef2 42
340CONFLICT-LABEL: STRVAR NUMVAR CONFLICT
341CONFLICT1-NEXT: redef1 [[#NUMVAR:]]
342CONFLICT2: [[NUMVAR:foo.*]]
343CONFLICT3: [[STRVAR:foo.*]]
344CONFLICT4: redef2 [[#STRVAR:]]
345INPUT-STR-CONFLICT: numeric-expression.txt:[[#@LINE-3]]:14: error: numeric variable with name 'NUMVAR' already exists
346INPUT-STR-CONFLICT-NEXT: {{C}}ONFLICT2: {{\[\[NUMVAR:foo\.\*\]\]}}
347INPUT-STR-CONFLICT-NEXT:    {{^}}             ^{{$}}
348CLI-STR-CONFLICT: Global defines:2:19: error: numeric variable with name 'NUMVAR' already exists
349CLI-STR-CONFLICT-NEXT:      Global define #2: NUMVAR=foobar
350CLI-STR-CONFLICT-NEXT: {{^}}                  ^{{$}}
351INPUT-NUM-CONFLICT: numeric-expression.txt:[[#@LINE-7]]:22: error: string variable with name 'STRVAR' already exists
352 INPUT-NUM-CONFLICT-NEXT: CONFLICT4: redef2 {{\[\[#STRVAR:\]\]}}
353INPUT-NUM-CONFLICT-NEXT: {{^}}                     ^{{$}}
354CLI-NUM-CONFLICT: Global defines:2:45: error: string variable with name 'STRVAR' already exists
355 CLI-NUM-CONFLICT-NEXT: Global define #2: #STRVAR=42 (parsed as: {{\[\[#STRVAR:42\]\]}})
356CLI-NUM-CONFLICT-NEXT: {{^}}                                            ^{{$}}
357
358; Numeric variable definition with too big value.
359RUN: %ProtectFileCheckOutput \
360RUN: not FileCheck --check-prefix BIGVAL --input-file %s %s 2>&1 \
361RUN:   | FileCheck --strict-whitespace --check-prefix BIGVAL-MSG %s
362
363BIG VALUE
364NUMVAR: 10000000000000000000000
365BIGVAL-LABEL: BIG VALUE
366BIGVAL-NEXT: NUMVAR: [[#NUMVAR:]]
367BIGVAL-MSG: numeric-expression.txt:[[#@LINE-3]]:9: error: unable to represent numeric value
368 BIGVAL-MSG-NEXT: {{N}}UMVAR: 10000000000000000000000
369BIGVAL-MSG-NEXT: {{^}}        ^{{$}}
370
371; Verify that when a variable is set to an expression the expression is still
372; checked.
373RUN: %ProtectFileCheckOutput \
374RUN: not FileCheck --check-prefix DEF-EXPR-FAIL --input-file %s %s 2>&1 \
375RUN:   | FileCheck --strict-whitespace --check-prefix DEF-EXPR-FAIL-MSG %s
376
377DEF EXPR WRONG MATCH
37820
37943
380DEF-EXPR-FAIL-LABEL: DEF EXPR WRONG MATCH
381DEF-EXPR-FAIL-NEXT: [[# VAR20:]]
382DEF-EXPR-FAIL-NEXT: [[# VAR42: VAR20+22]]
383DEF-EXPR-FAIL-MSG: numeric-expression.txt:[[#@LINE-1]]:21: error: {{D}}EF-EXPR-FAIL-NEXT: is not on the line after the previous match
384DEF-EXPR-FAIL-MSG-NEXT: {{D}}EF-EXPR-FAIL-NEXT: {{\[\[# VAR42: VAR20\+22\]\]}}
385DEF-EXPR-FAIL-MSG-NEXT:   {{^}}                    ^{{$}}
386
387; Verify that using a numeric variable defined on the same line (whether from
388; input or from an expression) is rejected.
389RUN: %ProtectFileCheckOutput \
390RUN: not FileCheck --check-prefix SAME-LINE-USE1 --input-file %s %s 2>&1 \
391RUN:   | FileCheck --strict-whitespace --check-prefix SAME-LINE-USE-MSG1 %s
392RUN: %ProtectFileCheckOutput \
393RUN: not FileCheck --check-prefix SAME-LINE-USE2 --input-file %s %s 2>&1 \
394RUN:   | FileCheck --strict-whitespace --check-prefix SAME-LINE-USE-MSG2 %s
395
396SAME LINE USE
3973
3984 5
399SAME-LINE-USE1-LABEL: SAME LINE USE
400SAME-LINE-USE1-NEXT: [[#]]
401SAME-LINE-USE1-NEXT: [[#UNSI:]] [[#UNSI+1]]
402SAME-LINE-USE-MSG1: numeric-expression.txt:[[#@LINE-1]]:36: error: numeric variable 'UNSI' defined earlier in the same CHECK directive
403SAME-LINE-USE-MSG1-NEXT: {{S}}AME-LINE-USE1-NEXT: {{\[\[#UNSI:\]\] \[\[#UNSI\+1\]\]}}
404SAME-LINE-USE-MSG1-NEXT:        {{^}}                                   ^{{$}}
405
406SAME-LINE-USE2-LABEL: SAME LINE USE
407SAME-LINE-USE2-NEXT: [[#UNSI:]]
408SAME-LINE-USE2-NEXT: [[#UNSI2:UNSI+1]] [[#UNSI2+1]]
409SAME-LINE-USE-MSG2: numeric-expression.txt:[[#@LINE-1]]:43: error: numeric variable 'UNSI2' defined earlier in the same CHECK directive
410SAME-LINE-USE-MSG2-NEXT: {{S}}AME-LINE-USE2-NEXT: {{\[\[#UNSI2:UNSI\+1\]\] \[\[#UNSI2\+1\]\]}}
411SAME-LINE-USE-MSG2-NEXT:        {{^}}                                          ^{{$}}
412
413; Invalid change of format in variable redefinition.
414RUN: %ProtectFileCheckOutput \
415RUN: not FileCheck --check-prefix REDEF-NEW-FMT --input-file %s %s 2>&1 \
416RUN:   | FileCheck --strict-whitespace --check-prefix REDEF-NEW-FMT-MSG %s
417
418VAR REDEF FMT CHANGE
41922
420DC
421REDEF-NEW-FMT-LABEL: VAR REDEF FMT CHANGE
422REDEF-NEW-FMT-NEXT: [[#UNSI:]]
423REDEF-NEW-FMT-NEXT: [[#%X,UNSI:]]
424REDEF-NEW-FMT-MSG: numeric-expression.txt:[[#@LINE-1]]:31: error: format different from previous variable definition
425REDEF-NEW-FMT-MSG-NEXT: {{R}}EDEF-NEW-FMT-NEXT: {{\[\[#%X,UNSI:\]\]}}
426REDEF-NEW-FMT-MSG-NEXT:    {{^}}                              ^{{$}}
427
428; Numeric expression with overflow.
429RUN: %ProtectFileCheckOutput \
430RUN: not FileCheck --check-prefix OVERFLOW --input-file %s %s 2>&1 \
431RUN:   | FileCheck --check-prefix OVERFLOW-MSG --strict-whitespace %s
432
433OVERFLOW
434BIGVAR=10000000000000000
435OVERFLOW-LABEL: OVERFLOW
436OVERFLOW-NEXT: BIGVAR: [[#BIGVAR:0x8000000000000000+0x8000000000000000]]
437OVERFLOW-MSG: numeric-expression.txt:[[#@LINE-1]]:27: error: unable to substitute variable or numeric expression
438OVERFLOW-MSG-NEXT: {{O}}VERFLOW-NEXT: BIGVAR: {{\[\[#BIGVAR:0x8000000000000000\+0x8000000000000000\]\]}}
439OVERFLOW-MSG-NEXT:    {{^}}                          ^{{$}}
440
441; Numeric expression with underflow.
442RUN: %ProtectFileCheckOutput \
443RUN: not FileCheck --check-prefix UNDERFLOW --input-file %s %s 2>&1 \
444RUN:   | FileCheck --check-prefix UNDERFLOW-MSG --strict-whitespace %s
445
446UNDERFLOW
447TINYVAR=-10000000000000000
448UNDERFLOW-LABEL: UNDERFLOW
449UNDERFLOW-NEXT: TINYVAR: [[#%d,TINYVAR:-0x8000000000000000-0x8000000000000000]]
450UNDERFLOW-MSG: numeric-expression.txt:[[#@LINE-1]]:29: error: unable to substitute variable or numeric expression
451UNDERFLOW-MSG-NEXT: {{U}}NDERFLOW-NEXT: TINYVAR: {{\[\[#%d,TINYVAR:-0x8000000000000000-0x8000000000000000\]\]}}
452UNDERFLOW-MSG-NEXT:    {{^}}                            ^{{$}}
453
454RUN: %ProtectFileCheckOutput \
455RUN: not FileCheck -D#NUMVAR=10 --check-prefix CALL-MISSING-CLOSING-BRACKET --input-file %s %s 2>&1 \
456RUN:   | FileCheck --strict-whitespace --check-prefix CALL-MISSING-CLOSING-BRACKET-MSG %s
457
458CALL MISSING CLOSING BRACKET
45930
460CALL-MISSING-CLOSING-BRACKET-LABEL: CALL MISSING CLOSING BRACKET
461CALL-MISSING-CLOSING-BRACKET-NEXT: [[#add(NUMVAR,3]]
462CALL-MISSING-CLOSING-BRACKET-MSG: numeric-expression.txt:[[#@LINE-1]]:51: error: missing ')' at end of call expression
463CALL-MISSING-CLOSING-BRACKET-MSG-NEXT: {{C}}ALL-MISSING-CLOSING-BRACKET-NEXT: {{\[\[#add\(NUMVAR,3\]\]}}
464CALL-MISSING-CLOSING-BRACKET-MSG-NEXT:      {{^}}                                                  ^{{$}}
465
466RUN: %ProtectFileCheckOutput \
467RUN: not FileCheck -D#NUMVAR=10 --check-prefix CALL-MISSING-ARGUMENT --input-file %s %s 2>&1 \
468RUN:   | FileCheck --strict-whitespace --check-prefix CALL-MISSING-ARGUMENT-MSG %s
469
470CALL MISSING ARGUMENT
47130
472CALL-MISSING-ARGUMENT-LABEL: CALL MISSING ARGUMENT
473CALL-MISSING-ARGUMENT-NEXT: [[#add(NUMVAR,)]]
474CALL-MISSING-ARGUMENT-MSG: numeric-expression.txt:[[#@LINE-1]]:43: error: missing argument
475CALL-MISSING-ARGUMENT-MSG-NEXT: {{C}}ALL-MISSING-ARGUMENT-NEXT: {{\[\[#add\(NUMVAR,\)\]\]}}
476CALL-MISSING-ARGUMENT-MSG-NEXT:      {{^}}                                          ^{{$}}
477
478RUN: %ProtectFileCheckOutput \
479RUN: not FileCheck -D#NUMVAR=10 --check-prefix CALL-WRONG-ARGUMENT-COUNT --input-file %s %s 2>&1 \
480RUN:   | FileCheck --strict-whitespace --check-prefix CALL-WRONG-ARGUMENT-COUNT-MSG %s
481
482CALL WRONG ARGUMENT COUNT
48330
484CALL-WRONG-ARGUMENT-COUNT-LABEL: CALL WRONG ARGUMENT COUNT
485CALL-WRONG-ARGUMENT-COUNT-NEXT: [[#add(NUMVAR)]]
486CALL-WRONG-ARGUMENT-COUNT-MSG: numeric-expression.txt:[[#@LINE-1]]:36: error: function 'add' takes 2 arguments but 1 given
487CALL-WRONG-ARGUMENT-COUNT-MSG-NEXT: {{C}}ALL-WRONG-ARGUMENT-COUNT-NEXT: {{\[\[#add\(NUMVAR\)\]\]}}
488CALL-WRONG-ARGUMENT-COUNT-MSG-NEXT:    {{^}}                                   ^{{$}}
489
490RUN: %ProtectFileCheckOutput \
491RUN: not FileCheck -D#NUMVAR=10 --check-prefix CALL-UNDEFINED-FUNCTION --input-file %s %s 2>&1 \
492RUN:   | FileCheck --strict-whitespace --check-prefix CALL-UNDEFINED-FUNCTION-MSG %s
493
494CALL UNDEFINED FUNCTION
49530
496CALL-UNDEFINED-FUNCTION-LABEL: CALL UNDEFINED FUNCTION
497CALL-UNDEFINED-FUNCTION-NEXT: [[#bogus_function(NUMVAR)]]
498CALL-UNDEFINED-FUNCTION-MSG: numeric-expression.txt:[[#@LINE-1]]:34: error: call to undefined function 'bogus_function'
499CALL-UNDEFINED-FUNCTION-MSG-NEXT: {{C}}ALL-UNDEFINED-FUNCTION-NEXT: {{\[\[#bogus_function\(NUMVAR\)\]\]}}
500CALL-UNDEFINED-FUNCTION-MSG-NEXT:    {{^}}                                 ^{{$}}
501