<div dir="ltr"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">You probably want to look at `ClassTemplatesSpecializationDecl`.  If you're doing this in the context of AST matchers, then something like the following is probably what you want:</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">```</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">AST_MATCHER_P(clang::TypeLoc, templateSpecializationTypeLoc,<br>              clang::ast_matchers::TypeLocMatcher, InnerMatcher) {<br>  auto L = Node.getAs<clang::TemplateSpecializationTypeLoc>();<br>  if (L.isNull()) return false;<br>  return InnerMatcher.matches(L, Finder, Builder);<br>}<br><br>AST_MATCHER_P(<br>    clang::TypeLoc, hasAnyTemplateArgumentLoc,<br>    clang::ast_matchers::internal::Matcher<clang::TemplateArgumentLoc>,<br>    InnerMatcher) {<br>  auto L = Node.getAs<clang::TemplateSpecializationTypeLoc>();<br>  if (L.isNull()) return false;<br>  for (unsigned Index = 0, N = L.getNumArgs(); Index < N; ++Index) {<br>    clang::ast_matchers::internal::BoundNodesTreeBuilder Result(*Builder);<br>    if (InnerMatcher.matches(L.getArgLoc(Index), Finder, &Result)) {<br>      *Builder = std::move(Result);<br>      return true;<br>    }<br>  }<br>  return false;<br>}<br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">AST_MATCHER_P(clang::TemplateArgumentLoc, refersToTypeLoc,<br>              clang::ast_matchers::internal::Matcher<clang::TypeLoc>,<br>              InnerMatcher) {<br>  return Node.getArgument().getKind() == clang::TemplateArgument::Type &&<br>         InnerMatcher.matches(Node.getTypeSourceInfo()->getTypeLoc(), Finder,<br>                              Builder);<br>}<br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">```</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">These could be used in a matcher, for example, to identify a type which is a template instantiation with any argument that refers to some type of interest (here, identified by `inner_matcher`).</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">```</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">auto template_instantiation =<br>            templateSpecializationTypeLoc(hasAnyTemplateArgumentLoc(<br>                templateArgumentLoc(refersToTypeLoc(inner_matcher))));<br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">```</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">As for AST guides, I don't know of any good ones, unfortunately. My first place to look is clang-query (especially in <a href="http://godbolt.org">godbolt.org</a>) -- I enter a code snippet and see what the resulting AST looks like.  To see the AST for types, try using something like this in <a href="http://godbolt.org">godbolt.org</a>: <a href="https://godbolt.org/z/bTaoTE" target="_blank" dir="ltr" rel="noopener nofollow noreferrer" class="gmail-Sxihrc" style="text-decoration-line:none;color:rgb(26,115,232);background-image:initial;background-position:initial;background-size:initial;background-repeat:initial;background-origin:initial;background-clip:initial;font-size:14px;margin:0px;padding:0px;vertical-align:baseline;font-family:Roboto,sans-serif;white-space:pre-wrap">https://godbolt.org/z/bTaoTE</a>. (Kudos to Richard Smith for this one...).</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Dec 21, 2020 at 9:04 AM Massa, Gert via cfe-dev <<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">





<div lang="EN-US">
<div class="gmail-m_510296807423204363WordSection1">
<p class="MsoNormal">Hi All,<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Can anyone tell me how to get the template arguments from a clang::Type object? For example, if I have clang::Type for “std::vector<int>”, how do I get to this “int” type?
<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">When looking at the API reference I’m getting a bit lost with all the terminology I’m not yet familiar with, any good resources to that explains the terminology? Especially how templates are represented is still unclear to me.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Thanks in advanced for your help and a huge thanks to all the LLVM and clang contributes!<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">With Kind Regards,<u></u><u></u></p>
<p class="MsoNormal">Gert Massa<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
</div>

_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a><br>
</blockquote></div>