diff options
author | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-05-02 21:59:57 +0000 |
---|---|---|
committer | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-05-02 21:59:57 +0000 |
commit | d55ebb6a31fabe00e75bb286219082ea2cfa448c (patch) | |
tree | 26809dd38d501276be7efd8a1ae0006e22de0d4f /gcc/tree-inline.c | |
parent | a99d5c978a9385d62af8733840d9c36aaf14ae45 (diff) | |
download | gcc-d55ebb6a31fabe00e75bb286219082ea2cfa448c.tar.gz |
PR c++/40975
* tree-inline.c (copy_tree_r): Handle STATEMENT_LIST.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@173273 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-inline.c')
-rw-r--r-- | gcc/tree-inline.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index 5da4a12d9ad..37776753ca3 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -4271,14 +4271,26 @@ copy_tree_r (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED) CONSTRUCTOR_ELTS (*tp)); *tp = new_tree; } + else if (code == STATEMENT_LIST) + { + /* We used to just abort on STATEMENT_LIST, but we can run into them + with statement-expressions (c++/40975). */ + tree new_list = alloc_stmt_list (); + tree_stmt_iterator i = tsi_start (*tp); + tree_stmt_iterator j = tsi_last (new_list); + for (; !tsi_end_p (i); tsi_next (&i)) + { + tree stmt = tsi_stmt (i); + tsi_link_after (&j, stmt, TSI_CONTINUE_LINKING); + } + *tp = new_list; + } else if (TREE_CODE_CLASS (code) == tcc_type) *walk_subtrees = 0; else if (TREE_CODE_CLASS (code) == tcc_declaration) *walk_subtrees = 0; else if (TREE_CODE_CLASS (code) == tcc_constant) *walk_subtrees = 0; - else - gcc_assert (code != STATEMENT_LIST); return NULL_TREE; } |