summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorManuel Klimek <klimek@google.com>2012-04-23 16:40:40 +0000
committerManuel Klimek <klimek@google.com>2012-04-23 16:40:40 +0000
commit969186fa4b2f52b5fb67a4a73cfc828899a4874a (patch)
tree4d97ea57d296e3db24358df01f251460998585f5
parent3099f4bda82ab231422c5dbbb815816b58724998 (diff)
downloadbcm5719-llvm-969186fa4b2f52b5fb67a4a73cfc828899a4874a.tar.gz
bcm5719-llvm-969186fa4b2f52b5fb67a4a73cfc828899a4874a.zip
Fix PR12608. Patch contributed by Yang Chen.
llvm-svn: 155355
-rw-r--r--clang/include/clang/AST/RecursiveASTVisitor.h2
-rw-r--r--clang/unittests/Tooling/RecursiveASTVisitorTest.cpp26
2 files changed, 27 insertions, 1 deletions
diff --git a/clang/include/clang/AST/RecursiveASTVisitor.h b/clang/include/clang/AST/RecursiveASTVisitor.h
index a2f192ba83b..465ed12dae4 100644
--- a/clang/include/clang/AST/RecursiveASTVisitor.h
+++ b/clang/include/clang/AST/RecursiveASTVisitor.h
@@ -1567,7 +1567,7 @@ bool RecursiveASTVisitor<Derived>::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 d7dad2738a0..8ddae504a0a 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<class Y>", 2, 18);
+ EXPECT_TRUE(Visitor.runOver(
+ "template<typename T> class X {};\n"
+ "class Y : public X<Y> {};"));
+}
+
TEST(RecursiveASTVisitor, VisitsBaseClassTemplateArguments) {
DeclRefExprVisitor Visitor;
Visitor.ExpectMatch("x", 2, 3);
OpenPOWER on IntegriCloud