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 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; base-commit: 214224c4973bfb76f73a7efff29c5823eef31194 -- 2.48.1