diff options
author | Jason Merrill <jason@redhat.com> | 2016-02-18 00:08:09 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2016-02-18 00:08:09 -0500 |
commit | fa837fb670c502e7fbcb3f48aa1932b55704521c (patch) | |
tree | f88a1e5605680ea78fc264696fec9c23f95fdbb8 /gcc/cp | |
parent | bcb5f3c9f5aa8d3368e887b40f4ab1197afab59e (diff) | |
download | gcc-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/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/constexpr.c | 39 |
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); |