<div dir="ltr">Hi all,<div>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 <span style="font-family:monospace,monospace">getRetValue()->getSourceRange() in comments</span>):</div><div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">struct foo { </font><span style="font-family:monospace,monospace">foo (int x){} </span><span style="font-family:monospace,monospace">};</span></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">foo fun0 () { </font><span style="font-family:monospace,monospace">return foo(0); </span><span style="font-family:monospace,monospace">} //  foo(0)</span></div><div><font face="monospace, monospace">foo fun1 () { </font><span style="font-family:monospace,monospace">foo f1(1); </span><span style="font-family:monospace,monospace">return f1; </span><span style="font-family:monospace,monospace">} </span><span style="font-family:monospace,monospace">//  f1</span></div><div><font face="monospace, monospace">foo fun2 () { </font><span style="font-family:monospace,monospace">return {2}; </span><span style="font-family:monospace,monospace">} // </span><span style="font-family:monospace,monospace">{2}</span></div><div><font face="monospace, monospace">foo fun3 () { </font><span style="font-family:monospace,monospace">return 3; </span><span style="font-family:monospace,monospace">} // <font color="#cc0000" style="">return 3</font></span></div></div><div><span style="font-family:monospace,monospace;font-size:x-small"><font color="#cc0000"><br></font></span></div><div><div>So in the last case getRetValue()  source range is "return 3".  To me this looks more like a bug, than a feature. </div><div><br></div><div>From AST point of view fun0 and fun 3 are pretty similar:</div><div><br></div><div>return from fun0:</div><div><div><br></div><div>ExprWithCleanups 0x4593138 'struct foo'</div><div>`-CXXConstructExpr 0x4593100 'struct foo' 'void (struct foo &&) noexcept' elidable</div><div>  `-MaterializeTemporaryExpr 0x4593098 'struct foo' xvalue</div><div>    `-CXXFunctionalCastExpr 0x4593070 'struct foo' functional cast to struct foo <ConstructorConversion></div><div>      `-CXXConstructExpr 0x4592ee8 'struct foo' 'void (int)'</div><div>        `-IntegerLiteral 0x4592b48 'int' 0</div></div><div><br></div><div><br></div><div>return from fun3:</div><div><br></div><div><div>ExprWithCleanups 0x37393f8 'struct foo'</div><div>`-CXXConstructExpr 0x37393c0 'struct foo' 'void (struct foo &&) noexcept' elidable</div><div>  `-MaterializeTemporaryExpr 0x37393a8 'struct foo' xvalue</div><div>    `-ImplicitCastExpr 0x3739390 'struct foo' <ConstructorConversion></div><div>      `-CXXConstructExpr 0x3739358 'struct foo' 'void (int)'</div><div>        `-IntegerLiteral 0x3739338 'int' 3</div></div><div><br></div><div>-Roman</div><div></div></div></div>