[cfe-dev] Using clang_Type_getNumTemplateArguments

Shaheed Haque via cfe-dev cfe-dev at lists.llvm.org
Mon Nov 27 11:55:49 PST 2017


Hi,

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:

    template<typename X, typename Y, typename Z, typename O>
    Foo<X, Bar<Y, Bleh<Z> >, O >

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:

    typedef QStringBuilder<A, B> type;

(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:

    TEMPLATE_REF on line 346 '::QStringBuilder'
    template_arg_count=2
    TYPE_REF on line 346 '::A'
    TYPE_REF on line 346 '::B'
    TYPEDEF_DECL on line 348 'QConcatenable::type'

it is easy to see that both A and B are associated with QStringBuilder.
However, for this case:

    typedef typename QtStringBuilder::ConvertToTypeHelper<typename
QConcatenable<A>::ConvertTo, typename
QConcatenable<B>::ConvertTo>::ConvertTo ConvertTo;

the routine returns -1 for each of the three templates:

    TYPEDEF_DECL on line 349 'QConcatenable::ConvertTo'
    NAMESPACE_REF on line 349 '::QtStringBuilder'
    TEMPLATE_REF on line 349 '::ConvertToTypeHelper'
    template_arg_count=-1
    TEMPLATE_REF on line 349 '::QConcatenable'
    template_arg_count=-1
    TYPE_REF on line 349 '::A'
    TEMPLATE_REF on line 349 '::QConcatenable'
    template_arg_count=-1
    TYPE_REF on line 349 '::B'

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?

Thanks, Shaheed

P.S. This is with clang++-5.0.0.3, on Ubuntu artful.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20171127/61c87518/attachment.html>


More information about the cfe-dev mailing list