[cfe-dev] Partial Template Specialization

Yang Chen chenyang at cs.utah.edu
Thu Apr 5 15:39:56 PDT 2012


Douglas Gregor wrote:
> 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
>   

Doug,

I see the partial specialization too:

$ clang -cc1 -ast-print partial.cpp  
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 <bool, typename > struct AAA {
};
struct AAA {
};

The Clang version I am using:

$ clang --version
clang version 3.1 (trunk 152608)
Target: x86_64-unknown-linux-gnu
Thread model: posix

- Yang




More information about the cfe-dev mailing list