c++: abstract class and overload resolution
In my implementation of P0929 I treated a conversion to an rvalue of abstract class type as a bad conversion, but that's still too soon to check it; we need to wait until we're done with overload resolution. gcc/cp/ChangeLog: * call.cc (implicit_conversion_1): Rename... (implicit_conversion): ...to this. Remove the old wrapper. gcc/testsuite/ChangeLog: * g++.dg/template/sfinae-dr657.C: Adjust.
This commit is contained in:
parent
7d4e991316
commit
55731b59e6
2 changed files with 9 additions and 28 deletions
|
@ -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" }
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue