From 9f86b8ec41f04fa6f087264008317515a612a922 Mon Sep 17 00:00:00 2001 From: "Joel E. Denny" Date: Tue, 28 Jul 2020 18:09:47 -0400 Subject: [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]+]] ^ :1:1: note: found here hello world ^~~~~~~~~~~ :1:7: note: captured var "WHAT" hello world ^~~~~ check2:2:8: remark: CHECK: expected string found in input CHECK: goodbye [[WHAT]] ^ :2:1: note: found here goodbye world ^~~~~~~~~~~~~ :2:1: note: with "WHAT" equal to "world" goodbye world ^ ``` Reviewed By: thopre Differential Revision: https://reviews.llvm.org/D83651 --- llvm/unittests/Support/FileCheckTest.cpp | 46 ++++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) (limited to 'llvm/unittests/Support/FileCheckTest.cpp') 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 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 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 &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 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 -- cgit v1.1