]> gcc.gnu.org Git - gcc.git/commitdiff
re PR c++/46497 ([C++0x] Defaulted vs declared move constructor vs is_convertible)
authorJason Merrill <jason@redhat.com>
Wed, 17 Nov 2010 01:43:10 +0000 (20:43 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 17 Nov 2010 01:43:10 +0000 (20:43 -0500)
PR c++/46497
* call.c (build_over_call): Check for =delete even when trivial.

From-SVN: r166851

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

index e32c3b7e87782008d200ec21aab6bef4e2d4f6b8..d651ba8edcf45dd221d27f5ce37dd15d4d9b251d 100644 (file)
@@ -1,5 +1,8 @@
 2010-11-16  Jason Merrill  <jason@redhat.com>
 
+       PR c++/46497
+       * call.c (build_over_call): Check for =delete even when trivial.
+
        DR 1004
        * decl.c (make_unbound_class_template): Handle using
        injected-type-name as template.
index eb7247dad93fbde156fe1d9ff91d43cd7a265eef..7fa1cf633a297d5cebe38f5d337301c807909999 100644 (file)
@@ -6057,7 +6057,7 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
        }
       /* [class.copy]: the copy constructor is implicitly defined even if
         the implementation elided its use.  */
-      else if (!trivial)
+      else if (!trivial || DECL_DELETED_FN (fn))
        {
          mark_used (fn);
          already_used = true;
@@ -6086,7 +6086,8 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
        }
     }
   else if (DECL_OVERLOADED_OPERATOR_P (fn) == NOP_EXPR
-          && trivial_fn_p (fn))
+          && trivial_fn_p (fn)
+          && !DECL_DELETED_FN (fn))
     {
       tree to = stabilize_reference
        (cp_build_indirect_ref (argarray[0], RO_NULL, complain));
index e40c1e9760ba0526da398c1ed66bad4eb66c524f..76540df89d5a7e1b061aa822e33638cae4f1c023 100644 (file)
@@ -1,5 +1,7 @@
 2010-11-16  Jason Merrill  <jason@redhat.com>
 
+       * g++.dg/cpp0x/defaulted20.C: New.
+
        * g++.dg/template/injected2.C: New.
 
 2010-11-17  Nicola Pero  <nicola.pero@meta-innovation.com>
diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted20.C b/gcc/testsuite/g++.dg/cpp0x/defaulted20.C
new file mode 100644 (file)
index 0000000..d9ad04f
--- /dev/null
@@ -0,0 +1,19 @@
+// PR c++/46497
+// { dg-options -std=c++0x }
+
+struct A {
+  A(A&&) = default;            // { dg-message "A::A" }
+};
+struct B {
+  const A a;
+  B(const B&) = default;
+  B(B&&) = default;            // { dg-error "implicitly deleted|no match" }
+};
+
+void g(B);                     // { dg-error "argument 1" }
+B&& f();
+
+int main()
+{
+  g(f());                      // { dg-error "deleted" }
+}
This page took 0.10639 seconds and 5 git commands to generate.