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

Reply via email to