I am writing a pass using ASTConsumer. I find that seems some declarations of partial template specializations are missing from TranslationUnitDecl. For example, given the simple code below:
template<bool, typename>
struct AAA { };
template<typename T>
struct AAA<true, T>
{ };
I get the following result dumped from MyPass::HandleTranslationUnit() function, where MyPass is inherited from ASTConsumer.
I am writing a pass using ASTConsumer. I find that seems some
declarations of partial template specializations are missing from
TranslationUnitDecl. For example, given the simple code below:
template<bool, typename>
struct AAA { };
template<typename T>
struct AAA<true, T>
{ };
I get the following result dumped from MyPass::HandleTranslationUnit()
function, where MyPass is inherited from ASTConsumer.
I am writing a pass using ASTConsumer. I find that seems some declarations of partial template specializations are missing from TranslationUnitDecl. For example, given the simple code below:
template<bool, typename>
struct AAA { };
template<typename T>
struct AAA<true, T>
{ };
I get the following result dumped from MyPass::HandleTranslationUnit() function, where MyPass is inherited from ASTConsumer.
In the above output, only template class AAA is presented, but the partial template specialization is missing.
Yeah, the AST should probably have the class template partial specializations listed here.
Is this an expected behavior, or is it a Clang bug? Sorry for my vague description. Hopefully I am not missing anything.
You can retrieve class template partial specializations of a ClassTemplateDecl using getPartialSpecializations().
- Doug
Doug,
Thanks for the reply.
I tried getPartialSpecializations() on ClassTemplateDecl in the above example, but it returns an empty SmallVector to me, shown as below: (MyVisitor is an inheritance from RecursiveASTVisitor):
I am writing a pass using ASTConsumer. I find that seems some declarations of partial template specializations are missing from TranslationUnitDecl. For example, given the simple code below:
template<bool, typename>
struct AAA { };
template<typename T>
struct AAA<true, T>
{ };
I get the following result dumped from MyPass::HandleTranslationUnit() function, where MyPass is inherited from ASTConsumer.
In the above output, only template class AAA is presented, but the partial template specialization is missing.
Yeah, the AST should probably have the class template partial specializations listed here.
Is this an expected behavior, or is it a Clang bug? Sorry for my vague description. Hopefully I am not missing anything.
You can retrieve class template partial specializations of a ClassTemplateDecl using getPartialSpecializations().
- Doug
Doug,
Thanks for the reply.
I tried getPartialSpecializations() on ClassTemplateDecl in the above example, but it returns an empty SmallVector to me, shown as below: (MyVisitor is an inheritance from RecursiveASTVisitor):
You can control some of what the RAV visits by implementing methods
like shouldVisitTemplateInstantiations. I think that should not make a
difference in your example, as yours is an explicit specialization and
the RAV tries to always visit user-written code, but it might as well
be a bug in the RAV. I'm working on adding a unit test on the RAV so
we can find and fix problems like yours more easily.