aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2011-05-23 23:49:03 -0400
committerJason Merrill <jason@gcc.gnu.org>2011-05-23 23:49:03 -0400
commit874aeeede55641e963f98fa663653aafa2a16d87 (patch)
treeab58bc86946cf6084204861e09cb6a81cd300862 /gcc/cp
parenta345e45d144c0e83aed85b6d29f64af3d21b4453 (diff)
downloadgcc-874aeeede55641e963f98fa663653aafa2a16d87.zip
gcc-874aeeede55641e963f98fa663653aafa2a16d87.tar.gz
gcc-874aeeede55641e963f98fa663653aafa2a16d87.tar.bz2
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
Diffstat (limited to 'gcc/cp')
-rw-r--r--gcc/cp/ChangeLog3
-rw-r--r--gcc/cp/call.c13
2 files changed, 12 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 032c8e2..c00e064 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,8 @@
2011-05-23 Jason Merrill <jason@redhat.com>
+ 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 8503f5e..ff3dc06 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);
}