* call.c (convert_arg_to_ellipsis): Use the result of force_rvalue.

From-SVN: r253466
This commit is contained in:
Jason Merrill 2017-10-05 17:43:01 -04:00 committed by Jason Merrill
parent f64766fde8
commit 74a2b1d572
3 changed files with 31 additions and 9 deletions

View File

@ -1,3 +1,7 @@
2017-10-05 Jason Merrill <jason@redhat.com>
* call.c (convert_arg_to_ellipsis): Use the result of force_rvalue.
2017-10-04 Jason Merrill <jason@redhat.com>
PR c++/82406 - C++ error with noexcept function type

View File

@ -7126,13 +7126,9 @@ convert_arg_to_ellipsis (tree arg, tsubst_flags_t complain)
/* In a template (or ill-formed code), we can have an incomplete type
even after require_complete_type_sfinae, in which case we don't know
whether it has trivial copy or not. */
&& COMPLETE_TYPE_P (arg_type))
&& COMPLETE_TYPE_P (arg_type)
&& !cp_unevaluated_operand)
{
/* Build up a real lvalue-to-rvalue conversion in case the
copy constructor is trivial but not callable. */
if (!cp_unevaluated_operand && CLASS_TYPE_P (arg_type))
force_rvalue (arg, complain);
/* [expr.call] 5.2.2/7:
Passing a potentially-evaluated argument of class type (Clause 9)
with a non-trivial copy constructor or a non-trivial destructor
@ -7144,10 +7140,10 @@ convert_arg_to_ellipsis (tree arg, tsubst_flags_t complain)
If the call appears in the context of a sizeof expression,
it is not potentially-evaluated. */
if (cp_unevaluated_operand == 0
&& (type_has_nontrivial_copy_init (arg_type)
|| TYPE_HAS_NONTRIVIAL_DESTRUCTOR (arg_type)))
if (type_has_nontrivial_copy_init (arg_type)
|| TYPE_HAS_NONTRIVIAL_DESTRUCTOR (arg_type))
{
arg = force_rvalue (arg, complain);
if (complain & tf_warning)
warning (OPT_Wconditionally_supported,
"passing objects of non-trivially-copyable "
@ -7155,6 +7151,11 @@ convert_arg_to_ellipsis (tree arg, tsubst_flags_t complain)
arg_type);
return cp_build_addr_expr (arg, complain);
}
/* Build up a real lvalue-to-rvalue conversion in case the
copy constructor is trivial but not callable. */
else if (CLASS_TYPE_P (arg_type))
force_rvalue (arg, complain);
}
return arg;

View File

@ -0,0 +1,17 @@
// { dg-do run }
int c;
struct X { X() {}; X(const X&) { ++c; } };
void Foo (X, ...) {}
void bin (X &p)
{
Foo (p, p);
}
int main()
{
X x;
bin(x);
if (c != 2)
__builtin_abort();
}