[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