@@ -2032,12 +2032,14 @@ reference_binding (tree rto, tree rfrom, tree expr, bool c_cast_p, int flags,
return conv;
}
-/* Most of the implementation of implicit_conversion, with the same
- parameters. */
+/* Returns the implicit conversion sequence (see [over.ics]) from type
+ FROM to type TO. The optional expression EXPR may affect the
+ conversion. FLAGS are the usual overloading flags. If C_CAST_P is
+ true, this conversion is coming from a C-style cast. */
static conversion *
-implicit_conversion_1 (tree to, tree from, tree expr, bool c_cast_p,
- int flags, tsubst_flags_t complain)
+implicit_conversion (tree to, tree from, tree expr, bool c_cast_p,
+ int flags, tsubst_flags_t complain)
{
conversion *conv;
@@ -2167,26 +2169,6 @@ implicit_conversion_1 (tree to, tree from, tree expr, bool c_cast_p,
return NULL;
}
-/* Returns the implicit conversion sequence (see [over.ics]) from type
- FROM to type TO. The optional expression EXPR may affect the
- conversion. FLAGS are the usual overloading flags. If C_CAST_P is
- true, this conversion is coming from a C-style cast. */
-
-static conversion *
-implicit_conversion (tree to, tree from, tree expr, bool c_cast_p,
- int flags, tsubst_flags_t complain)
-{
- conversion *conv = implicit_conversion_1 (to, from, expr, c_cast_p,
- flags, complain);
- if (!conv || conv->bad_p)
- return conv;
- if (conv_is_prvalue (conv)
- && CLASS_TYPE_P (conv->type)
- && CLASSTYPE_PURE_VIRTUALS (conv->type))
- conv->bad_p = true;
- return conv;
-}
-
/* Like implicit_conversion, but return NULL if the conversion is bad.
This is not static so that check_non_deducible_conversion can call it within
@@ -1,7 +1,6 @@
-// DR 657 SUPERSEDED BY DR 1646
+// DR 657 SUPERSEDED BY P0929
// Test that a return or parameter type with abstract class type DOES NOT cause
-// a deduction failure, but there is no implicit conversion sequence for
-// a parameter of abstract class type.
+// a deduction failure or conversion failure.
struct A
{
@@ -19,5 +18,5 @@ template<class T> int arg(...);
int main()
{
int i = declval<A>(); // { dg-error "ambiguous" }
- i = arg<A>(1);
+ i = arg<A>(1); // { dg-error "abstract" }
}