aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2016-02-18 00:08:09 -0500
committerJason Merrill <jason@gcc.gnu.org>2016-02-18 00:08:09 -0500
commitfa837fb670c502e7fbcb3f48aa1932b55704521c (patch)
treef88a1e5605680ea78fc264696fec9c23f95fdbb8 /gcc/cp
parentbcb5f3c9f5aa8d3368e887b40f4ab1197afab59e (diff)
downloadgcc-fa837fb670c502e7fbcb3f48aa1932b55704521c.zip
gcc-fa837fb670c502e7fbcb3f48aa1932b55704521c.tar.gz
gcc-fa837fb670c502e7fbcb3f48aa1932b55704521c.tar.bz2
re PR c++/65985 (compiler segfault with assert() in constexpr constructor body)
PR c++/65985 * constexpr.c (build_constexpr_constructor_member_initializers): Handle an additional STATEMENT_LIST. From-SVN: r233514
Diffstat (limited to 'gcc/cp')
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/constexpr.c39
2 files changed, 29 insertions, 14 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 963ba5a..18f8072 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,9 @@
2016-02-17 Jason Merrill <jason@redhat.com>
+ PR c++/65985
+ * constexpr.c (build_constexpr_constructor_member_initializers):
+ Handle an additional STATEMENT_LIST.
+
PR c++/68585
* constexpr.c (cxx_eval_bare_aggregate): Fix 'changed' detection.
diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c
index 0eedfca..d3b04b1 100644
--- a/gcc/cp/constexpr.c
+++ b/gcc/cp/constexpr.c
@@ -528,21 +528,32 @@ build_constexpr_constructor_member_initializers (tree type, tree body)
{
vec<constructor_elt, va_gc> *vec = NULL;
bool ok = true;
- if (TREE_CODE (body) == MUST_NOT_THROW_EXPR
- || TREE_CODE (body) == EH_SPEC_BLOCK)
- body = TREE_OPERAND (body, 0);
- if (TREE_CODE (body) == STATEMENT_LIST)
- {
- for (tree_stmt_iterator i = tsi_start (body);
- !tsi_end_p (i); tsi_next (&i))
- {
- body = tsi_stmt (i);
- if (TREE_CODE (body) == BIND_EXPR)
- break;
- }
+ while (true)
+ switch (TREE_CODE (body))
+ {
+ case MUST_NOT_THROW_EXPR:
+ case EH_SPEC_BLOCK:
+ body = TREE_OPERAND (body, 0);
+ break;
+
+ case STATEMENT_LIST:
+ for (tree_stmt_iterator i = tsi_start (body);
+ !tsi_end_p (i); tsi_next (&i))
+ {
+ body = tsi_stmt (i);
+ if (TREE_CODE (body) == BIND_EXPR)
+ break;
+ }
+ break;
+
+ case BIND_EXPR:
+ body = BIND_EXPR_BODY (body);
+ goto found;
+
+ default:
+ gcc_unreachable ();
}
- if (TREE_CODE (body) == BIND_EXPR)
- body = BIND_EXPR_BODY (body);
+ found:
if (TREE_CODE (body) == CLEANUP_POINT_EXPR)
{
body = TREE_OPERAND (body, 0);