<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link=blue vlink=purple><div class=WordSection1><p class=MsoNormal>Hi Yitzhak<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Thank you for pointing me in the right direction. The trick was to call getAsCXXRecordDecl on the type object first and then cast it to ClassTemplateSpecializationDecl .<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>clang::CXXRecordDecl * record = type->getAsCXXRecordDecl(); <o:p></o:p></p><p class=MsoNormal>if (const auto * templateDecl = llvm::dyn_cast<ClassTemplateSpecializationDecl>(record))<o:p></o:p></p><p class=MsoNormal>{<o:p></o:p></p><p class=MsoNormal>    const TemplateArgumentList & argList = templateDecl->getTemplateArgs();<o:p></o:p></p><p class=MsoNormal>    for (uint i = 0; i < argList.size(); i++)<o:p></o:p></p><p class=MsoNormal>    {<o:p></o:p></p><p class=MsoNormal>        res.AddTemplateArg(ToSimpleAst(argList.get(i).getAsType()));<o:p></o:p></p><p class=MsoNormal>    }<o:p></o:p></p><p class=MsoNormal>}<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><b>From:</b> Yitzhak Mandelbaum <yitzhakm@google.com> <br><b>Sent:</b> Monday, December 21, 2020 16:41<br><b>To:</b> Massa, Gert (DI SW STS R&D SIM ARCH) <gert.massa@siemens.com><br><b>Cc:</b> cfe-dev@lists.llvm.org<br><b>Subject:</b> Re: [cfe-dev] Getting template arguments from a clang::Type object<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><div><div><p class=MsoNormal><span style='font-family:"Arial",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:<o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-family:"Arial",sans-serif'><o:p> </o:p></span></p></div><div><p class=MsoNormal><span style='font-family:"Arial",sans-serif'>```<o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-family:"Arial",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>}<o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-family:"Arial",sans-serif'><o:p> </o:p></span></p></div><div><p class=MsoNormal><span style='font-family:"Arial",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>}<o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-family:"Arial",sans-serif'>```<o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-family:"Arial",sans-serif'><o:p> </o:p></span></p></div><div><p class=MsoNormal><span style='font-family:"Arial",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`).<o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-family:"Arial",sans-serif'>```<o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-family:"Arial",sans-serif'>auto template_instantiation =<br>            templateSpecializationTypeLoc(hasAnyTemplateArgumentLoc(<br>                templateArgumentLoc(refersToTypeLoc(inner_matcher))));<o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-family:"Arial",sans-serif'>```<o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-family:"Arial",sans-serif'><o:p> </o:p></span></p></div><div><p class=MsoNormal><span style='font-family:"Arial",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"><span style='font-size:10.5pt;color:#1A73E8'>https://godbolt.org/z/bTaoTE</span></a>. (Kudos to Richard Smith for this one...).<o:p></o:p></span></p></div></div><p class=MsoNormal><o:p> </o:p></p><div><div><p class=MsoNormal>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:<o:p></o:p></p></div><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in'><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Hi All,<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'> <o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>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? <o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'> <o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>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.<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'> <o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Thanks in advanced for your help and a huge thanks to all the LLVM and clang contributes!<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'> <o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>With Kind Regards,<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Gert Massa<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'> <o:p></o:p></p></div></div><p class=MsoNormal>_______________________________________________<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" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a><o:p></o:p></p></blockquote></div></div></body></html>