<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Thu, Jan 29, 2015 at 2:24 AM, Abramo Bagnara <span dir="ltr"><<a href="mailto:abramo.bagnara@bugseng.com" target="_blank">abramo.bagnara@bugseng.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Il 28/01/2015 23:07, Richard Smith ha scritto:<br>
> Fixed in r227377.<br>
<br>
I'm not sure it is related to your commit, but trying to validate your<br>
changes I've discovered a regression between r224592 and r227424.<br>
<br>
For the source:<br>
<br>
#include <initializer_list><br>
<br>
typedef std::initializer_list<bool> T;<br>
struct A {<br>
  A(T) {}<br>
};<br>
<br>
void f() {<br>
  T x;<br>
  A y = {x};<br>
}<br>
<br>
in r224592 we used to get with -ast-print for last function:<br>
<br>
void f() {<br>
    T x;<br>
    A y = { x };<br>
}<br>
<br>
in r227424 we get:<br>
<br>
<br>
void f() {<br>
    T x;<br>
    A y = { { { x } } };<br>
}<br>
<br>
The difference comes from different AST, r224592:<br>
<br>
    `-DeclStmt 0x72db9a8 <line:10:3, col:12><br>
      `-VarDecl 0x72db1d0 <col:3, col:11> col:5 y 'struct A' cinit<br>
        `-CXXConstructExpr 0x72db970 <col:9, col:11> 'struct A' 'void (T)'<br>
          `-CXXConstructExpr 0x72db818 <col:10> 'T':'class<br>
std::initializer_list<_Bool>' 'void (const class<br>
std::initializer_list<_Bool> &) noexcept'<br>
            `-ImplicitCastExpr 0x72db640 <col:10> 'const class<br>
std::initializer_list<_Bool>' lvalue <NoOp><br>
              `-DeclRefExpr 0x72db228 <col:10> 'T':'class<br>
std::initializer_list<_Bool>' lvalue Var 0x72dacb0 'x' 'T':'class<br>
std::initializer_list<_Bool>'<br>
<br>
<br>
while r227424:<br>
<br>
    `-DeclStmt 0x8c99f08 <line:10:3, col:12><br>
      `-VarDecl 0x8c996e0 <col:3, col:11> col:5 y 'struct A' cinit<br>
        `-CXXConstructExpr 0x8c99ed0 <col:9, col:11> 'struct A' 'void (T)'<br>
          `-CXXConstructExpr 0x8c99d78 <col:9, col:11> 'T':'class<br>
std::initializer_list<_Bool>' 'void (const class<br>
std::initializer_list<_Bool> &) noexcept'<br>
            `-InitListExpr 0x8c99b68 <col:9, col:11> 'const class<br>
std::initializer_list<_Bool>' lvalue<br>
              `-ImplicitCastExpr 0x8c99b50 <col:10> 'const class<br>
std::initializer_list<_Bool>' lvalue <NoOp><br>
                `-DeclRefExpr 0x8c99738 <col:10> 'T':'class<br>
std::initializer_list<_Bool>' lvalue Var 0x8c991c0 'x' 'T':'class<br>
std::initializer_list<_Bool>'<br>
<br>
<br>
What I can see is:<br>
1) a NoOp ImplicitCastExpr apparently needless in both<br></blockquote><div><br></div><div>It's not needless, it's adding a 'const' qualifier to the lvalue.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
2) an extra InitListExpr in r227424</blockquote><div><br></div><div>This is weird and looks wrong, but it's unlikely to be related to r227377. Possibly caused by the changes for DR1467?</div></div></div></div>