]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
LWG 2165
authorJason Merrill <jason@redhat.com>
Wed, 23 Oct 2013 19:16:37 +0000 (15:16 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 23 Oct 2013 19:16:37 +0000 (15:16 -0400)
LWG 2165
* method.c (defaulted_late_check): Delete on eh-spec mismatch.
(maybe_explain_implicit_delete): Explain it.

From-SVN: r203989

gcc/cp/ChangeLog
gcc/cp/method.c
gcc/testsuite/g++.dg/cpp0x/defaulted23.C
gcc/testsuite/g++.dg/cpp0x/defaulted43.C

index 78721a3ba356116058c30e837c3c1a347b095375..123200bd929989c4249f1c9c888e77081b49bbb4 100644 (file)
@@ -1,5 +1,9 @@
 2013-10-23  Jason Merrill  <jason@redhat.com>
 
+       LWG 2165
+       * method.c (defaulted_late_check): Delete on eh-spec mismatch.
+       (maybe_explain_implicit_delete): Explain it.
+
        * error.c (eh_spec_to_string): New.
        (cp_printer): Use it for %X.
 
index 593a4a653e962021109bae55e0e9e1f2897e9cdd..594a004f947e8645ea7b3dcbc58f6f083e047c9d 100644 (file)
@@ -1466,13 +1466,34 @@ maybe_explain_implicit_delete (tree decl)
          tree parms = FUNCTION_FIRST_USER_PARMTYPE (decl);
          tree parm_type = TREE_VALUE (parms);
          bool const_p = CP_TYPE_CONST_P (non_reference (parm_type));
+         tree raises = NULL_TREE;
+         bool deleted_p = false;
          tree scope = push_scope (ctype);
-         inform (0, "%q+#D is implicitly deleted because the default "
-                "definition would be ill-formed:", decl);
-         pop_scope (scope);
+
          synthesized_method_walk (ctype, sfk, const_p,
-                                  NULL, NULL, NULL, NULL, true,
+                                  &raises, NULL, &deleted_p, NULL, false,
                                   DECL_INHERITED_CTOR_BASE (decl), parms);
+         if (deleted_p)
+           {
+             inform (0, "%q+#D is implicitly deleted because the default "
+                     "definition would be ill-formed:", decl);
+             synthesized_method_walk (ctype, sfk, const_p,
+                                      NULL, NULL, NULL, NULL, true,
+                                      DECL_INHERITED_CTOR_BASE (decl), parms);
+           }
+         else if (!comp_except_specs
+                  (TYPE_RAISES_EXCEPTIONS (TREE_TYPE (decl)),
+                   raises, ce_normal))
+           inform (DECL_SOURCE_LOCATION (decl), "%q#F is implicitly "
+                   "deleted because its exception-specification does not "
+                   "match the implicit exception-specification %qX",
+                   decl, raises);
+#ifdef ENABLE_CHECKING
+         else
+           gcc_unreachable ();
+#endif
+
+         pop_scope (scope);
        }
 
       input_location = loc;
@@ -1782,9 +1803,10 @@ defaulted_late_check (tree fn)
                              eh_spec, ce_normal))
        {
          if (DECL_DEFAULTED_IN_CLASS_P (fn))
-           error ("function %q+D defaulted on its first declaration "
-                  "with an exception-specification that differs from "
-                  "the implicit declaration %q#D", fn, implicit_fn);
+           {
+             DECL_DELETED_FN (fn) = true;
+             eh_spec = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn));
+           }
          else
            error ("function %q+D defaulted on its redeclaration "
                   "with an exception-specification that differs from "
index 319cb396f99115152ca1cb3c1f42f73ceccd6f0f..be2fd2fbf906dbef714832fd7e7b326528e8345d 100644 (file)
@@ -6,22 +6,32 @@ struct A
   A() noexcept = default;
 };
 
+A a;
+
 struct B
 {
-  B() throw (int) = default; // { dg-error "exception-specification that differs from the implicit declaration" }
+  B() throw (int) = default; // { dg-message "exception-specification" }
 };
 
+B b;                           // { dg-error "deleted" }
+
 struct C
 {
   C() throw (int) { }
 };
 
+C c;
+
 struct D: C
 {
   D() throw (int) = default;
 };
 
+D d;
+
 struct E
 {
   E() = default;
 };
+
+E e;
index e1c2b72ba27c7bb2a6524bdc7a893d2f6a1bd7b5..f2846fe390c7b07987c555dfff6a3f7900e30b2d 100644 (file)
@@ -7,6 +7,8 @@ struct T
   ~T() noexcept(false) { }
 };
 
+T t;
+
 struct A
 {
   A() noexcept;
@@ -24,6 +26,8 @@ struct U
   ~U() noexcept(false) { }
 };
 
+U u;
+
 struct B
 {
   B() noexcept(false);
@@ -35,16 +39,22 @@ struct B
 B::B() noexcept(false) = default;
 B::~B() noexcept(false) = default;
 
+B b;
+
 struct V
 {
   V() noexcept(false) { }
   ~V() noexcept(false) { }
 };
 
+V v;
+
 struct C
 {
-  C() noexcept = default;     // { dg-error "defaulted" }
-  ~C() noexcept = default;    // { dg-error "defaulted" }
+  C() noexcept = default;      // { dg-message "exception-specification" }
+  ~C() noexcept = default;     // { dg-message "exception-specification" }
 
   V v;
 };
+
+C c;                           // { dg-error "deleted" }