diff options
author | Jason Merrill <jason@redhat.com> | 2023-04-03 23:20:13 -0400 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2023-04-13 14:59:31 -0400 |
commit | f32f7881fb0db085479525b5a23db5dabd990c3b (patch) | |
tree | 9c687d279c56460fd9745b892383a15c38f6416f | |
parent | fdb8c06b3d6c1ec5fb517ce7d1a88ab1d8ec7958 (diff) | |
download | gcc-f32f7881fb0db085479525b5a23db5dabd990c3b.zip gcc-f32f7881fb0db085479525b5a23db5dabd990c3b.tar.gz gcc-f32f7881fb0db085479525b5a23db5dabd990c3b.tar.bz2 |
c++: make trait of incomplete type a permerror [PR109277]
An incomplete type argument to several traits is specified to be undefined
behavior in the library; since it's a compile-time property, we diagnose
it. But apparently some code was relying on the previous behavior of not
diagnosing. So let's make it a permerror.
The assert in cxx_incomplete_type_diagnostic didn't like that, and I don't
see the point of having the assert, so let's just remove it.
PR c++/109277
gcc/cp/ChangeLog:
* semantics.cc (check_trait_type): Handle incomplete type directly.
* typeck2.cc (cxx_incomplete_type_diagnostic): Remove assert.
gcc/testsuite/ChangeLog:
* g++.dg/ext/is_convertible5.C: New test.
-rw-r--r-- | gcc/cp/semantics.cc | 7 | ||||
-rw-r--r-- | gcc/cp/typeck2.cc | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/is_convertible5.C | 7 |
3 files changed, 13 insertions, 5 deletions
diff --git a/gcc/cp/semantics.cc b/gcc/cp/semantics.cc index 99a76e3..45e0b0e 100644 --- a/gcc/cp/semantics.cc +++ b/gcc/cp/semantics.cc @@ -12107,7 +12107,12 @@ check_trait_type (tree type, int kind = 1) if (VOID_TYPE_P (type)) return true; - return !!complete_type_or_else (strip_array_types (type), NULL_TREE); + type = complete_type (strip_array_types (type)); + if (!COMPLETE_TYPE_P (type) + && cxx_incomplete_type_diagnostic (NULL_TREE, type, DK_PERMERROR) + && !flag_permissive) + return false; + return true; } /* Process a trait expression. */ diff --git a/gcc/cp/typeck2.cc b/gcc/cp/typeck2.cc index 76a7a7f..bf03967 100644 --- a/gcc/cp/typeck2.cc +++ b/gcc/cp/typeck2.cc @@ -298,10 +298,6 @@ cxx_incomplete_type_diagnostic (location_t loc, const_tree value, { bool is_decl = false, complained = false; - gcc_assert (diag_kind == DK_WARNING - || diag_kind == DK_PEDWARN - || diag_kind == DK_ERROR); - /* Avoid duplicate error message. */ if (TREE_CODE (type) == ERROR_MARK) return false; diff --git a/gcc/testsuite/g++.dg/ext/is_convertible5.C b/gcc/testsuite/g++.dg/ext/is_convertible5.C new file mode 100644 index 0000000..ab9be05 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/is_convertible5.C @@ -0,0 +1,7 @@ +// PR c++/109277 +// { dg-do compile { target c++11 } } +// { dg-options -fpermissive } + +struct a; +struct b{}; +static_assert (!__is_convertible (a, b), ""); // { dg-warning "incomplete" } |