@@ -1635,6 +1635,7 @@ cxx_eval_call_expression (const constexpr_ctx *ctx, tree t,
constexpr_ctx ctx_with_save_exprs = *ctx;
hash_set<tree> save_exprs;
ctx_with_save_exprs.save_exprs = &save_exprs;
+ ctx_with_save_exprs.call = &new_call;
tree jump_target = NULL_TREE;
cxx_eval_constant_expression (&ctx_with_save_exprs, body,
@@ -3386,7 +3387,13 @@ cxx_eval_store_expression (const constexpr_ctx *ctx, tree t,
/* And then find/build up our initializer for the path to the subobject
we're initializing. */
tree *valp;
- if (DECL_P (object))
+ if (object == ctx->object && VAR_P (object)
+ && DECL_NAME (object) && ctx->call == NULL)
+ /* The variable we're building up an aggregate initializer for is outside
+ the constant-expression, so don't evaluate the store. We check
+ DECL_NAME to handle TARGET_EXPR temporaries, which are fair game. */
+ valp = NULL;
+ else if (DECL_P (object))
valp = ctx->values->get (object);
else
valp = NULL;
new file mode 100644
@@ -0,0 +1,3 @@
+// PR c++/78572
+
+static int array[10] = { array[3]=5, array[7]=3, };