diff options
author | Joel E. Denny <jdenny.ornl@gmail.com> | 2020-07-28 18:09:47 -0400 |
---|---|---|
committer | Joel E. Denny <jdenny.ornl@gmail.com> | 2020-07-28 19:15:18 -0400 |
commit | 9f86b8ec41f04fa6f087264008317515a612a922 (patch) | |
tree | d2b6438292e52c2eb206645c241c68cb41e2cd5e /llvm/unittests/Support/FileCheckTest.cpp | |
parent | d680711b94e94e9387076a0daf2a329e304e6751 (diff) | |
download | llvm-9f86b8ec41f04fa6f087264008317515a612a922.zip llvm-9f86b8ec41f04fa6f087264008317515a612a922.tar.gz llvm-9f86b8ec41f04fa6f087264008317515a612a922.tar.bz2 |
[FileCheck] Report captured variables
Report captured variables in input dumps and traces. For example:
```
$ cat check
CHECK: hello [[WHAT:[a-z]+]]
CHECK: goodbye [[WHAT]]
$ FileCheck -dump-input=always -vv check < input |& tail -8
<<<<<<
1: hello world
check:1'0 ^~~~~~~~~~~
check:1'1 ^~~~~ captured var "WHAT"
2: goodbye world
check:2'0 ^~~~~~~~~~~~~
check:2'1 with "WHAT" equal to "world"
>>>>>>
$ FileCheck -dump-input=never -vv check < input
check2:1:8: remark: CHECK: expected string found in input
CHECK: hello [[WHAT:[a-z]+]]
^
<stdin>:1:1: note: found here
hello world
^~~~~~~~~~~
<stdin>:1:7: note: captured var "WHAT"
hello world
^~~~~
check2:2:8: remark: CHECK: expected string found in input
CHECK: goodbye [[WHAT]]
^
<stdin>:2:1: note: found here
goodbye world
^~~~~~~~~~~~~
<stdin>:2:1: note: with "WHAT" equal to "world"
goodbye world
^
```
Reviewed By: thopre
Differential Revision: https://reviews.llvm.org/D83651
Diffstat (limited to 'llvm/unittests/Support/FileCheckTest.cpp')
-rw-r--r-- | llvm/unittests/Support/FileCheckTest.cpp | 46 |
1 files changed, 44 insertions, 2 deletions
diff --git a/llvm/unittests/Support/FileCheckTest.cpp b/llvm/unittests/Support/FileCheckTest.cpp index 8cf8234..9f28684 100644 --- a/llvm/unittests/Support/FileCheckTest.cpp +++ b/llvm/unittests/Support/FileCheckTest.cpp @@ -655,20 +655,36 @@ TEST_F(FileCheckTest, NumericVariable) { Expected<ExpressionValue> EvalResult = FooVarUse.eval(); expectUndefErrors({"FOO"}, EvalResult.takeError()); + // Defined variable without string: only getValue and eval return value set. FooVar.setValue(ExpressionValue(42u)); - - // Defined variable: getValue and eval return value set. Optional<ExpressionValue> Value = FooVar.getValue(); ASSERT_TRUE(Value); EXPECT_EQ(42, cantFail(Value->getSignedValue())); + EXPECT_FALSE(FooVar.getStringValue()); EvalResult = FooVarUse.eval(); ASSERT_THAT_EXPECTED(EvalResult, Succeeded()); EXPECT_EQ(42, cantFail(EvalResult->getSignedValue())); + // Defined variable with string: getValue, eval, and getStringValue return + // value set. + StringRef StringValue = "925"; + FooVar.setValue(ExpressionValue(925u), StringValue); + Value = FooVar.getValue(); + ASSERT_TRUE(Value); + EXPECT_EQ(925, cantFail(Value->getSignedValue())); + // getStringValue should return the same memory not just the same characters. + EXPECT_EQ(StringValue.begin(), FooVar.getStringValue().getValue().begin()); + EXPECT_EQ(StringValue.end(), FooVar.getStringValue().getValue().end()); + EvalResult = FooVarUse.eval(); + ASSERT_THAT_EXPECTED(EvalResult, Succeeded()); + EXPECT_EQ(925, cantFail(EvalResult->getSignedValue())); + EXPECT_EQ(925, cantFail(EvalResult->getSignedValue())); + // Clearing variable: getValue and eval fail. Error returned by eval holds // the name of the cleared variable. FooVar.clearValue(); EXPECT_FALSE(FooVar.getValue()); + EXPECT_FALSE(FooVar.getStringValue()); EvalResult = FooVarUse.eval(); expectUndefErrors({"FOO"}, EvalResult.takeError()); } @@ -921,6 +937,11 @@ public: size_t MatchLen; return P.match(BufferRef, MatchLen, SM); } + + void printVariableDefs(FileCheckDiag::MatchType MatchTy, + std::vector<FileCheckDiag> &Diags) { + P.printVariableDefs(SM, MatchTy, &Diags); + } }; TEST_F(FileCheckTest, ParseNumericSubstitutionBlock) { @@ -1617,4 +1638,25 @@ TEST_F(FileCheckTest, FileCheckContext) { ASSERT_THAT_EXPECTED(ExpressionVal, Succeeded()); EXPECT_EQ(cantFail(ExpressionVal->getSignedValue()), 36); } + +TEST_F(FileCheckTest, CapturedVarDiags) { + PatternTester Tester; + ASSERT_FALSE(Tester.parsePattern("[[STRVAR:[a-z]+]] [[#NUMVAR:@LINE]]")); + EXPECT_THAT_EXPECTED(Tester.match("foobar 2"), Succeeded()); + std::vector<FileCheckDiag> Diags; + Tester.printVariableDefs(FileCheckDiag::MatchFoundAndExpected, Diags); + EXPECT_EQ(Diags.size(), 2ul); + for (FileCheckDiag Diag : Diags) { + EXPECT_EQ(Diag.CheckTy, Check::CheckPlain); + EXPECT_EQ(Diag.MatchTy, FileCheckDiag::MatchFoundAndExpected); + EXPECT_EQ(Diag.InputStartLine, 1u); + EXPECT_EQ(Diag.InputEndLine, 1u); + } + EXPECT_EQ(Diags[0].InputStartCol, 1u); + EXPECT_EQ(Diags[0].InputEndCol, 7u); + EXPECT_EQ(Diags[1].InputStartCol, 8u); + EXPECT_EQ(Diags[1].InputEndCol, 9u); + EXPECT_EQ(Diags[0].Note, "captured var \"STRVAR\""); + EXPECT_EQ(Diags[1].Note, "captured var \"NUMVAR\""); +} } // namespace |