PR c++/78572 - ICE with self-modifying array initializer
* constexpr.c (cxx_eval_store_expression): The object we're initializing is outside the constant-expression. From-SVN: r245511
This commit is contained in:
parent
61cee26030
commit
1e163090d5
@ -1,5 +1,10 @@
|
||||
2017-02-16 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/78572 - ICE with self-modifying array initializer
|
||||
* constexpr.c (cxx_eval_store_expression): The object we're
|
||||
initializing is outside the constant-expression.
|
||||
(cxx_eval_call_expression): Set ctx->call.
|
||||
|
||||
PR c++/79050 - ICE with undeduced auto and LTO
|
||||
* decl.c (poplevel): Remove undeduced auto decls.
|
||||
|
||||
|
@ -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;
|
||||
|
3
gcc/testsuite/g++.dg/init/array47.C
Normal file
3
gcc/testsuite/g++.dg/init/array47.C
Normal file
@ -0,0 +1,3 @@
|
||||
// PR c++/78572
|
||||
|
||||
static int array[10] = { array[3]=5, array[7]=3, };
|
Loading…
Reference in New Issue
Block a user