diff --git a/llvm/lib/FileCheck/FileCheck.cpp b/llvm/lib/FileCheck/FileCheck.cpp --- a/llvm/lib/FileCheck/FileCheck.cpp +++ b/llvm/lib/FileCheck/FileCheck.cpp @@ -1083,8 +1083,15 @@ if (IsPseudo) { MatchStr = OrigMatchStr; IsLegacyLineExpr = IsNumBlock = true; - } else + } else { + if (!MatchStr.empty()) { + SM.PrintMessage(SMLoc::getFromPointer(Name.data()), + SourceMgr::DK_Error, + "invalid name in string variable use"); + return true; + } SubstStr = Name; + } } } diff --git a/llvm/test/FileCheck/simple-var-capture.txt b/llvm/test/FileCheck/simple-var-capture.txt --- a/llvm/test/FileCheck/simple-var-capture.txt +++ b/llvm/test/FileCheck/simple-var-capture.txt @@ -11,3 +11,15 @@ ; CHECK-NEXT: op4 {{r[0-9]+}}, [[REGa]], [[REGb]] +// RUN: %ProtectFileCheckOutput \ +// RUN: not FileCheck --check-prefixes INVALID-VARNAME --input-file %s %s 2>&1 \ +// RUN: | FileCheck --check-prefix INVALID-VARNAME-MSG --strict-whitespace %s + +5 +4 +; INVALID-VARNAME: [[X:]] +; INVALID-VARNAME-NEXT: [[Y:]] +; INVALID-VARNAME-NEXT: [[X-Y]] +; INVALID-VARNAME-MSG: simple-var-capture.txt:[[#@LINE-1]]:27: error: invalid name in string variable use +; INVALID-VARNAME-MSG-NEXT: ; {{I}}NVALID-VARNAME-NEXT: {{\[\[X-Y\]\]}} +; INVALID-VARNAME-MSG-NEXT: {{^}} ^{{$}} diff --git a/llvm/unittests/FileCheck/FileCheckTest.cpp b/llvm/unittests/FileCheck/FileCheckTest.cpp --- a/llvm/unittests/FileCheck/FileCheckTest.cpp +++ b/llvm/unittests/FileCheck/FileCheckTest.cpp @@ -1343,6 +1343,9 @@ // Collision with numeric variable. EXPECT_TRUE(Tester.parsePattern("[[FOO:]]")); + // Invalid use of string variable. + EXPECT_TRUE(Tester.parsePattern("[[FOO-BAR]]")); + // Valid use of string variable. EXPECT_FALSE(Tester.parsePattern("[[BAR]]"));