diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-03-17 23:34:53 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-03-17 23:34:53 +0000 |
commit | 20ade551a6754908ffe3b2ea1c2eea487d923294 (patch) | |
tree | a6a1ab54585958cf604ec6003dba182900311dd4 /clang | |
parent | c7f29dc068c54ff74ced4653f6d0b25a3cf6b429 (diff) | |
download | bcm5719-llvm-20ade551a6754908ffe3b2ea1c2eea487d923294.tar.gz bcm5719-llvm-20ade551a6754908ffe3b2ea1c2eea487d923294.zip |
Factor out repeated code in dumping template declarations.
llvm-svn: 204090
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/AST/ASTDumper.cpp | 58 |
1 files changed, 18 insertions, 40 deletions
diff --git a/clang/lib/AST/ASTDumper.cpp b/clang/lib/AST/ASTDumper.cpp index 1f11f839061..67a4eaabdfc 100644 --- a/clang/lib/AST/ASTDumper.cpp +++ b/clang/lib/AST/ASTDumper.cpp @@ -254,6 +254,8 @@ namespace { void VisitTypeAliasTemplateDecl(const TypeAliasTemplateDecl *D); void VisitCXXRecordDecl(const CXXRecordDecl *D); void VisitStaticAssertDecl(const StaticAssertDecl *D); + template<typename TemplateDecl> + void VisitTemplateDecl(const TemplateDecl *D, bool DumpExplicitInst); void VisitFunctionTemplateDecl(const FunctionTemplateDecl *D); void VisitClassTemplateDecl(const ClassTemplateDecl *D); void VisitClassTemplateSpecializationDecl( @@ -1073,7 +1075,9 @@ void ASTDumper::VisitStaticAssertDecl(const StaticAssertDecl *D) { dumpStmt(D->getMessage()); } -void ASTDumper::VisitFunctionTemplateDecl(const FunctionTemplateDecl *D) { +template<typename TemplateDecl> +void ASTDumper::VisitTemplateDecl(const TemplateDecl *D, + bool DumpExplicitInst) { dumpName(D); dumpTemplateParameters(D->getTemplateParameters()); @@ -1084,9 +1088,12 @@ void ASTDumper::VisitFunctionTemplateDecl(const FunctionTemplateDecl *D) { switch (Child->getTemplateSpecializationKind()) { case TSK_Undeclared: case TSK_ImplicitInstantiation: + Children.dump(Child, /*Ref*/D != D->getCanonicalDecl()); + break; case TSK_ExplicitInstantiationDeclaration: case TSK_ExplicitInstantiationDefinition: - Children.dump(Child, /*Ref*/D != D->getCanonicalDecl()); + Children.dump(Child, /*Ref*/D != D->getCanonicalDecl() || + !DumpExplicitInst); break; case TSK_ExplicitSpecialization: Children.dumpRef(Child); @@ -1095,26 +1102,15 @@ void ASTDumper::VisitFunctionTemplateDecl(const FunctionTemplateDecl *D) { } } -void ASTDumper::VisitClassTemplateDecl(const ClassTemplateDecl *D) { - dumpName(D); - dumpTemplateParameters(D->getTemplateParameters()); - - ChildDumper Children(*this); - Children.dump(D->getTemplatedDecl()); +void ASTDumper::VisitFunctionTemplateDecl(const FunctionTemplateDecl *D) { + // FIXME: We don't add a declaration of a function template specialization + // to its context when it's explicitly instantiated, so dump explicit + // instantiations when we dump the template itself. + VisitTemplateDecl(D, true); +} - for (auto *Child : D->specializations()) { - switch (Child->getTemplateSpecializationKind()) { - case TSK_Undeclared: - case TSK_ImplicitInstantiation: - Children.dump(Child, D != D->getCanonicalDecl()); - break; - case TSK_ExplicitSpecialization: - case TSK_ExplicitInstantiationDeclaration: - case TSK_ExplicitInstantiationDefinition: - Children.dumpRef(Child); - break; - } - } +void ASTDumper::VisitClassTemplateDecl(const ClassTemplateDecl *D) { + VisitTemplateDecl(D, false); } void ASTDumper::VisitClassTemplateSpecializationDecl( @@ -1137,25 +1133,7 @@ void ASTDumper::VisitClassScopeFunctionSpecializationDecl( } void ASTDumper::VisitVarTemplateDecl(const VarTemplateDecl *D) { - dumpName(D); - dumpTemplateParameters(D->getTemplateParameters()); - - ChildDumper Children(*this); - Children.dump(D->getTemplatedDecl()); - - for (auto *Child : D->specializations()) { - switch (Child->getTemplateSpecializationKind()) { - case TSK_Undeclared: - case TSK_ImplicitInstantiation: - Children.dump(Child, D != D->getCanonicalDecl()); - break; - case TSK_ExplicitSpecialization: - case TSK_ExplicitInstantiationDeclaration: - case TSK_ExplicitInstantiationDefinition: - Children.dumpRef(Child); - break; - } - } + VisitTemplateDecl(D, false); } void ASTDumper::VisitVarTemplateSpecializationDecl( |