OK for trunk?
-- >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) 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<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" }
};
--
2.51.0