aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2011-01-31 21:19:25 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2011-01-31 21:19:25 +0100
commit60d237aff2b33b61703a1e957aa2dce278858b2e (patch)
treef04fee5b74adcb02e3c236b924d90a3b56a770b0 /gcc/cp
parent882020aa1c3fe408d66363a1b18e1684e40c4abe (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/cp/semantics.c23
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);