From: Nathaniel Shead Date: Thu, 23 Oct 2025 06:10:04 +0000 (+1100) Subject: c++: Fix diagnostics for __is_destructable X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=49acd44ac36a36b659bcead4cec80dde04bbccee;p=thirdparty%2Fgcc.git c++: Fix diagnostics for __is_destructable 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 Reviewed-by: Jason Merrill --- 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) or diff --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::value, ""); // { dg-error "assert" } // { dg-message "'void' is not destructible, because" "" { target *-*-* } .-1 } // { dg-error "'void' is incomplete" "" { target *-*-* } .-2 } +static_assert(is_destructible::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" } };