The previous patch fixes an instance of directly expanding a TARGET_EXPR that has TARGET_EXPR_DIRECT_INIT_P set, which should never happen. So let's check for any other instances.
Tested x86_64-pc-linux-gnu, applying to trunk. * cp-gimplify.c (cp_gimplify_expr) [TARGET_EXPR]: Check TARGET_EXPR_DIRECT_INIT_P. * constexpr.c (cxx_eval_constant_expression): Likewise. --- gcc/cp/constexpr.c | 1 + gcc/cp/cp-gimplify.c | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index 5fe6d0277b6..9306a7dce4a 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -5312,6 +5312,7 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t, *non_constant_p = true; break; } + gcc_checking_assert (!TARGET_EXPR_DIRECT_INIT_P (t)); /* Avoid evaluating a TARGET_EXPR more than once. */ if (tree *p = ctx->global->values.get (TARGET_EXPR_SLOT (t))) { diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c index 1d2a77d2c0a..827d240d11a 100644 --- a/gcc/cp/cp-gimplify.c +++ b/gcc/cp/cp-gimplify.c @@ -925,6 +925,13 @@ cp_gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p) } break; + case TARGET_EXPR: + /* A TARGET_EXPR that expresses direct-initialization should have been + elided by cp_gimplify_init_expr. */ + gcc_checking_assert (!TARGET_EXPR_DIRECT_INIT_P (*expr_p)); + ret = GS_UNHANDLED; + break; + case RETURN_EXPR: if (TREE_OPERAND (*expr_p, 0) && (TREE_CODE (TREE_OPERAND (*expr_p, 0)) == INIT_EXPR -- 2.18.1