C++ PATCH for c++/77563, missing ambiguous conversion error
Jason Merrill
jason@redhat.com
Tue Mar 21 19:08:00 GMT 2017
This conversion is ambiguous because of its implicit context; when we
try to give the error, we need to preserve that context; a conversion
in the context of direct-initialization shouldn't get here anyway.
Tested x86_64-pc-linux-gnu, applying to trunk.
-------------- next part --------------
commit d7be189d5b2761f10f9c9a8de4c17d3e4d761abf
Author: Jason Merrill <jason@redhat.com>
Date: Tue Mar 21 12:26:51 2017 -0400
PR c++/77563 - missing ambiguous conversion error.
* call.c (convert_like_real): Use LOOKUP_IMPLICIT.
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index 86c7647..803fbd4 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -6764,7 +6764,7 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum,
if (complain & tf_error)
{
/* Call build_user_type_conversion again for the error. */
- build_user_type_conversion (totype, convs->u.expr, LOOKUP_NORMAL,
+ build_user_type_conversion (totype, convs->u.expr, LOOKUP_IMPLICIT,
complain);
if (fn)
inform (DECL_SOURCE_LOCATION (fn),
diff --git a/gcc/testsuite/g++.dg/overload/ambig3.C b/gcc/testsuite/g++.dg/overload/ambig3.C
new file mode 100644
index 0000000..01d4cc6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/overload/ambig3.C
@@ -0,0 +1,15 @@
+// PR c++/77563
+
+struct A {
+ A(int) {}
+ A(unsigned) {} // Comment to make it work
+
+ explicit A(long) {} // Comment to make it work
+};
+
+void f(A) { }
+
+int main() {
+ f(2);
+ f(3l); // { dg-error "ambiguous" }
+}
More information about the Gcc-patches
mailing list