From 874aeeede55641e963f98fa663653aafa2a16d87 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Mon, 23 May 2011 23:49:03 -0400 Subject: [PATCH] re PR c++/49102 ([C++0x] Use of deleted copy constructor not diagnosed) PR c++/49102 * call.c (convert_arg_to_ellipsis): Call force_rvalue. From-SVN: r174101 --- gcc/cp/ChangeLog | 3 +++ gcc/cp/call.c | 13 +++++++++---- gcc/testsuite/ChangeLog | 2 ++ gcc/testsuite/g++.dg/cpp0x/defaulted28.C | 15 +++++++++++++++ 4 files changed, 29 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/defaulted28.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 032c8e23475..c00e0649f14 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2011-05-23 Jason Merrill + PR c++/49102 + * call.c (convert_arg_to_ellipsis): Call force_rvalue. + PR c++/49105 * typeck.c (cp_build_c_cast): Don't strip cv-quals when converting to reference. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 8503f5ebabf..ff3dc062b2e 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -5905,10 +5905,13 @@ convert_arg_to_ellipsis (tree arg) /* In a template (or ill-formed code), we can have an incomplete type even after require_complete_type, in which case we don't know whether it has trivial copy or not. */ - && COMPLETE_TYPE_P (arg_type) - && (type_has_nontrivial_copy_init (arg_type) - || TYPE_HAS_NONTRIVIAL_DESTRUCTOR (arg_type))) + && COMPLETE_TYPE_P (arg_type)) { + /* Build up a real lvalue-to-rvalue conversion in case the + copy constructor is trivial but not callable. */ + if (CLASS_TYPE_P (arg_type)) + force_rvalue (arg, tf_warning_or_error); + /* [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 @@ -5920,7 +5923,9 @@ convert_arg_to_ellipsis (tree arg) If the call appears in the context of a sizeof expression, it is not potentially-evaluated. */ - if (cp_unevaluated_operand == 0) + if (cp_unevaluated_operand == 0 + && (type_has_nontrivial_copy_init (arg_type) + || TYPE_HAS_NONTRIVIAL_DESTRUCTOR (arg_type))) error ("cannot pass objects of non-trivially-copyable " "type %q#T through %<...%>", arg_type); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f58dea33569..4b447eadb1a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,7 @@ 2011-05-23 Jason Merrill + * g++.dg/cpp0x/defaulted28.C: New. + * g++.dg/cpp0x/sfinae25.C: New. * g++.dg/cpp0x/rv-cast2.C: New. diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted28.C b/gcc/testsuite/g++.dg/cpp0x/defaulted28.C new file mode 100644 index 00000000000..15caef6cca6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted28.C @@ -0,0 +1,15 @@ +// PR c++/49102 +// { dg-options -std=c++0x } + +struct A { + A() = default; + +private: + A(A const&) = default; // { dg-error "private" } +}; + +void f(...) { } +int main() { + A a; + f(a); // { dg-error "this context" } +} -- 2.30.2