diff options
author | Marek Polacek <polacek@redhat.com> | 2024-06-17 17:53:12 -0400 |
---|---|---|
committer | Marek Polacek <polacek@redhat.com> | 2024-06-25 17:44:49 -0400 |
commit | fc382a373e6824bb998007d1dcb0805b0cf4b8e8 (patch) | |
tree | ecbc4caafdd9c9ec68a1025d5bba43d62b5003bf /gcc/testsuite/g++.dg | |
parent | b1e828dd9694294de1ec71e319d32a6b30b087d8 (diff) | |
download | gcc-fc382a373e6824bb998007d1dcb0805b0cf4b8e8.zip gcc-fc382a373e6824bb998007d1dcb0805b0cf4b8e8.tar.gz gcc-fc382a373e6824bb998007d1dcb0805b0cf4b8e8.tar.bz2 |
c++: ICE with __has_unique_object_representations [PR115476]
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.
Diffstat (limited to 'gcc/testsuite/g++.dg')
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1z/has-unique-obj-representations4.C | 16 |
1 files changed, 16 insertions, 0 deletions
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 0000000..d6949dc --- /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]), ""); |