OSDN Git Service

* method.c (synthesized_method_walk): Cleanups don't affect the EH
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 10 Jul 2012 00:05:38 +0000 (00:05 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 10 Jul 2012 00:05:38 +0000 (00:05 +0000)
spec either.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@189397 138bc75d-0d04-0410-961f-82ee72b054a4

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

index c8216f6..16460b7 100644 (file)
@@ -1,3 +1,8 @@
+2012-07-10  Jason Merrill  <jason@redhat.com>
+
+       * method.c (synthesized_method_walk): Cleanups don't affect the EH
+       spec either.
+
 2012-07-02  Jason Merrill  <jason@redhat.com>
 
        PR c++/53816
index be3a779..bb43500 100644 (file)
@@ -1272,8 +1272,11 @@ 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);
          /* 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,
+            destructors don't affect triviality of the constructor.  Nor
+            do they affect constexpr-ness (a constant expression doesn't
+            throw) or exception-specification (a throw from one of the
+            dtors would be a double-fault).  */
+         process_subob_fn (rval, false, NULL, NULL,
                            deleted_p, NULL, NULL,
                            basetype);
        }
@@ -1320,7 +1323,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,
                                basetype);
            }
@@ -1340,7 +1343,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);
 
index 3e528ea..04ab765 100644 (file)
@@ -1,3 +1,7 @@
+2012-07-10  Jason Merrill  <jason@redhat.com>
+
+       * g++.dg/cpp0x/implicit13.C: New.
+
 2012-07-09  Janis Johnson  <janisjo@codesourcery.com>
 
        Backport from mainline.
diff --git a/gcc/testsuite/g++.dg/cpp0x/implicit13.C b/gcc/testsuite/g++.dg/cpp0x/implicit13.C
new file mode 100644 (file)
index 0000000..3165863
--- /dev/null
@@ -0,0 +1,32 @@
+// Make sure that A's destructor doesn't affect constexpr
+// or exception-spec on D's default constructor.
+// { dg-do compile { target c++11 } }
+
+struct A {
+  constexpr A() noexcept: i(0) { }
+  int i;
+  ~A() noexcept(false);
+};
+
+struct B: A { };
+
+// Should get static initialization, so no constructor call.
+// { dg-final { scan-assembler-not "_ZN1BC1Ev" } }
+B b;
+
+struct C { C() noexcept; ~C() noexcept(false); };
+struct D: C { };
+extern D d;
+
+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));