i'll see if i can repro on my build and fix if so. On Fri, May 17, 2019 at 1:56 PM Stephen Kelly <steve...@gmail.com> wrote:
> 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 >>> >>
smime.p7s
Description: S/MIME Cryptographic Signature
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits