From 969186fa4b2f52b5fb67a4a73cfc828899a4874a Mon Sep 17 00:00:00 2001 From: Manuel Klimek Date: Mon, 23 Apr 2012 16:40:40 +0000 Subject: [PATCH] Fix PR12608. Patch contributed by Yang Chen. llvm-svn: 155355 --- clang/include/clang/AST/RecursiveASTVisitor.h | 2 +- .../Tooling/RecursiveASTVisitorTest.cpp | 26 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/AST/RecursiveASTVisitor.h b/clang/include/clang/AST/RecursiveASTVisitor.h index a2f192ba83b2..465ed12dae4d 100644 --- a/clang/include/clang/AST/RecursiveASTVisitor.h +++ b/clang/include/clang/AST/RecursiveASTVisitor.h @@ -1567,7 +1567,7 @@ bool RecursiveASTVisitor::TraverseCXXRecordHelper( CXXRecordDecl *D) { if (!TraverseRecordHelper(D)) return false; - if (D->hasDefinition()) { + if (D->isCompleteDefinition()) { for (CXXRecordDecl::base_class_iterator I = D->bases_begin(), E = D->bases_end(); I != E; ++I) { diff --git a/clang/unittests/Tooling/RecursiveASTVisitorTest.cpp b/clang/unittests/Tooling/RecursiveASTVisitorTest.cpp index d7dad2738a05..8ddae504a0aa 100644 --- a/clang/unittests/Tooling/RecursiveASTVisitorTest.cpp +++ b/clang/unittests/Tooling/RecursiveASTVisitorTest.cpp @@ -106,6 +106,7 @@ protected: FullLocation.isValid() && FullLocation.getSpellingLineNumber() == ExpectedLine && FullLocation.getSpellingColumnNumber() == ExpectedColumn) { + EXPECT_TRUE(!Found); Found = true; } else if (Name == ExpectedMatch || (FullLocation.isValid() && @@ -157,6 +158,31 @@ TEST(RecursiveASTVisitor, VisitsBaseClassDeclarations) { EXPECT_TRUE(Visitor.runOver("class X {}; class Y : public X {};")); } +TEST(RecursiveASTVisitor, VisitsCXXBaseSpecifiersOfForwardDeclaredClass) { + TypeLocVisitor Visitor; + Visitor.ExpectMatch("class X", 3, 18); + EXPECT_TRUE(Visitor.runOver( + "class Y;\n" + "class X {};\n" + "class Y : public X {};")); +} + +TEST(RecursiveASTVisitor, VisitsCXXBaseSpecifiersWithIncompleteInnerClass) { + TypeLocVisitor Visitor; + Visitor.ExpectMatch("class X", 2, 18); + EXPECT_TRUE(Visitor.runOver( + "class X {};\n" + "class Y : public X { class Z; };")); +} + +TEST(RecursiveASTVisitor, VisitsCXXBaseSpecifiersOfSelfReferentialType) { + TypeLocVisitor Visitor; + Visitor.ExpectMatch("X", 2, 18); + EXPECT_TRUE(Visitor.runOver( + "template class X {};\n" + "class Y : public X {};")); +} + TEST(RecursiveASTVisitor, VisitsBaseClassTemplateArguments) { DeclRefExprVisitor Visitor; Visitor.ExpectMatch("x", 2, 3);