Commit 58611fb6 by Jason Merrill Committed by Jason Merrill

constexpr.c (cxx_eval_statement_list): Handle statement-expressions.

	* constexpr.c (cxx_eval_statement_list): Handle statement-expressions.
	(potential_constant_expression_1): Handle STMT_EXPR.

From-SVN: r217748
parent 5a804683
2014-11-18 Jason Merrill <jason@redhat.com> 2014-11-18 Jason Merrill <jason@redhat.com>
* constexpr.c (cxx_eval_statement_list): Handle statement-expressions.
(potential_constant_expression_1): Handle STMT_EXPR.
* constexpr.c (cxx_eval_constant_expression): Give jump_target a * constexpr.c (cxx_eval_constant_expression): Give jump_target a
default argument. default argument.
(lots): Omit NULL jump_target arguments. (lots): Omit NULL jump_target arguments.
......
...@@ -2685,6 +2685,14 @@ cxx_eval_statement_list (const constexpr_ctx *ctx, tree t, ...@@ -2685,6 +2685,14 @@ cxx_eval_statement_list (const constexpr_ctx *ctx, tree t,
{ {
tree_stmt_iterator i; tree_stmt_iterator i;
tree_stmt_iterator default_label = tree_stmt_iterator(); tree_stmt_iterator default_label = tree_stmt_iterator();
tree local_target;
/* In a statement-expression we want to return the last value. */
tree r = NULL_TREE;
if (!jump_target)
{
local_target = NULL_TREE;
jump_target = &local_target;
}
for (i = tsi_start (t); !tsi_end_p (i); tsi_next (&i)) for (i = tsi_start (t); !tsi_end_p (i); tsi_next (&i))
{ {
reenter: reenter:
...@@ -2699,8 +2707,7 @@ cxx_eval_statement_list (const constexpr_ctx *ctx, tree t, ...@@ -2699,8 +2707,7 @@ cxx_eval_statement_list (const constexpr_ctx *ctx, tree t,
else else
continue; continue;
} }
cxx_eval_constant_expression (ctx, stmt, r = cxx_eval_constant_expression (ctx, stmt, false,
false,
non_constant_p, overflow_p, non_constant_p, overflow_p,
jump_target); jump_target);
if (*non_constant_p) if (*non_constant_p)
...@@ -2714,7 +2721,7 @@ cxx_eval_statement_list (const constexpr_ctx *ctx, tree t, ...@@ -2714,7 +2721,7 @@ cxx_eval_statement_list (const constexpr_ctx *ctx, tree t,
*jump_target = NULL_TREE; *jump_target = NULL_TREE;
goto reenter; goto reenter;
} }
return NULL_TREE; return r;
} }
/* Evaluate a LOOP_EXPR for side-effects. Handles break and return /* Evaluate a LOOP_EXPR for side-effects. Handles break and return
...@@ -3885,6 +3892,9 @@ potential_constant_expression_1 (tree t, bool want_rval, tsubst_flags_t flags) ...@@ -3885,6 +3892,9 @@ potential_constant_expression_1 (tree t, bool want_rval, tsubst_flags_t flags)
return false; return false;
return true; return true;
case STMT_EXPR:
return potential_constant_expression_1 (STMT_EXPR_STMT (t), rval, flags);
case LAMBDA_EXPR: case LAMBDA_EXPR:
case DYNAMIC_CAST_EXPR: case DYNAMIC_CAST_EXPR:
case PSEUDO_DTOR_EXPR: case PSEUDO_DTOR_EXPR:
...@@ -3900,7 +3910,6 @@ potential_constant_expression_1 (tree t, bool want_rval, tsubst_flags_t flags) ...@@ -3900,7 +3910,6 @@ potential_constant_expression_1 (tree t, bool want_rval, tsubst_flags_t flags)
/* GCC internal stuff. */ /* GCC internal stuff. */
case VA_ARG_EXPR: case VA_ARG_EXPR:
case OBJ_TYPE_REF: case OBJ_TYPE_REF:
case STMT_EXPR:
case TRANSACTION_EXPR: case TRANSACTION_EXPR:
case ASM_EXPR: case ASM_EXPR:
fail: fail:
......
// { dg-do compile { target c++11 } }
// { dg-options "" }
#define SA(X) static_assert((X),#X)
template <class T>
constexpr T f (T t)
{
return ({ t+1; });
}
SA(f(42) == 43);
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