OSDN Git Service

Core 1191
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 15 Mar 2011 18:27:29 +0000 (18:27 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 15 Mar 2011 18:27:29 +0000 (18:27 +0000)
* method.c (synthezized_method_walk): Cleanups don't affect the
triviality of a constructor, but do affect deletion and exception
specification.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@171011 138bc75d-0d04-0410-961f-82ee72b054a4

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

index bbc5662..910a7e2 100644 (file)
@@ -1,3 +1,10 @@
+2011-03-15  Jason Merrill  <jason@redhat.com>
+
+       Core 1191
+       * method.c (synthesized_method_walk): Cleanups don't affect the
+       triviality of a constructor, but do affect deletion and exception
+       specification.
+
 2011-03-15  Rodrigo Rivas Costa  <rodrigorivascosta@gmail.com>
 
        * decl2.c (cp_check_const_attributes): New.
index d70da95..0366988 100644 (file)
@@ -1080,14 +1080,9 @@ synthesized_method_walk (tree ctype, special_function_kind sfk, bool const_p,
   tsubst_flags_t complain;
   const char *msg;
   bool ctor_p;
-  tree cleanup_spec;
-  bool cleanup_trivial = true;
-  bool cleanup_deleted = false;
 
-  cleanup_spec
-    = (cxx_dialect >= cxx0x ? noexcept_true_spec : empty_except_spec);
   if (spec_p)
-    *spec_p = cleanup_spec;
+    *spec_p = (cxx_dialect >= cxx0x ? noexcept_true_spec : empty_except_spec);
 
   if (deleted_p)
     {
@@ -1228,8 +1223,10 @@ synthesized_method_walk (tree ctype, special_function_kind sfk, bool const_p,
             destructors for cleanup of partially constructed objects.  */
          rval = locate_fn_flags (base_binfo, complete_dtor_identifier,
                                  NULL_TREE, flags, complain);
-         process_subob_fn (rval, false, &cleanup_spec, &cleanup_trivial,
-                           &cleanup_deleted, NULL, NULL,
+         /* Note that we don't pass down trivial_p; the subobject
+            destructors don't affect triviality of the constructor.  */
+         process_subob_fn (rval, false, spec_p, NULL,
+                           deleted_p, NULL, NULL,
                            basetype);
        }
 
@@ -1275,8 +1272,8 @@ 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, &cleanup_spec, &cleanup_trivial,
-                               &cleanup_deleted, NULL, NULL,
+             process_subob_fn (rval, false, spec_p, NULL,
+                               deleted_p, NULL, NULL,
                                basetype);
            }
        }
@@ -1295,23 +1292,14 @@ 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, &cleanup_spec, &cleanup_trivial,
-                      &cleanup_deleted, NULL,
+                      false, false, spec_p, NULL,
+                      deleted_p, NULL,
                       NULL, flags, complain);
 
   pop_scope (scope);
 
   --cp_unevaluated_operand;
   --c_inhibit_evaluation_warnings;
-
-  /* If the constructor isn't trivial, consider the subobject cleanups.  */
-  if (ctor_p && trivial_p && !*trivial_p)
-    {
-      if (deleted_p && cleanup_deleted)
-       *deleted_p = true;
-      if (spec_p)
-       *spec_p = merge_exception_specifiers (*spec_p, cleanup_spec);
-    }
 }
 
 /* DECL is a deleted function.  If it's implicitly deleted, explain why and
index 40c5316..3d75d5e 100644 (file)
@@ -1,3 +1,7 @@
+2011-03-15  Jason Merrill  <jason@redhat.com>
+
+       * g++.dg/cpp0x/implicit11.C: New.
+
 2011-03-15  Rodrigo Rivas Costa  <rodrigorivascosta@gmail.com>
 
        * g++.dg/cpp0x/constexpr-attribute.C: New.
diff --git a/gcc/testsuite/g++.dg/cpp0x/implicit11.C b/gcc/testsuite/g++.dg/cpp0x/implicit11.C
new file mode 100644 (file)
index 0000000..7ec8e95
--- /dev/null
@@ -0,0 +1,17 @@
+// Test that we consider base dtors in determining whether
+// a derived ctor is deleted even if the ctor is trivial.
+// { dg-options -std=c++0x }
+
+struct A
+{
+  ~A() = delete;               // { dg-error "declared here" }
+};
+
+struct B: A { };               // { dg-error "deleted" }
+
+extern B eb;
+int main()
+{
+  B* b1 = new B;               // { dg-error "use of deleted function" "" { xfail *-*-* } }
+  B* b2 = new B(eb);           // { dg-error "use of deleted function" }
+}