https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89285
--- Comment #9 from Jason Merrill <jason at gcc dot gnu.org> ---
(In reply to Jakub Jelinek from comment #4)
> + /* Preserve REINTERPRET_CAST_P. */
> + if (code == NOP_EXPR && REINTERPRET_CAST_P (org_x))
> + {
> + if (TREE_CODE (x) == NOP_EXPR && REINTERPRET_CAST_P (x))
> + break;
> + if (TREE_CODE (x) == NOP_EXPR)
> + {
> + x = copy_node (x);
> + REINTERPRET_CAST_P (x) = 1;
> + }
> + else
> + {
> + x = build1_loc (loc, code, TREE_TYPE (x), x);
> + REINTERPRET_CAST_P (x) = 1;
> + }
> + }
> break;
Looks good, though can't we assume that if x != org_x it's a new NOP_EXPR so we
can just set REINTERPRET_CAST_P?
> and with that we reject the testcase again (like we've done in 8.x, so this
> part is [9 Regression] accepts-invalid).
> But that also means we ICE again on the:
> C bar {};
I'm not seeing this.
> So, maybe we want to ignore that:
> if (REINTERPRET_CAST_P (t))
> {
> if (!ctx->quiet)
> error_at (cp_expr_loc_or_loc (t, input_location),
> "a reinterpret_cast is not a constant expression");
> *non_constant_p = true;
> return t;
> }
> for perhaps !ctx->manifestly_const_eval , as in when we really don't require
> constant expression.
That should depend on ctx->strict, not manifestly_const_eval.
(In reply to Jakub Jelinek from comment #7)
> Ah, so one problem is that while we save the inline bodies of functions
> before cp_fold_function, cp_fold_function is destructive and clobbers the
> saved copy.
> cp_fold itself is (hopefully) not destructive and creates new trees, but
> cp_fold_function is destructive and happily modifies the trees shared with
> something else (in this case with the constexpr funcdef table).
>
> Jason, any preferences here?
My theory has been to switch to saving pre-gimplification bodies of constexpr
functions and doing constant evaluation using them.