C++ PATCH for c++/53733 (DR 1402, deleting move ctor)

Message ID 4FFB71A5.3070800@redhat.com
State New
Headers show

Commit Message

Jason Merrill July 10, 2012, 12:04 a.m.
Apparently we need to implement DR 1402 in 4.7 in order to fix the 
std::pair ABI breakage properly.  So here it is: if overload resolution 
chooses a non-trivial copy constructor, instead of causing the move 
constructor to be deleted, we just don't implicitly declare it.

Tested x86_64-pc-linux-gnu, applying to trunk and 4.7.

While I was looking at this, I noticed that my earlier fix to handling 
of cleanups vs. ctor exception specifications was incomplete, so I've 
fixed that too.


commit d0334cc0204e8bff2aada54b8f9c73fdc3ebcd50
Author: Jason Merrill <jason@redhat.com>
Date:   Tue Jul 10 01:42:02 2012 +0200

    	* method.c (synthesized_method_walk): Avoid changing
    	EH spec based on cleanups in other places, too.

diff --git a/gcc/cp/method.c b/gcc/cp/method.c
index 0237456..7ea2de9 100644
--- a/gcc/cp/method.c
+++ b/gcc/cp/method.c
@@ -1315,7 +1315,7 @@  synthesized_method_walk (tree ctype, special_function_kind sfk, bool const_p,
 	      rval = locate_fn_flags (base_binfo, complete_dtor_identifier,
 				      NULL_TREE, flags, complain);
-	      process_subob_fn (rval, false, spec_p, NULL,
+	      process_subob_fn (rval, false, NULL, NULL,
 				deleted_p, NULL, NULL,
@@ -1335,7 +1335,7 @@  synthesized_method_walk (tree ctype, special_function_kind sfk, bool const_p,
   if (ctor_p)
     walk_field_subobs (TYPE_FIELDS (ctype), complete_dtor_identifier,
 		       sfk_destructor, TYPE_UNQUALIFIED, false,
-		       false, false, spec_p, NULL,
+		       false, false, NULL, NULL,
 		       deleted_p, NULL,
 		       NULL, flags, complain);
diff --git a/gcc/testsuite/g++.dg/cpp0x/implicit13.C b/gcc/testsuite/g++.dg/cpp0x/implicit13.C
index 96bc770..3165863 100644
--- a/gcc/testsuite/g++.dg/cpp0x/implicit13.C
+++ b/gcc/testsuite/g++.dg/cpp0x/implicit13.C
@@ -14,7 +14,7 @@  struct B: A { };
 // { dg-final { scan-assembler-not "_ZN1BC1Ev" } }
 B b;
-struct C { C() noexcept; ~C(); };
+struct C { C() noexcept; ~C() noexcept(false); };
 struct D: C { };
 extern D d;
@@ -22,3 +22,11 @@  void *operator new(__SIZE_TYPE__, void*) noexcept;
 #define SA(X) static_assert((X),#X)
 SA(noexcept(new (&d) D));
+struct E: virtual C { };
+extern E e;
+SA(noexcept (new (&e) E));
+struct F { C c; };
+extern F f;
+SA(noexcept (new (&f) F));