Author: Haojian Wu Date: 2022-05-03T22:06:10+02:00 New Revision: ed1b32791dbb4c02cd761742a63cdf1e9d644ae6
URL: https://github.com/llvm/llvm-project/commit/ed1b32791dbb4c02cd761742a63cdf1e9d644ae6 DIFF: https://github.com/llvm/llvm-project/commit/ed1b32791dbb4c02cd761742a63cdf1e9d644ae6.diff LOG: [pseudo] Print the GSS::Node details when the unittest fails, NFC. Added: Modified: clang-tools-extra/pseudo/include/clang-pseudo/GLR.h clang-tools-extra/pseudo/lib/GLR.cpp clang-tools-extra/pseudo/unittests/GLRTest.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/pseudo/include/clang-pseudo/GLR.h b/clang-tools-extra/pseudo/include/clang-pseudo/GLR.h index d66dbe5897762..f4eb424dd53fa 100644 --- a/clang-tools-extra/pseudo/include/clang-pseudo/GLR.h +++ b/clang-tools-extra/pseudo/include/clang-pseudo/GLR.h @@ -108,6 +108,7 @@ struct GSS { llvm::BumpPtrAllocator Arena; unsigned NodeCount = 0; }; +llvm::raw_ostream &operator<<(llvm::raw_ostream &, const GSS::Node &); // Parameters for the GLR parsing. struct ParseParams { diff --git a/clang-tools-extra/pseudo/lib/GLR.cpp b/clang-tools-extra/pseudo/lib/GLR.cpp index 542533ee801d4..c1fdd8680ca85 100644 --- a/clang-tools-extra/pseudo/lib/GLR.cpp +++ b/clang-tools-extra/pseudo/lib/GLR.cpp @@ -12,6 +12,7 @@ #include "clang/Basic/TokenKinds.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/STLExtras.h" +#include "llvm/ADT/StringExtras.h" #include "llvm/Support/Debug.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/FormatVariadic.h" @@ -26,6 +27,15 @@ namespace pseudo { using StateID = LRTable::StateID; +llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const GSS::Node &N) { + std::vector<std::string> ParentStates; + for (const auto *Parent : N.parents()) + ParentStates.push_back(llvm::formatv("{0}", Parent->State)); + OS << llvm::formatv("state {0}, parsed symbol {1}, parents {2}", N.State, + N.Payload->symbol(), llvm::join(ParentStates, ", ")); + return OS; +} + const ForestNode &glrParse(const TokenStream &Tokens, const ParseParams &Params) { llvm::ArrayRef<ForestNode> Terminals = Params.Forest.createTerminals(Tokens); diff --git a/clang-tools-extra/pseudo/unittests/GLRTest.cpp b/clang-tools-extra/pseudo/unittests/GLRTest.cpp index fc19e0eec7ccc..1998c27dd90a5 100644 --- a/clang-tools-extra/pseudo/unittests/GLRTest.cpp +++ b/clang-tools-extra/pseudo/unittests/GLRTest.cpp @@ -19,6 +19,14 @@ namespace clang { namespace pseudo { + +llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, + const std::vector<const GSS::Node *> &Heads) { + for (const auto *Head : Heads) + OS << *Head << "\n"; + return OS; +} + namespace { using Action = LRTable::Action; @@ -28,16 +36,6 @@ MATCHER_P(state, StateID, "") { return arg->State == StateID; } MATCHER_P(parsedSymbol, FNode, "") { return arg->Payload == FNode; } MATCHER_P(parsedSymbolID, SID, "") { return arg->Payload->symbol() == SID; } - -// llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const NewHeadResult &R) { -// std::vector<std::string> ParentStates; -// for (const auto &P : R.Parents) -// ParentStates.push_back(llvm::formatv("{0}", P->State)); -// OS << llvm::formatv("state {0}, parsed symbol {1}, parents {2}", R.State, -// R.Parsed->symbol(), llvm::join(ParentStates, " ")); -// return OS; -// } - testing::Matcher<const GSS::Node *> parents(llvm::ArrayRef<const GSS::Node *> Parents) { return testing::Property(&GSS::Node::parents, @@ -134,7 +132,8 @@ TEST_F(GLRTest, ShiftMergingHeads) { AllOf(state(4), parsedSymbol(&SemiTerminal), parents({GSSNode1, GSSNode2})), AllOf(state(5), parsedSymbol(&SemiTerminal), - parents({GSSNode3})))); + parents({GSSNode3})))) + << NewHeadResults; } TEST_F(GLRTest, ReduceConflictsSplitting) { @@ -161,13 +160,12 @@ TEST_F(GLRTest, ReduceConflictsSplitting) { {GSSNode1, Action::reduce(ruleFor("enum-name"))}}; glrReduce(PendingReduce, {*G, Table, Arena, GSStack}, captureNewHeads()); - // Verify EXPECT_THAT(NewHeadResults, testing::UnorderedElementsAre( AllOf(state(2), parsedSymbolID(id("class-name")), parents({GSSNode0})), AllOf(state(3), parsedSymbolID(id("enum-name")), - parents({GSSNode0})))); + parents({GSSNode0})))) << NewHeadResults; } TEST_F(GLRTest, ReduceSplittingDueToMultipleBases) { @@ -205,7 +203,7 @@ TEST_F(GLRTest, ReduceSplittingDueToMultipleBases) { AllOf(state(5), parsedSymbolID(id("ptr-operator")), parents({GSSNode2})), AllOf(state(6), parsedSymbolID(id("ptr-operator")), - parents({GSSNode3})))); + parents({GSSNode3})))) << NewHeadResults; // Verify that the payload of the two new heads is shared, only a single // ptr-operator node is created in the forest. EXPECT_EQ(NewHeadResults[0]->Payload, NewHeadResults[1]->Payload); @@ -258,7 +256,8 @@ TEST_F(GLRTest, ReduceJoiningWithMultipleBases) { // Verify that the stack heads are joint at state 5 after reduces. EXPECT_THAT(NewHeadResults, testing::UnorderedElementsAre(AllOf( state(5), parsedSymbolID(id("type-name")), - parents({GSSNode1, GSSNode2})))); + parents({GSSNode1, GSSNode2})))) + << NewHeadResults; // Verify that we create an ambiguous ForestNode of two parses of `type-name`. EXPECT_EQ(NewHeadResults.front()->Payload->dumpRecursive(*G), "[ 1, end) type-name := <ambiguous>\n" @@ -312,7 +311,8 @@ TEST_F(GLRTest, ReduceJoiningWithSameBase) { EXPECT_THAT(NewHeadResults, testing::UnorderedElementsAre( AllOf(state(5), parsedSymbolID(id("pointer")), - parents({GSSNode0})))); + parents({GSSNode0})))) + << NewHeadResults; EXPECT_EQ(NewHeadResults.front()->Payload->dumpRecursive(*G), "[ 0, end) pointer := <ambiguous>\n" "[ 0, end) ├─pointer := class-name *\n" _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits