<div dir="ltr"><div><div><div><div>Hi,<br><br></div>I'm trying to use clang_Type_getNumTemplateArguments() to help walk the Cursors emitted by the clang Python binding. Specifically I think I need this function to be able to correctly associate template arguments with the templated entity, for example, in the case of nested templates such as:</div><div><br></div><div>    template<typename X, typename Y, typename Z, typename O><br></div><div>    Foo<X, Bar<Y, Bleh<Z> >, O ></div><div><br></div><div>I expect the routine to return 3 for Foo, 2 for Bar and 1 for Bleh. The routine works as I expect in this case:<br></div><br>    typedef QStringBuilder<A, B> type;<br></div><div><br></div><div>(Here, A and B are template parameters for the containing class). The value returned by the function is "2", so given the sequence of Cursors:<br></div><br>    TEMPLATE_REF on line 346 '::QStringBuilder'<br><div><span style="color:rgb(0,128,0);font-weight:bold">    </span>template_arg_count=2<br></div>    TYPE_REF on line 346 '::A'<br>    TYPE_REF on line 346 '::B'<br>    TYPEDEF_DECL on line 348 'QConcatenable::type'<span style="color:rgb(0,128,0);font-weight:bold"><br></span></div><br><div>it is easy to see that both A and B are associated with QStringBuilder. However, for this case:<br></div><br><div>    typedef typename QtStringBuilder::ConvertToTypeHelper<typename 
QConcatenable<A>::ConvertTo, typename 
QConcatenable<B>::ConvertTo>::ConvertTo ConvertTo;<br></div><div><br></div><div>the routine returns -1 for each of the three templates:<br></div><div><br></div><div>    TYPEDEF_DECL on line 349 'QConcatenable::ConvertTo'<br>    NAMESPACE_REF on line 349 '::QtStringBuilder'<br>    TEMPLATE_REF on line 349 '::ConvertToTypeHelper'<br>    template_arg_count=-1<br>    TEMPLATE_REF on line 349 '::QConcatenable'<br>    template_arg_count=-1<br>    TYPE_REF on line 349 '::A'<br>    TEMPLATE_REF on line 349 '::QConcatenable'<br>    template_arg_count=-1<br>    TYPE_REF on line 349 '::B'<br></div><div><br></div><div>I'm not a compiler expert, but I notice that the various clang_{Cursor,Type}_<something to do with template arguments> functions are all documented as applying only to very specific cases, so my question is whether the above represents a bug or expected behaviour? If the behaviour is expected, then is there some other way to walk the cursors and figure out the shape of the AST?</div><div><br></div><div>Thanks, Shaheed</div><div><br></div><div>P.S. This is with clang++-5.0.0.3, on Ubuntu artful.<br></div></div>