<div dir="ltr">Hi,<br><br>Using libclang, I'd like to visit that part of the AST which is connected to a class template instantiation.<br>I'm wondering if I could have the same behaviour with clang_visitChildern as with RecursiveASTVisitor with shouldVisitTemplateInstantiations() returning true.<div><br></div><div>Currently when I use clang_visitChildren, I can traverse only through the StructDecl and a TypeRef node , but the child nodes are not reachable.<br></div><div>Do I have any feasible option with libclang to recurse into the ClassTemplateSpecializationDecl part of the AST? Or must I use libtooling (and RecursiveASTVisitor or the matchers) rather?</div><div><br></div><div>Many thanks,<br>Gábor</div><div><br></div><div>Detailed explanation via an example:<br><br></div><div>//main.cpp<br><div>struct A {</div><div>    void foo() {}</div><div>};</div><div>template <typename T></div><div>struct X {</div><div>    void f() {</div><div>        T t;</div><div>        t.foo();</div><div>    }</div><div>};</div><div>template struct X<A>;</div><div><br></div><div>Visitation with clang_visitChildren:<br><div>StructDecl c A def main.cpp:1:8</div><div>  CXXMethod c foo() foo def main.cpp:2:10</div><div>    CompoundStmt o</div><div>ClassTemplate c X<T> X def main.cpp:5:8</div><div>  TemplateTypeParameter c T def main.cpp:4:20</div><div>  CXXMethod c f() f def main.cpp:6:10</div><div>    CompoundStmt o</div><div>      DeclStmt o</div><div>        VarDecl c t def main.cpp:7:11</div><div>          TypeRef r T main.cpp:7:9</div><div>      CallExpr r main.cpp:8:9</div><div>        MemberRefExpr r main.cpp:8:9</div><div>          DeclRefExpr r t main.cpp:8:9</div><div>StructDecl c X<A> X def main.cpp:11:17</div><div>  TypeRef r struct A main.cpp:11:19</div></div><div><br></div><div>Visitation with RecursiveASTVisitor:<br><div>|-CXXRecordDecl 0x1030316b0 <main.cpp:1:1, line:3:1> line:1:8 referenced struct A definition</div><div>| |-CXXRecordDecl 0x1030317c0 <col:1, col:8> col:8 implicit struct A</div><div>| |-CXXMethodDecl 0x1030318a0 <line:2:5, col:17> col:10 used foo 'void (void)'</div><div>| | `-CompoundStmt 0x103031978 <col:16, col:17></div><div>| |-CXXConstructorDecl 0x103079250 <line:1:8> col:8 implicit used A 'void (void) throw()' inline</div><div>| | `-CompoundStmt 0x103079560 <col:8></div><div>| `-CXXConstructorDecl 0x103079380 <col:8> col:8 implicit A 'void (const struct A &)' inline noexcept-unevaluated 0x103079380</div><div>|   `-ParmVarDecl 0x1030794c0 <col:8> col:8 'const struct A &'</div><div>|-ClassTemplateDecl 0x1030788d0 <line:4:1, line:10:1> line:5:8 X</div><div>| |-TemplateTypeParmDecl 0x103031990 <line:4:11, col:20> col:20 referenced typename T</div><div>| |-CXXRecordDecl 0x103078840 <line:5:1, line:10:1> line:5:8 struct X definition</div><div>| | |-CXXRecordDecl 0x103078b50 <col:1, col:8> col:8 implicit struct X</div><div>| | `-CXXMethodDecl 0x103078c00 <line:6:5, line:9:5> line:6:10 f 'void (void)'</div><div>| |   `-CompoundStmt 0x103078e10 <col:14, line:9:5></div><div>| |     |-DeclStmt 0x103078d50 <line:7:9, col:12></div><div>| |     | `-VarDecl 0x103078cf0 <col:9, col:11> col:11 referenced t 'T'</div><div>| |     `-CallExpr 0x103078de8 <line:8:9, col:15> '<dependent type>'</div><div>| |       `-CXXDependentScopeMemberExpr 0x103078d90 <col:9, col:11> '<dependent type>' lvalue</div><div>| |         `-DeclRefExpr 0x103078d68 <col:9> 'T' lvalue Var 0x103078cf0 't' 'T'</div><div>| `-ClassTemplateSpecialization 0x103078e50 'X'</div><div>`-ClassTemplateSpecializationDecl 0x103078e50 <line:11:1, col:20> col:17 struct X definition</div><div>  |-TemplateArgument type 'struct A'</div><div>  |-CXXRecordDecl 0x103079040 prev 0x103078e50 <line:5:1, col:8> col:8 implicit struct X</div><div>  `-CXXMethodDecl 0x1030790d0 <line:6:5, line:9:5> line:6:10 f 'void (void)'</div><div>    `-CompoundStmt 0x103079640 <col:14, line:9:5></div><div>      |-DeclStmt 0x1030795a8 <line:7:9, col:12></div><div>      | `-VarDecl 0x1030791d0 <col:9, col:11> col:11 used t 'struct A':'struct A' callinit</div><div>      |   `-CXXConstructExpr 0x103079578 <col:11> 'struct A':'struct A' 'void (void) throw()'</div><div>      `-CXXMemberCallExpr 0x103079618 <line:8:9, col:15> 'void'</div><div>        `-MemberExpr 0x1030795e8 <col:9, col:11> '<bound member function type>' .foo 0x1030318a0</div><div>          `-DeclRefExpr 0x1030795c0 <col:9> 'struct A':'struct A' lvalue Var 0x1030791d0 't' 'struct A':'struct A'</div></div><div><br></div><div><br></div><div><br></div></div></div>