* When `--enable-var-scope` is active, `lib/FileCheck.cpp#clearLocalVars` gets called. * That function loops through `GlobalNumericVariableTable` and then calls `NumericVariable::clear` on most items. It also removes them from `GlobalNumericVariableTable`. * When reassigning an already cleared variable, `Pattern::match` calls `NumericVariable::setValue`, but it doesn't reinsert it into `GlobalNumericVariableTable`. Therefore, the next time `clearLocalVars` is called, it won't be able to loop through the variables. Fix it by reinserting them in `GlobalNumericVariableTable` inside `Pattern::match`. Co-authored-by: Thomas Preud'homme <thomas.preudhomme@arm.com>
70 lines
2.5 KiB
Plaintext
70 lines
2.5 KiB
Plaintext
; Test that variables not starting with dollar sign get undefined after a
|
|
; CHECK-LABEL directive iff --enable-var-scope is used.
|
|
|
|
; Reference run: variables remain defined at all time when not using
|
|
; --enable-var-scope option.
|
|
RUN: FileCheck --check-prefixes CHECK,CHECK-LOCAL-BOTH,CHECK-GLOBAL --input-file %s %s
|
|
|
|
RUN: FileCheck --check-prefixes CHECK,CHECK-GLOBAL --enable-var-scope --input-file %s %s
|
|
RUN: %ProtectFileCheckOutput not FileCheck --check-prefixes CHECK,CHECK-LOCAL-TEXT --enable-var-scope --input-file %s %s 2>&1 \
|
|
RUN: | FileCheck --implicit-check-not "undefined variable:" --check-prefixes ERRUNDEF,ERRUNDEF-LOCAL %s
|
|
RUN: %ProtectFileCheckOutput not FileCheck --check-prefixes CHECK,CHECK-LOCAL-NUM --enable-var-scope --input-file %s %s 2>&1 \
|
|
RUN: | FileCheck --implicit-check-not "undefined variable:" --check-prefixes ERRUNDEF,ERRUNDEF-LOCNUM %s
|
|
RUN: %ProtectFileCheckOutput not FileCheck --check-prefixes CHECK,CHECK-LOCAL-BOTH --enable-var-scope --input-file %s %s 2>&1 \
|
|
RUN: | FileCheck --implicit-check-not "undefined variable:" --check-prefixes ERRUNDEF,ERRUNDEF-LOCAL,ERRUNDEF-LOCNUM %s
|
|
|
|
local1
|
|
global1
|
|
CHECK: [[LOCAL:loc[^[:digit:]]*]][[#LOCNUM:]]
|
|
CHECK: [[$GLOBAL:glo[^[:digit:]]*]][[#$GLOBNUM:]]
|
|
|
|
local2
|
|
global2
|
|
CHECK: [[LOCAL]][[#LOCNUM+1]]
|
|
CHECK: [[$GLOBAL]][[#$GLOBNUM+1]]
|
|
|
|
// Barrier to clear local variables
|
|
barrier1:
|
|
CHECK-LABEL: barrier1
|
|
|
|
local3
|
|
global3
|
|
CHECK-LOCAL-TEXT: [[LOCAL]]3
|
|
CHECK-LOCAL-NUM: local[[#LOCNUM+2]]
|
|
CHECK-LOCAL-BOTH: [[LOCAL]][[#LOCNUM+2]]
|
|
CHECK-GLOBAL: [[$GLOBAL]][[#$GLOBNUM+2]]
|
|
|
|
// Barrier to continue FileCheck execution even after the first fail
|
|
barrier2:
|
|
CHECK-LABEL: barrier2
|
|
|
|
// Reassign the variables to check that clearing-after-reassigning works
|
|
local4
|
|
global4
|
|
CHECK: [[LOCAL:loc[^[:digit:]]*]][[#LOCNUM:]]
|
|
CHECK: [[$GLOBAL:glo[^[:digit:]]*]][[#$GLOBNUM:]]
|
|
|
|
// Barrier to clear local variables
|
|
barrier3:
|
|
CHECK-LABEL: barrier3
|
|
|
|
local5
|
|
global5
|
|
CHECK-LOCAL-TEXT: [[LOCAL]]5
|
|
CHECK-LOCAL-NUM: local[[#LOCNUM+1]]
|
|
CHECK-LOCAL-BOTH: [[LOCAL]][[#LOCNUM+1]]
|
|
CHECK-GLOBAL: [[$GLOBAL]][[#$GLOBNUM+1]]
|
|
|
|
|
|
// Check that the tests fail as expected
|
|
ERRUNDEF-LOCAL: undefined variable: LOCAL
|
|
ERRUNDEF-LOCNUM: undefined variable: LOCNUM
|
|
ERRUNDEF-LOCAL: undefined variable: LOCAL
|
|
ERRUNDEF-LOCNUM: undefined variable: LOCNUM
|
|
|
|
// Look for "Input was:" to only match the error messages before the input-context.
|
|
//
|
|
// The regex /([[:space:]]|.)*/ matches all remaining characters,
|
|
// to avoid fails due to --implicit-check-not
|
|
ERRUNDEF: {{^Input was:([[:space:]]|.)*}}
|