aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/constexpr.cc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2023-07-14 12:25:51 -0400
committerJason Merrill <jason@redhat.com>2023-07-18 11:47:08 -0400
commitb41a927bcbdf27723b9d420f0b403f2af12129f1 (patch)
treeeec708d18d291717fad6fe1fb6c35c2c4e37eda1 /gcc/cp/constexpr.cc
parentb80e3c468e373cc6fd4e41a5879dbca95a40ac8c (diff)
downloadgcc-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/cp/constexpr.cc')
-rw-r--r--gcc/cp/constexpr.cc9
1 files changed, 9 insertions, 0 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;
+ }
}
}