Hmm, thanks for letting me know! Is that an old compiler?
I'm not near a computer for the weekend. Can someone fix or revert? Thanks, Stephen. On Fri 17 May 2019, 17:11 Yitzhak Mandelbaum, <yitzh...@google.com> wrote: > Looks like this caused a breakage: > http://lab.llvm.org:8011/builders/clang-cmake-aarch64-quick/builds/18641/steps/ninja%20check%201/logs/stdio > > On Fri, May 17, 2019 at 9:52 AM Stephen Kelly via cfe-commits < > cfe-commits@lists.llvm.org> wrote: > >> Author: steveire >> Date: Fri May 17 06:55:28 2019 >> New Revision: 361033 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=361033&view=rev >> Log: >> Add a Visit overload for DynTypedNode to ASTNodeTraverser >> >> Reviewers: aaron.ballman >> >> Subscribers: cfe-commits >> >> Tags: #clang >> >> Differential Revision: https://reviews.llvm.org/D61834 >> >> Added: >> cfe/trunk/unittests/AST/ASTTraverserTest.cpp >> Modified: >> cfe/trunk/include/clang/AST/ASTNodeTraverser.h >> cfe/trunk/unittests/AST/CMakeLists.txt >> >> Modified: cfe/trunk/include/clang/AST/ASTNodeTraverser.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ASTNodeTraverser.h?rev=361033&r1=361032&r2=361033&view=diff >> >> ============================================================================== >> --- cfe/trunk/include/clang/AST/ASTNodeTraverser.h (original) >> +++ cfe/trunk/include/clang/AST/ASTNodeTraverser.h Fri May 17 06:55:28 >> 2019 >> @@ -205,6 +205,24 @@ public: >> }); >> } >> >> + void Visit(const ast_type_traits::DynTypedNode &N) { >> + // FIXME: Improve this with a switch or a visitor pattern. >> + if (const auto *D = N.get<Decl>()) >> + Visit(D); >> + else if (const auto *S = N.get<Stmt>()) >> + Visit(S); >> + else if (const auto *QT = N.get<QualType>()) >> + Visit(*QT); >> + else if (const auto *T = N.get<Type>()) >> + Visit(T); >> + else if (const auto *C = N.get<CXXCtorInitializer>()) >> + Visit(C); >> + else if (const auto *C = N.get<OMPClause>()) >> + Visit(C); >> + else if (const auto *T = N.get<TemplateArgument>()) >> + Visit(*T); >> + } >> + >> void dumpDeclContext(const DeclContext *DC) { >> if (!DC) >> return; >> >> Added: cfe/trunk/unittests/AST/ASTTraverserTest.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/AST/ASTTraverserTest.cpp?rev=361033&view=auto >> >> ============================================================================== >> --- cfe/trunk/unittests/AST/ASTTraverserTest.cpp (added) >> +++ cfe/trunk/unittests/AST/ASTTraverserTest.cpp Fri May 17 06:55:28 2019 >> @@ -0,0 +1,220 @@ >> +//===- >> unittests/AST/ASTTraverserTest.h------------------------------------===// >> +// >> +// Part of the LLVM Project, under the Apache License v2.0 with LLVM >> Exceptions. >> +// See https://llvm.org/LICENSE.txt for license information. >> +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception >> +// >> >> +//===----------------------------------------------------------------------===// >> + >> +#include "clang/AST/ASTContext.h" >> +#include "clang/AST/ASTNodeTraverser.h" >> +#include "clang/AST/TextNodeDumper.h" >> +#include "clang/ASTMatchers/ASTMatchFinder.h" >> +#include "clang/ASTMatchers/ASTMatchers.h" >> +#include "clang/Tooling/Tooling.h" >> +#include "gmock/gmock.h" >> +#include "gtest/gtest.h" >> + >> +using namespace clang::tooling; >> +using namespace clang::ast_matchers; >> + >> +namespace clang { >> + >> +class NodeTreePrinter : public TextTreeStructure { >> + llvm::raw_ostream &OS; >> + >> +public: >> + NodeTreePrinter(llvm::raw_ostream &OS) >> + : TextTreeStructure(OS, /* showColors */ false), OS(OS) {} >> + >> + void Visit(const Decl *D) { OS << D->getDeclKindName() << "Decl"; } >> + >> + void Visit(const Stmt *S) { OS << S->getStmtClassName(); } >> + >> + void Visit(QualType QT) { >> + OS << "QualType " << QT.split().Quals.getAsString(); >> + } >> + >> + void Visit(const Type *T) { OS << T->getTypeClassName() << "Type"; } >> + >> + void Visit(const comments::Comment *C, const comments::FullComment >> *FC) { >> + OS << C->getCommentKindName(); >> + } >> + >> + void Visit(const CXXCtorInitializer *Init) { OS << >> "CXXCtorInitializer"; } >> + >> + void Visit(const Attr *A) { >> + switch (A->getKind()) { >> +#define ATTR(X) >> \ >> + case attr::X: >> \ >> + OS << #X; >> \ >> + break; >> +#include "clang/Basic/AttrList.inc" >> + } >> + OS << "Attr"; >> + } >> + >> + void Visit(const OMPClause *C) { OS << "OMPClause"; } >> + void Visit(const TemplateArgument &A, SourceRange R = {}, >> + const Decl *From = nullptr, const char *Label = nullptr) { >> + OS << "TemplateArgument"; >> + } >> + >> + template <typename... T> void Visit(T...) {} >> +}; >> + >> +class TestASTDumper : public ASTNodeTraverser<TestASTDumper, >> NodeTreePrinter> { >> + >> + NodeTreePrinter MyNodeRecorder; >> + >> +public: >> + TestASTDumper(llvm::raw_ostream &OS) : MyNodeRecorder(OS) {} >> + NodeTreePrinter &doGetNodeDelegate() { return MyNodeRecorder; } >> +}; >> + >> +template <typename... NodeType> std::string dumpASTString(NodeType &&... >> N) { >> + std::string Buffer; >> + llvm::raw_string_ostream OS(Buffer); >> + >> + TestASTDumper Dumper(OS); >> + >> + OS << "\n"; >> + >> + Dumper.Visit(std::forward<NodeType &&>(N)...); >> + >> + return OS.str(); >> +} >> + >> +const FunctionDecl *getFunctionNode(clang::ASTUnit *AST, >> + const std::string &Name) { >> + auto Result = >> ast_matchers::match(functionDecl(hasName(Name)).bind("fn"), >> + AST->getASTContext()); >> + EXPECT_EQ(Result.size(), 1u); >> + return Result[0].getNodeAs<FunctionDecl>("fn"); >> +} >> + >> +template <typename T> struct Verifier { >> + static void withDynNode(T Node, const std::string &DumpString) { >> + EXPECT_EQ(dumpASTString(ast_type_traits::DynTypedNode::create(Node)), >> + DumpString); >> + } >> +}; >> + >> +template <typename T> struct Verifier<T *> { >> + static void withDynNode(T *Node, const std::string &DumpString) { >> + >> EXPECT_EQ(dumpASTString(ast_type_traits::DynTypedNode::create(*Node)), >> + DumpString); >> + } >> +}; >> + >> +template <typename T> >> +void verifyWithDynNode(T Node, const std::string &DumpString) { >> + EXPECT_EQ(dumpASTString(Node), DumpString); >> + >> + Verifier<T>::withDynNode(Node, DumpString); >> +} >> + >> +TEST(Traverse, Dump) { >> + >> + auto AST = buildASTFromCode(R"cpp( >> +struct A { >> + int m_number; >> + >> + /// CTor >> + A() : m_number(42) {} >> + >> + [[nodiscard]] const int func() { >> + return 42; >> + } >> + >> +}; >> + >> +template<typename T> >> +struct templ >> +{ >> +}; >> + >> +template<> >> +struct templ<int> >> +{ >> +}; >> + >> +)cpp"); >> + >> + const FunctionDecl *Func = getFunctionNode(AST.get(), "func"); >> + >> + verifyWithDynNode(Func, >> + R"cpp( >> +CXXMethodDecl >> +|-CompoundStmt >> +| `-ReturnStmt >> +| `-IntegerLiteral >> +`-WarnUnusedResultAttr >> +)cpp"); >> + >> + Stmt *Body = Func->getBody(); >> + >> + verifyWithDynNode(Body, >> + R"cpp( >> +CompoundStmt >> +`-ReturnStmt >> + `-IntegerLiteral >> +)cpp"); >> + >> + QualType QT = Func->getType(); >> + >> + verifyWithDynNode(QT, >> + R"cpp( >> +FunctionProtoType >> +`-QualType const >> + `-BuiltinType >> +)cpp"); >> + >> + const FunctionDecl *CTorFunc = getFunctionNode(AST.get(), "A"); >> + >> + verifyWithDynNode(CTorFunc->getType(), >> + R"cpp( >> +FunctionProtoType >> +`-BuiltinType >> +)cpp"); >> + >> + Attr *A = *Func->attr_begin(); >> + >> + EXPECT_EQ(dumpASTString(A), >> + R"cpp( >> +WarnUnusedResultAttr >> +)cpp"); >> + >> + auto *CTor = dyn_cast<CXXConstructorDecl>(CTorFunc); >> + const CXXCtorInitializer *Init = *CTor->init_begin(); >> + >> + verifyWithDynNode(Init, >> + R"cpp( >> +CXXCtorInitializer >> +`-IntegerLiteral >> +)cpp"); >> + >> + const comments::FullComment *Comment = >> + AST->getASTContext().getLocalCommentForDeclUncached(CTorFunc); >> + >> + EXPECT_EQ(dumpASTString(Comment, Comment), >> + R"cpp( >> +FullComment >> +`-ParagraphComment >> + `-TextComment >> +)cpp"); >> + >> + auto Result = ast_matchers::match( >> + classTemplateSpecializationDecl(hasName("templ")).bind("fn"), >> + AST->getASTContext()); >> + EXPECT_EQ(Result.size(), 1u); >> + auto Templ = >> Result[0].getNodeAs<ClassTemplateSpecializationDecl>("fn"); >> + >> + TemplateArgument TA = Templ->getTemplateArgs()[0]; >> + >> + verifyWithDynNode(TA, >> + R"cpp( >> +TemplateArgument >> +)cpp"); >> +} >> +} // namespace clang >> >> Modified: cfe/trunk/unittests/AST/CMakeLists.txt >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/AST/CMakeLists.txt?rev=361033&r1=361032&r2=361033&view=diff >> >> ============================================================================== >> --- cfe/trunk/unittests/AST/CMakeLists.txt (original) >> +++ cfe/trunk/unittests/AST/CMakeLists.txt Fri May 17 06:55:28 2019 >> @@ -12,6 +12,7 @@ add_clang_unittest(ASTTests >> ASTImporterTest.cpp >> ASTImporterGenericRedeclTest.cpp >> ASTImporterVisibilityTest.cpp >> + ASTTraverserTest.cpp >> ASTTypeTraitsTest.cpp >> ASTVectorTest.cpp >> CommentLexer.cpp >> >> >> _______________________________________________ >> cfe-commits mailing list >> cfe-commits@lists.llvm.org >> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >> >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits