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
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
@@ -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)))
new file mode 100644
@@ -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;