[cfe-dev] TypeAliasDecl SourceRange is not giving proper range

Richard Smith richard at metafoo.co.uk
Thu Mar 28 13:16:04 PDT 2013


On Thu, Mar 28, 2013 at 5:29 AM, Abir Basak <abirbasak at gmail.com> wrote:

> I am new to clang ast, and trying to parse some c++ code with it.
> When I am using TypedefDecl->getSourceRange() for say
> typedef long double LDBL it returns the whole thing
> However when I am using TypeAliasDecl->getSourceRange() for say
> using LDBL = long double
> it only returns the range using LDBL = long. (i.e removes the double part)
> I used the code below to extract text from SourceRange
> char const* first = sm.getCharacterData(r.getBegin());
>  char const* last =
> sm.getCharacterData(pp.getLocForEndOfToken(r.getEnd()));
>  return std::string(first,last);

The problem here is that BuiltinTypeLoc doesn't store the source locations
for every keyword in the type, just for (apparently) the first one.
Consequently, BuiltinTypeLoc::getLocalSourceRange() always returns a
one-keyword range, and TypeAliasDecl::getSourceRange() picks the end of
that range as the end of the declaration.

> Am I doing something wrong? How can I get the whole source range, and esp
> the type part of it i.e. long double part, so that I can rearrange it as
> typedef long double LDBL
> I am using clang 3.2 with RAV

We should fix BuiltinTypeLoc to track the end location in the
needsExtraLocalData() case. If you want a workaround for this, you could
re-lex tokens from the end location until you hit a semicolon (this is
imperfect in the presence of macros, but your code isn't robust against
macro expansions within the alias declaration anyway, so this may be enough
for your purposes) -- or even just scan through the character data until
you hit a semicolon if you're not concerned about comments at the end of
the declaration.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20130328/80588198/attachment.html>

More information about the cfe-dev mailing list