mirror of git://gcc.gnu.org/git/gcc.git
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
This commit is contained in:
parent
5a80468364
commit
58611fb6fa
|
|
@ -1,5 +1,8 @@
|
|||
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
|
||||
default argument.
|
||||
(lots): Omit NULL jump_target arguments.
|
||||
|
|
|
|||
|
|
@ -2685,6 +2685,14 @@ cxx_eval_statement_list (const constexpr_ctx *ctx, tree t,
|
|||
{
|
||||
tree_stmt_iterator i;
|
||||
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))
|
||||
{
|
||||
reenter:
|
||||
|
|
@ -2699,10 +2707,9 @@ cxx_eval_statement_list (const constexpr_ctx *ctx, tree t,
|
|||
else
|
||||
continue;
|
||||
}
|
||||
cxx_eval_constant_expression (ctx, stmt,
|
||||
false,
|
||||
non_constant_p, overflow_p,
|
||||
jump_target);
|
||||
r = cxx_eval_constant_expression (ctx, stmt, false,
|
||||
non_constant_p, overflow_p,
|
||||
jump_target);
|
||||
if (*non_constant_p)
|
||||
break;
|
||||
if (returns (jump_target) || breaks (jump_target))
|
||||
|
|
@ -2714,7 +2721,7 @@ cxx_eval_statement_list (const constexpr_ctx *ctx, tree t,
|
|||
*jump_target = NULL_TREE;
|
||||
goto reenter;
|
||||
}
|
||||
return NULL_TREE;
|
||||
return r;
|
||||
}
|
||||
|
||||
/* 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)
|
|||
return false;
|
||||
return true;
|
||||
|
||||
case STMT_EXPR:
|
||||
return potential_constant_expression_1 (STMT_EXPR_STMT (t), rval, flags);
|
||||
|
||||
case LAMBDA_EXPR:
|
||||
case DYNAMIC_CAST_EXPR:
|
||||
case PSEUDO_DTOR_EXPR:
|
||||
|
|
@ -3900,7 +3910,6 @@ potential_constant_expression_1 (tree t, bool want_rval, tsubst_flags_t flags)
|
|||
/* GCC internal stuff. */
|
||||
case VA_ARG_EXPR:
|
||||
case OBJ_TYPE_REF:
|
||||
case STMT_EXPR:
|
||||
case TRANSACTION_EXPR:
|
||||
case ASM_EXPR:
|
||||
fail:
|
||||
|
|
|
|||
|
|
@ -0,0 +1,12 @@
|
|||
// { 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);
|
||||
Loading…
Reference in New Issue