c++: ICE on invalid 'tor with =default [PR118304]

Message ID 20250203220110.58445-1-polacek@redhat.com
State New
Headers
Series c++: ICE on invalid 'tor with =default [PR118304] |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gcc_build--master-arm success Build passed
linaro-tcwg-bot/tcwg_gcc_check--master-arm success Test passed
linaro-tcwg-bot/tcwg_gcc_build--master-aarch64 success Build passed
linaro-tcwg-bot/tcwg_gcc_check--master-aarch64 success Test passed

Commit Message

Marek Polacek Feb. 3, 2025, 10:01 p.m. UTC
  Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?

-- >8 --
In this PR we crash in maybe_delete_defaulted_fn because the switch
doesn't expect a cfk_constructor/_destructor.  But we can get there:

  struct A {
    *A() = default;
  };

is invalid due to the void/void* mismatch, so we get to m_d_d_fn:

  if (!same_type_p (TREE_TYPE (TREE_TYPE (fn)),
                    TREE_TYPE (TREE_TYPE (implicit_fn)))
      maybe_delete_defaulted_fn (fn, implicit_fn);

Currently, we give no error (subject to c++/118306), but even if we
did, we should probably return early in maybe_delete_defaulted_fn.

	PR c++/118304

gcc/cp/ChangeLog:

	* method.cc (maybe_delete_defaulted_fn): Return early for cdtors.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp0x/defaulted70.C: New test.
---
 gcc/cp/method.cc                         | 10 +++++++++-
 gcc/testsuite/g++.dg/cpp0x/defaulted70.C |  9 +++++++++
 2 files changed, 18 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/cpp0x/defaulted70.C


base-commit: 214224c4973bfb76f73a7efff29c5823eef31194
  

Patch

diff --git a/gcc/cp/method.cc b/gcc/cp/method.cc
index 3914bbb1ef2..99e247125c3 100644
--- a/gcc/cp/method.cc
+++ b/gcc/cp/method.cc
@@ -3531,10 +3531,18 @@  maybe_delete_defaulted_fn (tree fn, tree implicit_fn)
   if (DECL_ARTIFICIAL (fn) || !DECL_DEFAULTED_IN_CLASS_P (fn))
     return;
 
+  const special_function_kind kind = special_function_p (fn);
+  if (kind == sfk_constructor || kind == sfk_destructor)
+    {
+      /* FIXME: This is ill-formed, and we should have given an error.
+	 But this is only going to be fixed in GCC 16 via c++/118306.  */
+      gcc_assert (true || seen_error ());
+      return;
+    }
+
   DECL_DELETED_FN (fn) = true;
 
   auto_diagnostic_group d;
-  const special_function_kind kind = special_function_p (fn);
   tree parmtype
     = TREE_VALUE (DECL_XOBJ_MEMBER_FUNCTION_P (fn)
 		  ? TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (fn)))
diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted70.C b/gcc/testsuite/g++.dg/cpp0x/defaulted70.C
new file mode 100644
index 00000000000..e269d9bc6a5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/defaulted70.C
@@ -0,0 +1,9 @@ 
+// PR c++/118304
+// { dg-do compile { target c++11 } }
+
+struct A {
+  *A() = default; // { dg-error "invalid" "PR118306" { xfail *-*-* } }
+ *~A() = default; // { dg-error "invalid" "PR118306" { xfail *-*-* } }
+};
+
+A a;