c++: explicit ctor and list-initialization [PR109159]
commita226590fefb35ed66adf73d85cefe49048a78ab8
authorMarek Polacek <polacek@redhat.com>
Fri, 17 Mar 2023 22:25:13 +0000 (17 18:25 -0400)
committerMarek Polacek <polacek@redhat.com>
Mon, 20 Mar 2023 20:54:11 +0000 (20 16:54 -0400)
treee28402d0be762f0e62247b7c5978b0f4de753961
parent0a846340b99675d57fc2f2923a0412134eed09d3
c++: explicit ctor and list-initialization [PR109159]

When I implemented explicit(bool) in r9-3735, I added this code to
add_template_candidate_real:
+  /* Now the explicit specifier might have been deduced; check if this
+     declaration is explicit.  If it is and we're ignoring non-converting
+     constructors, don't add this function to the set of candidates.  */
+  if ((flags & LOOKUP_ONLYCONVERTING) && DECL_NONCONVERTING_P (fn))
+    return NULL;
but as this test demonstrates, that's incorrect when we're initializing
from a {}: for list-initialization we consider explicit constructors and
complain if one is chosen.

PR c++/109159

gcc/cp/ChangeLog:

* call.cc (add_template_candidate_real): Add explicit decls to the
set of candidates when the initializer is a braced-init-list.

libstdc++-v3/ChangeLog:

* testsuite/20_util/pair/cons/explicit_construct.cc: Adjust dg-error.
* testsuite/20_util/tuple/cons/explicit_construct.cc: Likewise.
* testsuite/23_containers/span/explicit.cc: Likewise.

gcc/testsuite/ChangeLog:

* g++.dg/cpp0x/explicit16.C: New test.
gcc/cp/call.cc
gcc/testsuite/g++.dg/cpp0x/explicit16.C [new file with mode: 0644]
libstdc++-v3/testsuite/20_util/pair/cons/explicit_construct.cc
libstdc++-v3/testsuite/20_util/tuple/cons/explicit_construct.cc
libstdc++-v3/testsuite/23_containers/span/explicit.cc