commit 0bb6493b9f08021d00a636fe5b4ea777bd4cbc13 Author: Jason Merrill Date: Fri Mar 21 06:15:02 2014 -0400 DR 1467 PR c++/51747 * decl.c (reshape_init_r): Handle a single element of class type. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 069b374..f8ae07c 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -5405,6 +5405,18 @@ reshape_init_r (tree type, reshape_iter *d, bool first_initializer_p, return init; } + /* "If T is a class type and the initializer list has a single element of + type cv U, where U is T or a class derived from T, the object is + initialized from that element." Even if T is an aggregate. */ + if (cxx_dialect >= cxx11 && CLASS_TYPE_P (type) + && first_initializer_p + && d->end - d->cur == 1 + && reference_related_p (type, TREE_TYPE (init))) + { + d->cur++; + return init; + } + /* [dcl.init.aggr] All implicit type conversions (clause _conv_) are considered when diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist83.C b/gcc/testsuite/g++.dg/cpp0x/initlist83.C new file mode 100644 index 0000000..4a5eeb6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist83.C @@ -0,0 +1,7 @@ +// DR 1467, c++/51747 +// { dg-do compile { target c++11 } } + +struct X { }; + +X x; +X x2{x}; diff --git a/gcc/testsuite/g++.dg/init/aggr4.C b/gcc/testsuite/g++.dg/init/aggr4.C index 7120e68..b0eae2e 100644 --- a/gcc/testsuite/g++.dg/init/aggr4.C +++ b/gcc/testsuite/g++.dg/init/aggr4.C @@ -4,4 +4,4 @@ struct A }; A a1 = { 1 }; // ok -A a2 = { a1 }; // { dg-error "cannot convert" } +A a2 = { a1 }; // { dg-error "cannot convert" "" { target { ! c++11 } } }