re PR c++/49102 ([C++0x] Use of deleted copy constructor not diagnosed)
authorJason Merrill <jason@redhat.com>
Tue, 24 May 2011 03:49:03 +0000 (23:49 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 24 May 2011 03:49:03 +0000 (23:49 -0400)
PR c++/49102
* call.c (convert_arg_to_ellipsis): Call force_rvalue.

From-SVN: r174101

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/defaulted28.C [new file with mode: 0644]

index 032c8e23475b3bb2982db2c0c8da06b128d1ed55..c00e0649f1497c8a161b20f251a987303afbee3d 100644 (file)
@@ -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.
index 8503f5ebabfb8fafbd9a0837d8d281048de363ca..ff3dc062b2e0e29a0d77d28d2dc44b1dfea03922 100644 (file)
@@ -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);
     }
index f58dea33569ef399408b5518012e72ee42ecf679..4b447eadb1af78091e0f0dacecd6e124f490c5f9 100644 (file)
@@ -1,5 +1,7 @@
 2011-05-23  Jason Merrill  <jason@redhat.com>
 
+       * 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 (file)
index 0000000..15caef6
--- /dev/null
@@ -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" }
+}