diff options
author | Jason Merrill <jason@redhat.com> | 2023-07-14 12:25:51 -0400 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2023-07-18 11:47:08 -0400 |
commit | b41a927bcbdf27723b9d420f0b403f2af12129f1 (patch) | |
tree | eec708d18d291717fad6fe1fb6c35c2c4e37eda1 /gcc | |
parent | b80e3c468e373cc6fd4e41a5879dbca95a40ac8c (diff) | |
download | gcc-b41a927bcbdf27723b9d420f0b403f2af12129f1.zip gcc-b41a927bcbdf27723b9d420f0b403f2af12129f1.tar.gz gcc-b41a927bcbdf27723b9d420f0b403f2af12129f1.tar.bz2 |
c++: constexpr bit_cast with empty field
The change to only cache constexpr calls that are
reduced_constant_expression_p tripped on bit-cast3.C, which failed that
predicate due to the presence of an empty field in the result of
native_interpret_aggregate, which reduced_constant_expression_p rejects to
avoid confusing output_constructor.
This patch proposes to skip such fields in native_interpret_aggregate, since
they aren't actually involved in the value representation.
gcc/ChangeLog:
* fold-const.cc (native_interpret_aggregate): Skip empty fields.
gcc/cp/ChangeLog:
* constexpr.cc (cxx_eval_bit_cast): Check that the result of
native_interpret_aggregate doesn't need more evaluation.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/constexpr.cc | 9 | ||||
-rw-r--r-- | gcc/fold-const.cc | 3 |
2 files changed, 11 insertions, 1 deletions
diff --git a/gcc/cp/constexpr.cc b/gcc/cp/constexpr.cc index 9d85c3b..6e8f1c2 100644 --- a/gcc/cp/constexpr.cc +++ b/gcc/cp/constexpr.cc @@ -1440,6 +1440,8 @@ enum value_cat { static tree cxx_eval_constant_expression (const constexpr_ctx *, tree, value_cat, bool *, bool *, tree * = NULL); +static tree cxx_eval_bare_aggregate (const constexpr_ctx *, tree, + value_cat, bool *, bool *); static tree cxx_fold_indirect_ref (const constexpr_ctx *, location_t, tree, tree, bool * = NULL); static tree find_heap_var_refs (tree *, int *, void *); @@ -4803,6 +4805,13 @@ cxx_eval_bit_cast (const constexpr_ctx *ctx, tree t, bool *non_constant_p, { clear_type_padding_in_mask (TREE_TYPE (t), mask); clear_uchar_or_std_byte_in_mask (loc, r, mask); + if (CHECKING_P) + { + tree e = cxx_eval_bare_aggregate (ctx, r, vc_prvalue, + non_constant_p, overflow_p); + gcc_checking_assert (e == r); + r = e; + } } } diff --git a/gcc/fold-const.cc b/gcc/fold-const.cc index a02ede7..7e5494d 100644 --- a/gcc/fold-const.cc +++ b/gcc/fold-const.cc @@ -8935,7 +8935,8 @@ native_interpret_aggregate (tree type, const unsigned char *ptr, int off, return NULL_TREE; for (tree field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field)) { - if (TREE_CODE (field) != FIELD_DECL || DECL_PADDING_P (field)) + if (TREE_CODE (field) != FIELD_DECL || DECL_PADDING_P (field) + || is_empty_type (TREE_TYPE (field))) continue; tree fld = field; HOST_WIDE_INT bitoff = 0, pos = 0, sz = 0; |