diff --git a/llvm/lib/FileCheck/FileCheck.cpp b/llvm/lib/FileCheck/FileCheck.cpp index 6d3a2b9cf46f7..8f80a69c4abd3 100644 --- a/llvm/lib/FileCheck/FileCheck.cpp +++ b/llvm/lib/FileCheck/FileCheck.cpp @@ -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"); diff --git a/llvm/test/FileCheck/empty-variable-name.txt b/llvm/test/FileCheck/empty-variable-name.txt new file mode 100644 index 0000000000000..29c6317e6bb17 --- /dev/null +++ b/llvm/test/FileCheck/empty-variable-name.txt @@ -0,0 +1,32 @@ +a + +; RUN: 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: 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: 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: ^