thakis created this revision. thakis added reviewers: rsmith, klimek. thakis added a subscriber: cfe-commits. Herald added a subscriber: klimek.
An implicit copy ctor creates loop VarDecls that hang off CXXCtorInitializer. RecursiveASTVisitor used to not visit them, so that they didn't show up in the parent map used by ASTMatchers, causing asserts() when the implicit DeclRefExpr() in a CXXCtorInitializer referred to one of these VarDecls. Fixes PR26227. http://reviews.llvm.org/D16413 Files: include/clang/AST/RecursiveASTVisitor.h unittests/ASTMatchers/ASTMatchersTest.cpp Index: include/clang/AST/RecursiveASTVisitor.h =================================================================== --- include/clang/AST/RecursiveASTVisitor.h +++ include/clang/AST/RecursiveASTVisitor.h @@ -809,6 +809,10 @@ if (Init->isWritten() || getDerived().shouldVisitImplicitCode()) TRY_TO(TraverseStmt(Init->getInit())); + + if (Init->getNumArrayIndices() && getDerived().shouldVisitImplicitCode()) + for (VarDecl *VD : Init->getArrayIndexes()) + TRY_TO(TraverseDecl(VD)); return true; } Index: unittests/ASTMatchers/ASTMatchersTest.cpp =================================================================== --- unittests/ASTMatchers/ASTMatchersTest.cpp +++ unittests/ASTMatchers/ASTMatchersTest.cpp @@ -4207,6 +4207,14 @@ hasAncestor(cxxRecordDecl(unless(isTemplateInstantiation()))))))); } +TEST(HasAncestor, FIXMEbettername) { + EXPECT_TRUE(matches("struct MyClass {\n" + " int c[1];\n" + " static MyClass Create() { return MyClass(); }\n" + "};", + declRefExpr(to(decl(hasAncestor(decl())))))); +} + TEST(HasParent, MatchesAllParents) { EXPECT_TRUE(matches( "template <typename T> struct C { static void f() { 42; } };"
Index: include/clang/AST/RecursiveASTVisitor.h =================================================================== --- include/clang/AST/RecursiveASTVisitor.h +++ include/clang/AST/RecursiveASTVisitor.h @@ -809,6 +809,10 @@ if (Init->isWritten() || getDerived().shouldVisitImplicitCode()) TRY_TO(TraverseStmt(Init->getInit())); + + if (Init->getNumArrayIndices() && getDerived().shouldVisitImplicitCode()) + for (VarDecl *VD : Init->getArrayIndexes()) + TRY_TO(TraverseDecl(VD)); return true; } Index: unittests/ASTMatchers/ASTMatchersTest.cpp =================================================================== --- unittests/ASTMatchers/ASTMatchersTest.cpp +++ unittests/ASTMatchers/ASTMatchersTest.cpp @@ -4207,6 +4207,14 @@ hasAncestor(cxxRecordDecl(unless(isTemplateInstantiation()))))))); } +TEST(HasAncestor, FIXMEbettername) { + EXPECT_TRUE(matches("struct MyClass {\n" + " int c[1];\n" + " static MyClass Create() { return MyClass(); }\n" + "};", + declRefExpr(to(decl(hasAncestor(decl())))))); +} + TEST(HasParent, MatchesAllParents) { EXPECT_TRUE(matches( "template <typename T> struct C { static void f() { 42; } };"
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits