<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/xhtml; charset=utf-8">
</head>
<body>
<div style="font-family:sans-serif"><div style="white-space:normal">
<p dir="auto">On 4 Jul 2019, at 18:11, fdart via cfe-dev wrote:</p>

</div>
<div style="white-space:normal"><blockquote style="border-left:2px solid #777; color:#777; margin:0 0 5px; padding-left:5px"><p dir="auto">Hi,<br>
<br>
Given the below input to clang tooling, when I traverse ParameterMap's<br>
type, I get that std::map is a template specialization, with two nested<br>
template specializations, std::basic_string.  Therefore I can extract the<br>
information I'm looking for.<br>
#include <map><br>
<br>
using String = std::string;<br>
using ParameterMap = std::map<String, String>;<br>
<br>
<br>
<br>
If we take the indirection one step further with this input to clang tooling<br>
#include <map><br>
<br>
template <typename K, typename V> using Map = std::map<K, V>;<br>
using String = std::string;<br>
using ParameterMap = Map<String, String>;<br>
<br>
ParameterMap someFunc() { return ParameterMap(); }<br>
<br>
then String is now a SubstTemplateTypeParmType.  If I desugar that, I get<br>
that String is a record rather than a template specialization, so I cannot<br>
get the template types of String.  Is that intended?  How can I get the<br>
template information for String in this case?</p>
</blockquote></div>
<div style="white-space:normal">

<p dir="auto"><code style="background-color:#F7F7F7; border-radius:3px; margin:0; padding:0 0.4em" bgcolor="#F7F7F7">TemplateSpecializationType</code> is a sugar type representing the fact that a<br>
type was written in source as <code style="background-color:#F7F7F7; border-radius:3px; margin:0; padding:0 0.4em" bgcolor="#F7F7F7">SomeTemplate<TemplateArgs...></code>.  The<br>
template arguments there should be the source template arguments, which<br>
may differ from the true template arguments due to e.g. default arguments;<br>
similarly, the template name there might be a template alias, and the true<br>
type may not be a class type at all.</p>

<p dir="auto">If you don't particularly care about the spelling in source code and just<br>
want to check if a type ultimately names a class template specialization,<br>
you should <code style="background-color:#F7F7F7; border-radius:3px; margin:0; padding:0 0.4em" bgcolor="#F7F7F7">getAs<RecordType>()</code> and then <code style="background-color:#F7F7F7; border-radius:3px; margin:0; padding:0 0.4em" bgcolor="#F7F7F7">dyn_cast</code> the <code style="background-color:#F7F7F7; border-radius:3px; margin:0; padding:0 0.4em" bgcolor="#F7F7F7">RecordDecl</code> to<br>
<code style="background-color:#F7F7F7; border-radius:3px; margin:0; padding:0 0.4em" bgcolor="#F7F7F7">ClassTemplateSpecializationDecl</code>.</p>

<p dir="auto">John.</p>
</div>
</div>
</body>
</html>