[cfe-dev] Partial Template Specialization
Douglas Gregor
dgregor at apple.com
Thu Apr 5 15:20:56 PDT 2012
On Apr 5, 2012, at 3:12 PM, Yang Chen <chenyang at cs.utah.edu> wrote:
> 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.
Something weird is going on, because when I -ast-dump the input source you gave, I see the partial specialization.
- Doug
More information about the cfe-dev
mailing list