<div dir="ltr">On Wed, Sep 4, 2013 at 4:24 AM, Enea Zaffanella <span dir="ltr"><<a href="mailto:zaffanella@cs.unipr.it" target="_blank">zaffanella@cs.unipr.it</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">When dumping the following C++11 chunk of code<br>
<br>
$ cat chunk.cc<br>
struct A { A(int, int); };<br>
A a_paren( A(0,0) );<br>
A a_range( A{0,0} );<br>
<br>
the CXXTemporaryObjectExpr generated by A{0,0}<br>
is missing a proper end location<br>
(the source location is correctly set for A(0,0)).<br>
<br>
$ clang -cc1 -std=c++11 -ast-dump chunk.cc<br>
[...]<br>
`-VarDecl 0x5a963e0 <line:3:1, col:19> a_range 'struct A'<br>
  `-CXXConstructExpr 0x5a96570 <col:3, col:19> 'struct A' 'void (struct A &&) noexcept' elidable<br>
    `-MaterializeTemporaryExpr 0x5a96550 <col:12, <invalid sloc>> 'struct A' xvalue<br>
      `-CXXTemporaryObjectExpr 0x5a964d8 <col:12, <invalid sloc>> 'struct A' 'void (int, int)'<br>
        |-IntegerLiteral 0x5a96448 <col:14> 'int' 0<br>
        `-IntegerLiteral 0x5a96468 <col:16> 'int' 0<br>
<br>
<br>
Please find attached a patch (with testcase) fixing this issue.<br>
OK to commit?<br><span class=""><font color="#888888"><br></font></span></blockquote><div><br></div><div>+    if (Kind.getKind() == InitializationKind::IK_DirectList)</div><div>+      ParenRange = SourceRange(LBraceLoc, RBraceLoc);</div>
<div>+    else</div><div>       ParenRange = Kind.getParenRange();</div><div><br></div><div>This isn't right: there aren't any parentheses.  getParenRange() on a CXXTemporaryObjectExpr shouldn't return source locations pointing at tokens which aren't parentheses.</div>
<div><br></div><div>You should be able to fix this purely in CXXTemporaryObjectExpr::getLocStart()/getLocEnd().</div><div><br></div><div>-Eli</div></div></div></div>