diff options
author | Jakub Jelinek <jakub@redhat.com> | 2011-01-31 21:19:25 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2011-01-31 21:19:25 +0100 |
commit | 60d237aff2b33b61703a1e957aa2dce278858b2e (patch) | |
tree | f04fee5b74adcb02e3c236b924d90a3b56a770b0 /gcc/cp | |
parent | 882020aa1c3fe408d66363a1b18e1684e40c4abe (diff) | |
download | gcc-60d237aff2b33b61703a1e957aa2dce278858b2e.zip gcc-60d237aff2b33b61703a1e957aa2dce278858b2e.tar.gz gcc-60d237aff2b33b61703a1e957aa2dce278858b2e.tar.bz2 |
re PR c++/47416 (ICE in build_data_member_initialization, at cp/semantics.c:5509)
PR c++/47416
* semantics.c (build_data_member_initialization): Handle
STATEMENT_LIST always instead of just for CLEANUP_BODY.
* g++.dg/cpp0x/pr47416.C: New test.
From-SVN: r169447
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 23 |
2 files changed, 17 insertions, 12 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 48bc1db..673ec6c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2011-01-31 Jakub Jelinek <jakub@redhat.com> + + PR c++/47416 + * semantics.c (build_data_member_initialization): Handle + STATEMENT_LIST always instead of just for CLEANUP_BODY. + 2011-01-31 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> * g++spec.c (lang_specific_driver) [HAVE_LD_STATIC_DYNAMIC] Use diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 161812b..6d45fb9 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -5477,6 +5477,16 @@ build_data_member_initialization (tree t, VEC(constructor_elt,gc) **vec) t = TREE_OPERAND (t, 0); if (t == error_mark_node) return false; + if (TREE_CODE (t) == STATEMENT_LIST) + { + tree_stmt_iterator i; + for (i = tsi_start (t); !tsi_end_p (i); tsi_next (&i)) + { + if (! build_data_member_initialization (tsi_stmt (i), vec)) + return false; + } + return true; + } if (TREE_CODE (t) == CLEANUP_STMT) { /* We can't see a CLEANUP_STMT in a constructor for a literal class, @@ -5484,18 +5494,7 @@ build_data_member_initialization (tree t, VEC(constructor_elt,gc) **vec) ignore it; either all the initialization will be constant, in which case the cleanup can't run, or it can't be constexpr. Still recurse into CLEANUP_BODY. */ - t = CLEANUP_BODY (t); - if (TREE_CODE (t) == STATEMENT_LIST) - { - tree_stmt_iterator i; - for (i = tsi_start (t); !tsi_end_p (i); tsi_next (&i)) - { - if (! build_data_member_initialization (tsi_stmt (i), vec)) - return false; - } - return true; - } - return build_data_member_initialization (t, vec); + return build_data_member_initialization (CLEANUP_BODY (t), vec); } if (TREE_CODE (t) == CONVERT_EXPR) t = TREE_OPERAND (t, 0); |