clang_visitChildren skips template parameters of non-class type


With llvm/clang trunk, I'm having an issue when visiting template type instanciation using the C API clang_visitChildren: I only see template parameters of class type, not of basic type.

With this code:

   template<typename A, typename B> struct TemplB{};
   class Bar {};

   int boz(TemplB<char, Bar>);
   int boz2(TemplB<Bar, char>);

I get the following with visitChildren (using a visitor that dump kindSpelling, spelling and recurse with indent:

TypedefDecl __builtin_va_list
ClassTemplate TemplB
   TemplateTypeParameter A
   TemplateTypeParameter B
ClassDecl Bar
FunctionDecl boz
     TemplateRef TemplB
     TypeRef class Bar
FunctionDecl boz2
     TemplateRef TemplB
     TypeRef class Bar

As you can see there is a node for the Bar template parameter, but none for the char.

I can access the CXType from the ParmDecl node, but I see no CXType API that could get me the template parameters.

clang_getCursorReferenced of the ParmDecl node is itself.

clang_getTypeDeclaration of the type given by clang_getCursorType is a StructDecl node with no children (with or without a clang_getCanonicalType)

Is this a bug?

Is there a way I overlooked to access the missing template parameter?



I'm not sure if this is the problem, but as far as I can recall you cannot get the spelling of a built in type. I just created a function with a switch-statement that returns the spelling for built in types.

Here I can't figure out how to access a CXType or CXCursor for the "char" I expect, this is a different issue I think.