https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90320
Jonathan Wakely <redi at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Known to work| |5.5.0 Keywords| |rejects-valid Last reconfirmed| |2019-05-24 CC| |paolo at gcc dot gnu.org Ever confirmed|0 |1 Summary|Explicit constructor called |[7/8/9/10 Regression] |implicitly |Explicit constructor called | |implicitly Known to fail| |10.0, 6.5.0, 7.4.0, 8.3.0, | |9.1.0 --- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> --- Here's a rejects-valid testcase that Clang and EDG accept: struct M { M() = default; template <typename T> explicit M(T&&) = delete; }; struct V { V(M m); }; M m; V v = m; GCC tries to use the deleted constructor template instead of the copy constructor when initializing the parameter of V::V(M): m.cc:11:7: error: use of deleted function ‘M::M(T&&) [with T = M&]’ V v = m; ^ m.cc:3:34: note: declared here template <typename T> explicit M(T&&) = delete; ^ m.cc:7:3: note: initializing argument 1 of ‘V::V(M)’ V(M m); ^ M::M<M&>(M&) is a better match for a non-const lvalue than the implicit M::M(const M&) copy constructor, but because it's explicit it shouldn't be used. GCC 5 compiled it OK (with -std=c++11) but it started to be rejected with r225705: PR c++/54521 * call.c (convert_like_real): Do not set LOOKUP_ONLYCONVERTING for the second step of copy-initialization.