* call.c (convert_arg_to_ellipsis): Use the result of force_rvalue.
From-SVN: r253466
This commit is contained in:
parent
f64766fde8
commit
74a2b1d572
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
}
|
Loading…
Reference in New Issue