[cfe-dev] Tracing Typedef Chain

Daniel Dilts via cfe-dev cfe-dev at lists.llvm.org
Mon Nov 30 12:48:35 PST 2015


On Mon, Nov 30, 2015 at 11:12 AM, Richard Smith <richard at metafoo.co.uk>
wrote:

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

I tried using getSingleStepDesugaredType with this code:
namespace Test
{
   typedef int X;
   typedef X Y;
   typedef Y Z;
}
Test::Z i;


std::vector<std::string> names;
names.push_back(type.getAsString());
while(true)
 {
  type = type.getSingleStepDesugaredType(*result.Context);
  names.push_back(type.getAsString());
}

getAsString() on the QualType returned this chain:
Test::Z
Z
Y
X
int

Ideally I would get this:
Test::Z
Test::Y
Test::X
int

How would I use a RecursiveASTVisitor to walk just the type?  I can figure
it out for an entire AST.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20151130/62e9e7ee/attachment.html>


More information about the cfe-dev mailing list