aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2015-01-23 11:29:46 -0500
committerJason Merrill <jason@gcc.gnu.org>2015-01-23 11:29:46 -0500
commitc6e7c499a3f6dfd86b8b88cb1bdd70a1ebb76012 (patch)
tree72bacdd22935d1fa2cb2a47586c3f1900b956366 /gcc
parent6fc2d0f36223308d21f2347c9b48bc61fed2405c (diff)
downloadgcc-c6e7c499a3f6dfd86b8b88cb1bdd70a1ebb76012.zip
gcc-c6e7c499a3f6dfd86b8b88cb1bdd70a1ebb76012.tar.gz
gcc-c6e7c499a3f6dfd86b8b88cb1bdd70a1ebb76012.tar.bz2
re PR c++/64701 (internal compiler error: unexpected expression ‘<statement>’ of kind do_stmt)
PR c++/64701 * constexpr.c (maybe_constant_value): Just hand back STATEMENT_LIST. From-SVN: r220046
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog3
-rw-r--r--gcc/cp/constexpr.c14
-rw-r--r--gcc/testsuite/g++.dg/ext/stmtexpr17.C9
3 files changed, 24 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index b1d4965..98bbcbd 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,8 @@
2015-01-23 Jason Merrill <jason@redhat.com>
+ PR c++/64701
+ * constexpr.c (maybe_constant_value): Just hand back STATEMENT_LIST.
+
PR c++/64727
* constexpr.c (cxx_eval_constant_expression): Allow for lvalue use
of CONST_DECL.
diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c
index f144ab0..f143420 100644
--- a/gcc/cp/constexpr.c
+++ b/gcc/cp/constexpr.c
@@ -3454,8 +3454,18 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t,
break;
default:
- internal_error ("unexpected expression %qE of kind %s", t,
- get_tree_code_name (TREE_CODE (t)));
+ if (STATEMENT_CODE_P (TREE_CODE (t)))
+ {
+ /* This function doesn't know how to deal with pre-genericize
+ statements; this can only happen with statement-expressions,
+ so for now just fail. */
+ if (!ctx->quiet)
+ error_at (EXPR_LOCATION (t),
+ "statement is not a constant-expression");
+ }
+ else
+ internal_error ("unexpected expression %qE of kind %s", t,
+ get_tree_code_name (TREE_CODE (t)));
*non_constant_p = true;
break;
}
diff --git a/gcc/testsuite/g++.dg/ext/stmtexpr17.C b/gcc/testsuite/g++.dg/ext/stmtexpr17.C
new file mode 100644
index 0000000..c1640e4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/stmtexpr17.C
@@ -0,0 +1,9 @@
+// PR c++/64701
+// { dg-options "" }
+
+enum { A };
+void
+foo ()
+{
+ int x = ({ do {} while (0); A; });
+}