[cfe-dev] Tracing Typedef Chain

Richard Smith via cfe-dev cfe-dev at lists.llvm.org
Mon Nov 30 11:12:52 PST 2015


On Mon, Nov 30, 2015 at 10:51 AM, Daniel Dilts via cfe-dev <
cfe-dev at lists.llvm.org> wrote:

> I tried this with:
> auto t = type.getTypePtr();
> auto tt = dyn_cast<TypedefType>(t);
> while(tt) {
>   tt->getDecl()->dumpColor();
>   auto x = tt->getDecl()->getNameAsString();
>   tt = dyn_cast<TypedefType>(tt->desugar().getTypePtr());
> }
>
> It appeared to work fine when the typedef was at global scope, but when I
> put the typedef in a namespace the first dyn_cast returned nullptr.
>

Right, in that case you will have an ElaboratedType representing the nested
name specifier written in the source, which desugars to the TypedefType.
Clang has a very rich modeling of type sugar, and you should expect to see
things other than TypedefTypes in your walk.

Depending on what you're trying to do, you might want to consider visiting
the type with a RecursiveASTVisitor or repeatedly calling
getSingleStepDesugaredType to walk the desugarings of the type, or changing
your dyn_cast<TypedefType>(x) calls into x.getAs<TypedefType>() (which will
find the minimally-desugared typedef type in the single-step desugaring
sequence for x).


> On Wed, Nov 25, 2015 at 1:49 PM, Yaron Keren <yaron.keren at gmail.com>
> wrote:
>
>> Maybe
>>
>> Type *T = QT.getTypePtr();
>> TypedefType *TT = cast<TypedefType>(T);
>> TT->getDecl()->dumpColor();
>>
>>
>> 2015-11-25 23:42 GMT+02:00 Régis Portalez <cfe-dev at lists.llvm.org>:
>>
>>> At what level are you working? Once in llvm IR, you can cast your type
>>> to derived type, and then get the element type
>>> ------------------------------
>>> De : Daniel Dilts via cfe-dev <cfe-dev at lists.llvm.org>
>>> Envoyé : ‎25/‎11/‎2015 22:13
>>> À : cfe-dev <cfe-dev at lists.llvm.org>
>>> Objet : Re: [cfe-dev] Tracing Typedef Chain
>>>
>>> I'm struggling to make this work.  Could you possibly give me a more
>>> complete example?
>>>
>>> On Mon, Nov 23, 2015 at 9:05 AM, mats petersson <mats at planetcatfish.com>
>>> wrote:
>>>
>>>> If you call `getTypePtr` it should give you the "next" type.
>>>>
>>>> --
>>>> Mats
>>>>
>>>> On 23 November 2015 at 16:27, Daniel Dilts via cfe-dev <
>>>> cfe-dev at lists.llvm.org> wrote:
>>>>
>>>>> If I have code like this:
>>>>>
>>>>> typedef int X;
>>>>> typedef X Y;
>>>>> typedef Y Z;
>>>>>
>>>>> Z i = 0;
>>>>>
>>>>> I have the QualType for i.  getAsString() returns "Z".
>>>>> getCanonicalType().getAsString() returns "int".
>>>>>
>>>>> Is there some way to trace the typedef chain such that I get "Z", "Y",
>>>>> "X", and "int"?  Order is not particularly important to me, but it would be
>>>>> nice to get them in that order.
>>>>>
>>>>> _______________________________________________
>>>>> cfe-dev mailing list
>>>>> cfe-dev at lists.llvm.org
>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>>>>>
>>>>>
>>>>
>>>
>>> _______________________________________________
>>> cfe-dev mailing list
>>> cfe-dev at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>>>
>>>
>>
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20151130/dc45ecce/attachment.html>


More information about the cfe-dev mailing list