Commit 06ec22b7 by Jason Merrill Committed by Jason Merrill

Improve constexpr handling of other loop forms.

	* constexpr.c (breaks): Handle EXIT_EXPR.
	(cxx_eval_loop_expr): Handle COMPOUND_EXPR body.
	(cxx_eval_constant_expression): Handle EXIT_EXPR, improve handling
	of COMPOUND_EXPR.

From-SVN: r235218
parent f937929e
2016-04-19 Jason Merrill <jason@redhat.com> 2016-04-19 Jason Merrill <jason@redhat.com>
* constexpr.c (breaks): Handle EXIT_EXPR.
(cxx_eval_loop_expr): Handle COMPOUND_EXPR body.
(cxx_eval_constant_expression): Handle EXIT_EXPR, improve handling
of COMPOUND_EXPR.
PR c++/68206 PR c++/68206
PR c++/68530 PR c++/68530
* constexpr.c (potential_constant_expression_1): Handle LOOP_EXPR * constexpr.c (potential_constant_expression_1): Handle LOOP_EXPR
......
...@@ -3241,8 +3241,9 @@ static bool ...@@ -3241,8 +3241,9 @@ static bool
breaks (tree *jump_target) breaks (tree *jump_target)
{ {
return *jump_target return *jump_target
&& TREE_CODE (*jump_target) == LABEL_DECL && ((TREE_CODE (*jump_target) == LABEL_DECL
&& LABEL_DECL_BREAK (*jump_target); && LABEL_DECL_BREAK (*jump_target))
|| TREE_CODE (*jump_target) == EXIT_EXPR);
} }
static bool static bool
...@@ -3358,7 +3359,7 @@ cxx_eval_loop_expr (const constexpr_ctx *ctx, tree t, ...@@ -3358,7 +3359,7 @@ cxx_eval_loop_expr (const constexpr_ctx *ctx, tree t,
hash_set<tree> save_exprs; hash_set<tree> save_exprs;
new_ctx.save_exprs = &save_exprs; new_ctx.save_exprs = &save_exprs;
cxx_eval_statement_list (&new_ctx, body, cxx_eval_constant_expression (&new_ctx, body, /*lval*/false,
non_constant_p, overflow_p, jump_target); non_constant_p, overflow_p, jump_target);
/* Forget saved values of SAVE_EXPRs. */ /* Forget saved values of SAVE_EXPRs. */
...@@ -3750,6 +3751,8 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t, ...@@ -3750,6 +3751,8 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t,
cxx_eval_constant_expression (ctx, op0, cxx_eval_constant_expression (ctx, op0,
true, non_constant_p, overflow_p, true, non_constant_p, overflow_p,
jump_target); jump_target);
if (*non_constant_p)
return t;
op1 = TREE_OPERAND (t, 1); op1 = TREE_OPERAND (t, 1);
r = cxx_eval_constant_expression (ctx, op1, r = cxx_eval_constant_expression (ctx, op1,
lval, non_constant_p, overflow_p, lval, non_constant_p, overflow_p,
...@@ -4015,6 +4018,17 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t, ...@@ -4015,6 +4018,17 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t,
} }
break; break;
case EXIT_EXPR:
{
tree cond = TREE_OPERAND (t, 0);
cond = cxx_eval_constant_expression (ctx, cond, /*lval*/false,
non_constant_p, overflow_p);
VERIFY_CONSTANT (cond);
if (integer_nonzerop (cond))
*jump_target = t;
}
break;
case GOTO_EXPR: case GOTO_EXPR:
*jump_target = TREE_OPERAND (t, 0); *jump_target = TREE_OPERAND (t, 0);
gcc_assert (breaks (jump_target) || continues (jump_target)); gcc_assert (breaks (jump_target) || continues (jump_target));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment