From: Jason Merrill Date: Thu, 5 Apr 2018 04:01:15 +0000 (-0400) Subject: PR c++/85215 - ICE with copy-init from conversion. X-Git-Tag: basepoints/gcc-9~311 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=da0c8d9793df1083a21628efdb6368174d2d78d4;p=thirdparty%2Fgcc.git PR c++/85215 - ICE with copy-init from conversion. * call.c (merge_conversion_sequences): Fix type of direct binding sequence. From-SVN: r259123 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 22f3e42f0cb6..fd33f00f8d1d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2018-04-04 Jason Merrill + PR c++/85215 - ICE with copy-init from conversion. + * call.c (merge_conversion_sequences): Fix type of direct binding + sequence. + PR c++/84938 - ICE with division by ~-1. * call.c (set_up_extended_ref_temp): Call cp_fully_fold. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 7c99e8ad9100..f2ada2768de7 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -3642,6 +3642,12 @@ merge_conversion_sequences (conversion *user_seq, conversion *std_seq) (*t)->bad_p = true; } + if ((*t)->rvaluedness_matches_p) + /* We're binding a reference directly to the result of the conversion. + build_user_type_conversion_1 stripped the REFERENCE_TYPE from the return + type, but we want it back. */ + user_seq->type = TREE_TYPE (TREE_TYPE (user_seq->cand->fn)); + /* Replace the identity conversion with the user conversion sequence. */ *t = user_seq; diff --git a/gcc/testsuite/g++.dg/cpp1z/elide3.C b/gcc/testsuite/g++.dg/cpp1z/elide3.C new file mode 100644 index 000000000000..ca4d24708a8b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/elide3.C @@ -0,0 +1,15 @@ +// PR c++/85215 +// { dg-do compile { target c++11 } } + +template struct vector { + vector(vector &&) noexcept; +}; + +template struct any_container { + operator vector &&(); +}; + +void f (any_container c) +{ + vector shape (c); +}