[cfe-dev] Getting SubstTemplateTypeParmType Template Info

John McCall via cfe-dev cfe-dev at lists.llvm.org
Thu Jul 11 21:30:06 PDT 2019


On 4 Jul 2019, at 18:11, fdart via cfe-dev wrote:
> Hi,
>
> Given the below input to clang tooling, when I traverse ParameterMap's
> type, I get that std::map is a template specialization, with two 
> nested
> template specializations, std::basic_string.  Therefore I can extract 
> the
> information I'm looking for.
> #include <map>
>
> using String = std::string;
> using ParameterMap = std::map<String, String>;
>
>
>
> If we take the indirection one step further with this input to clang 
> tooling
> #include <map>
>
> template <typename K, typename V> using Map = std::map<K, V>;
> using String = std::string;
> using ParameterMap = Map<String, String>;
>
> ParameterMap someFunc() { return ParameterMap(); }
>
> then String is now a SubstTemplateTypeParmType.  If I desugar that, I 
> get
> that String is a record rather than a template specialization, so I 
> cannot
> get the template types of String.  Is that intended?  How can I get 
> the
> template information for String in this case?

`TemplateSpecializationType` is a sugar type representing the fact that 
a
type was written in source as `SomeTemplate<TemplateArgs...>`.  The
template arguments there should be the source template arguments, which
may differ from the true template arguments due to e.g. default 
arguments;
similarly, the template name there might be a template alias, and the 
true
type may not be a class type at all.

If you don't particularly care about the spelling in source code and 
just
want to check if a type ultimately names a class template 
specialization,
you should `getAs<RecordType>()` and then `dyn_cast` the `RecordDecl` to
`ClassTemplateSpecializationDecl`.

John.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20190712/36875345/attachment.html>


More information about the cfe-dev mailing list