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