aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2014-11-18 22:03:39 -0500
committerJason Merrill <jason@gcc.gnu.org>2014-11-18 22:03:39 -0500
commit58611fb6fa0c1bab4ea0f77df43df67e9a9d19b0 (patch)
treecd8ae560dce79dc74b40373f9f077326735f1a2f /gcc
parent5a80468364379cac7ba08f369bb7556ba5f7a5f8 (diff)
downloadgcc-58611fb6fa0c1bab4ea0f77df43df67e9a9d19b0.zip
gcc-58611fb6fa0c1bab4ea0f77df43df67e9a9d19b0.tar.gz
gcc-58611fb6fa0c1bab4ea0f77df43df67e9a9d19b0.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog3
-rw-r--r--gcc/cp/constexpr.c21
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/constexpr-stmtexpr2.C12
3 files changed, 30 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index e508c5c..32f2c6f 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c
index 4669586..1b330a0 100644
--- a/gcc/cp/constexpr.c
+++ b/gcc/cp/constexpr.c
@@ -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:
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-stmtexpr2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-stmtexpr2.C
new file mode 100644
index 0000000..34ca9fa
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-stmtexpr2.C
@@ -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);