[FileCheck] Fix parsing empty global and pseudo variable names (#83667)
Reland #82595 with fixes of build failures related to colored output. See https://lab.llvm.org/buildbot/#/builders/139/builds/60549 Use `%ProtectFileCheckOutput` to avoid colored output. Original commit message below. In `Pattern::parseVariable`, for global variables (those starting with '$') and for pseudo variables (those starting with '@') the first character is consumed before actual variable name parsing. If the name is empty, it leads to out-of-bound access to the corresponding `StringRef`. This patch adds an if statement against the case described.
This commit is contained in:
parent
0e337c67c8
commit
3105cfe783
@ -297,6 +297,12 @@ Pattern::parseVariable(StringRef &Str, const SourceMgr &SM) {
|
||||
if (Str[0] == '$' || IsPseudo)
|
||||
++I;
|
||||
|
||||
if (I == Str.size())
|
||||
return ErrorDiagnostic::get(SM, Str.slice(I, StringRef::npos),
|
||||
StringRef("empty ") +
|
||||
(IsPseudo ? "pseudo " : "global ") +
|
||||
"variable name");
|
||||
|
||||
if (!isValidVarNameStart(Str[I++]))
|
||||
return ErrorDiagnostic::get(SM, Str, "invalid variable name");
|
||||
|
||||
|
32
llvm/test/FileCheck/empty-variable-name.txt
Normal file
32
llvm/test/FileCheck/empty-variable-name.txt
Normal file
@ -0,0 +1,32 @@
|
||||
a
|
||||
|
||||
; RUN: %ProtectFileCheckOutput not FileCheck -input-file %s %s 2>&1 | \
|
||||
; RUN: FileCheck -check-prefix CHECK-ERROR -DDIR=%S \
|
||||
; RUN: --match-full-lines --strict-whitespace %s
|
||||
|
||||
; CHECK: a[[]]
|
||||
; CHECK-ERROR:[[DIR]]{{/|\\}}empty-variable-name.txt:7:13: error: empty variable name
|
||||
; CHECK-ERROR-NEXT:; CHECK: a{{\[\[\]\]}}
|
||||
; CHECK-ERROR-NEXT: ^
|
||||
|
||||
b
|
||||
|
||||
; RUN: %ProtectFileCheckOutput not FileCheck -input-file %s -check-prefix CHECK-PSEUDO %s 2>&1 | \
|
||||
; RUN: FileCheck -check-prefix CHECK-ERROR-PSEUDO -DDIR=%S \
|
||||
; RUN: --match-full-lines --strict-whitespace %s
|
||||
|
||||
; CHECK-PSEUDO: b[[@]]
|
||||
; CHECK-ERROR-PSEUDO:[[DIR]]{{/|\\}}empty-variable-name.txt:18:21: error: empty pseudo variable name
|
||||
; CHECK-ERROR-PSEUDO-NEXT:; CHECK-PSEUDO: b{{\[\[@\]\]}}
|
||||
; CHECK-ERROR-PSEUDO-NEXT: ^
|
||||
|
||||
c
|
||||
|
||||
; RUN: %ProtectFileCheckOutput not FileCheck -input-file %s -check-prefix CHECK-GLOBAL %s 2>&1 | \
|
||||
; RUN: FileCheck -check-prefix CHECK-ERROR-GLOBAL -DDIR=%S \
|
||||
; RUN: --match-full-lines --strict-whitespace %s
|
||||
|
||||
; CHECK-GLOBAL: c[[$]]
|
||||
; CHECK-ERROR-GLOBAL:[[DIR]]{{/|\\}}empty-variable-name.txt:29:21: error: empty global variable name
|
||||
; CHECK-ERROR-GLOBAL-NEXT:; CHECK-GLOBAL: c{{\[\[\$\]\]}}
|
||||
; CHECK-ERROR-GLOBAL-NEXT: ^
|
Loading…
x
Reference in New Issue
Block a user