diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2013-12-04 11:11:56 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2013-12-04 11:11:56 +0000 |
commit | a1d7a124b9f3940943890c6d1da2b0d2b5219f7e (patch) | |
tree | a9c83bb498c53c5a70e1f2b28addca926c4699b6 /gcc/ada/gcc-interface/trans.c | |
parent | f220a4f4e556777fdfbca7b41cda3f234a2507da (diff) | |
download | gcc-a1d7a124b9f3940943890c6d1da2b0d2b5219f7e.zip gcc-a1d7a124b9f3940943890c6d1da2b0d2b5219f7e.tar.gz gcc-a1d7a124b9f3940943890c6d1da2b0d2b5219f7e.tar.bz2 |
trans.c (Case_Statement_to_gnu): Do not push a binding level for each branch if...
* gcc-interface/trans.c (Case_Statement_to_gnu): Do not push a binding
level for each branch if this is a case expression in Ada 2012.
(gnat_to_gnu) <case N_Expression_With_Actions>: Adjust comment.
From-SVN: r205662
Diffstat (limited to 'gcc/ada/gcc-interface/trans.c')
-rw-r--r-- | gcc/ada/gcc-interface/trans.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index e533de6..2eae399 100644 --- a/gcc/ada/gcc-interface/trans.c +++ b/gcc/ada/gcc-interface/trans.c @@ -2348,12 +2348,17 @@ Case_Statement_to_gnu (Node_Id gnat_node) } } - /* Push a binding level here in case variables are declared as we want - them to be local to this set of statements instead of to the block - containing the Case statement. */ + /* This construct doesn't define a scope so we shouldn't push a binding + level around the statement list. Except that we have always done so + historically and this makes it possible to reduce stack usage. As a + compromise, we keep doing it for case statements, for which this has + never been problematic, but not for case expressions in Ada 2012. */ if (choices_added_p) { - tree group = build_stmt_group (Statements (gnat_when), true); + const bool is_case_expression + = (Nkind (Parent (gnat_node)) == N_Expression_With_Actions); + tree group + = build_stmt_group (Statements (gnat_when), !is_case_expression); bool group_may_fallthru = block_may_fallthru (group); add_stmt (group); if (group_may_fallthru) @@ -7002,8 +7007,8 @@ gnat_to_gnu (Node_Id gnat_node) /****************/ case N_Expression_With_Actions: - /* This construct doesn't define a scope so we don't wrap the statement - list in a BIND_EXPR; however, we wrap it in a SAVE_EXPR to protect it + /* This construct doesn't define a scope so we don't push a binding level + around the statement list; but we wrap it in a SAVE_EXPR to protect it from unsharing. */ gnu_result = build_stmt_group (Actions (gnat_node), false); gnu_result = build1 (SAVE_EXPR, void_type_node, gnu_result); |