From: Jason Merrill Date: Tue, 4 Apr 2023 03:20:13 +0000 (-0400) Subject: c++: make trait of incomplete type a permerror [PR109277] X-Git-Tag: upstream/13.1.0~72 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f32f7881fb0db085479525b5a23db5dabd990c3b;p=platform%2Fupstream%2Fgcc.git 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. --- 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" }