[cfe-dev] ReturnStmt::getRetValue() location: bug or feature?

Roman Popov via cfe-dev cfe-dev at lists.llvm.org
Tue Oct 31 14:49:20 PDT 2017

Hi all,
I want to find location of return expression, i.e. location between end of
return keyword and semicolon. Initially I thought that SourceRange
of ReturnStmt::getRetValue() is exactly what I need. But it is not, here
are results for this small code sample ( I put text that corresponds
to getRetValue()->getSourceRange()
in comments):

struct foo { foo (int x){} };

foo fun0 () { return foo(0); } //  foo(0)
foo fun1 () { foo f1(1); return f1; } //  f1
foo fun2 () { return {2}; } // {2}
foo fun3 () { return 3; } // return 3

So in the last case getRetValue()  source range is "return 3".  To me this
looks more like a bug, than a feature.

>From AST point of view fun0 and fun 3 are pretty similar:

return from fun0:

ExprWithCleanups 0x4593138 'struct foo'
`-CXXConstructExpr 0x4593100 'struct foo' 'void (struct foo &&) noexcept'
  `-MaterializeTemporaryExpr 0x4593098 'struct foo' xvalue
    `-CXXFunctionalCastExpr 0x4593070 'struct foo' functional cast to
struct foo <ConstructorConversion>
      `-CXXConstructExpr 0x4592ee8 'struct foo' 'void (int)'
        `-IntegerLiteral 0x4592b48 'int' 0

return from fun3:

ExprWithCleanups 0x37393f8 'struct foo'
`-CXXConstructExpr 0x37393c0 'struct foo' 'void (struct foo &&) noexcept'
  `-MaterializeTemporaryExpr 0x37393a8 'struct foo' xvalue
    `-ImplicitCastExpr 0x3739390 'struct foo' <ConstructorConversion>
      `-CXXConstructExpr 0x3739358 'struct foo' 'void (int)'
        `-IntegerLiteral 0x3739338 'int' 3

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

More information about the cfe-dev mailing list