[cfe-dev] Partial Template Specialization
Yang Chen
chenyang at cs.utah.edu
Thu Apr 5 15:12:46 PDT 2012
Douglas Gregor wrote:
> On Apr 5, 2012, at 2:16 PM, Yang Chen <chenyang at cs.utah.edu> wrote:
>
>
>> Hi,
>>
>> 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.
>>
>> (gdb) p Ctx.getTranslationUnitDecl()->dump()
>> struct __va_list_tag {
>> unsigned int gp_offset;
>> unsigned int fp_offset;
>> void *overflow_arg_area;
>> void *reg_save_area;
>> };
>> typedef struct __va_list_tag __va_list_tag;
>> template <typename > struct AAA {
>> };
>> $1 = void
>>
>> 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):
bool MyVisitor::VisitClassTemplateDecl(ClassTemplateDecl *D)
{
llvm::SmallVector<ClassTemplatePartialSpecializationDecl*, 5> ParSpecs;
D->getPartialSpecializations(ParSpecs);
unsigned Sz = ParSpecs.size();
return true;
}
And from gdb:
Breakpoint 1, MyVisitor::VisitClassTemplateDecl (this=0x1c340f0,
D=0x1c5ec90) at MyClass.cpp:103
... [skipped]
(gdb) p Sz
$1 = 0
(gdb) p D->dump()
template <typename > struct AAA {
}$2 = void
One more thing is that I assume
VisitClassTemplatePartialSpecializationDecl should capture the partial
template specialization above, but it doesn't.
Thanks,
- Yang
More information about the cfe-dev
mailing list