aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests/Support/FileCheckTest.cpp
diff options
context:
space:
mode:
authorJoel E. Denny <jdenny.ornl@gmail.com>2020-07-28 18:09:47 -0400
committerJoel E. Denny <jdenny.ornl@gmail.com>2020-07-28 19:15:18 -0400
commit9f86b8ec41f04fa6f087264008317515a612a922 (patch)
treed2b6438292e52c2eb206645c241c68cb41e2cd5e /llvm/unittests/Support/FileCheckTest.cpp
parentd680711b94e94e9387076a0daf2a329e304e6751 (diff)
downloadllvm-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.cpp46
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