On 6/18/24 10:31, Marek Polacek wrote:
Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk/14/13?
Makes sense to me, though probably the [meta.unary.prop] table should be adjusted in the same way. Jonathan, what do you think?
-- >8 -- Here we started to ICE with r13-25: in check_trait_type, for "X[]" we return true here: if (kind == 1 && TREE_CODE (type) == ARRAY_TYPE && !TYPE_DOMAIN (type)) return true; // Array of unknown bound. Don't care about completeness. and then end up crashing in record_has_unique_obj_representations: 4836 if (cur != wi::to_offset (sz)) because sz is null. https://eel.is/c++draft/type.traits#tab:meta.unary.prop-row-47-column-3-sentence-1 says that the preconditions for __has_unique_object_representations are: "T shall be a complete type, cv void, or an array of unknown bound" and that "For an array type T, the same result as has_unique_object_representations_v<remove_all_extents_t<T>>" so T[] should be treated as T. So we should use kind==2 for the trait. PR c++/115476 gcc/cp/ChangeLog: * semantics.cc (finish_trait_expr) <case CPTK_HAS_UNIQUE_OBJ_REPRESENTATIONS>: Move below to call check_trait_type with kind==2. gcc/testsuite/ChangeLog: * g++.dg/cpp1z/has-unique-obj-representations4.C: New test. --- gcc/cp/semantics.cc | 2 +- .../cpp1z/has-unique-obj-representations4.C | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/cpp1z/has-unique-obj-representations4.C diff --git a/gcc/cp/semantics.cc b/gcc/cp/semantics.cc index 08f5f245e7d..42251b6764b 100644 --- a/gcc/cp/semantics.cc +++ b/gcc/cp/semantics.cc @@ -12966,7 +12966,6 @@ finish_trait_expr (location_t loc, cp_trait_kind kind, tree type1, tree type2) case CPTK_HAS_NOTHROW_COPY: case CPTK_HAS_TRIVIAL_COPY: case CPTK_HAS_TRIVIAL_DESTRUCTOR: - case CPTK_HAS_UNIQUE_OBJ_REPRESENTATIONS: if (!check_trait_type (type1)) return error_mark_node; break; @@ -12976,6 +12975,7 @@ finish_trait_expr (location_t loc, cp_trait_kind kind, tree type1, tree type2) case CPTK_IS_STD_LAYOUT: case CPTK_IS_TRIVIAL: case CPTK_IS_TRIVIALLY_COPYABLE: + case CPTK_HAS_UNIQUE_OBJ_REPRESENTATIONS: if (!check_trait_type (type1, /* kind = */ 2)) return error_mark_node; break; diff --git a/gcc/testsuite/g++.dg/cpp1z/has-unique-obj-representations4.C b/gcc/testsuite/g++.dg/cpp1z/has-unique-obj-representations4.C new file mode 100644 index 00000000000..d6949dc7005 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/has-unique-obj-representations4.C @@ -0,0 +1,16 @@ +// PR c++/115476 +// { dg-do compile { target c++11 } } + +struct X; +static_assert(__has_unique_object_representations(X), ""); // { dg-error "invalid use of incomplete type" } +static_assert(__has_unique_object_representations(X[]), ""); // { dg-error "invalid use of incomplete type" } +static_assert(__has_unique_object_representations(X[1]), ""); // { dg-error "invalid use of incomplete type" } +static_assert(__has_unique_object_representations(X[][1]), ""); // { dg-error "invalid use of incomplete type" } + +struct X { + int x; +}; +static_assert(__has_unique_object_representations(X), ""); +static_assert(__has_unique_object_representations(X[]), ""); +static_assert(__has_unique_object_representations(X[1]), ""); +static_assert(__has_unique_object_representations(X[][1]), ""); base-commit: 7f9be55a4630134a237219af9cc8143e02080380