On 10/26/25 7:32 AM, Nathaniel Shead wrote:
OK for trunk?
OK.
-- >8 -- We'd missed providing a diagnostic when checking a non-scalar non-class type, such as a function type. gcc/cp/ChangeLog: * method.cc (destructible_expr): Add explanation when type is neither class nor scalar. gcc/testsuite/ChangeLog: * g++.dg/ext/is_destructible3.C: Add test for function type. Signed-off-by: Nathaniel Shead <[email protected]> --- gcc/cp/method.cc | 6 +++++- gcc/testsuite/g++.dg/ext/is_destructible3.C | 4 ++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/gcc/cp/method.cc b/gcc/cp/method.cc index ef8370fac5b..bc721a5d7e3 100644 --- a/gcc/cp/method.cc +++ b/gcc/cp/method.cc @@ -2410,7 +2410,11 @@ destructible_expr (tree to, bool explain) else if (scalarish_type_p (to)) return void_node; else - return error_mark_node; + { + if (explain) + error_at (location_of (to), "%qT is not a class or scalar type", to); + return error_mark_node; + } }/* Returns a tree iff TO is assignable (if CODE is MODIFY_EXPR) ordiff --git a/gcc/testsuite/g++.dg/ext/is_destructible3.C b/gcc/testsuite/g++.dg/ext/is_destructible3.C index a8501d637ab..5d3c92954da 100644 --- a/gcc/testsuite/g++.dg/ext/is_destructible3.C +++ b/gcc/testsuite/g++.dg/ext/is_destructible3.C @@ -9,6 +9,10 @@ static_assert(is_destructible<void>::value, ""); // { dg-error "assert" } // { dg-message "'void' is not destructible, because" "" { target *-*-* } .-1 } // { dg-error "'void' is incomplete" "" { target *-*-* } .-2 }+static_assert(is_destructible<void() volatile>::value, ""); // { dg-error "assert" }+// { dg-message "'void\\(\\) volatile' is not destructible, because" "" { target *-*-* } .-1 } +// { dg-error "not a class or scalar type" "" { target *-*-* } .-2 } + struct A { ~A() = delete; // { dg-message "declared here" } };
