aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2010-04-11 11:11:49 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2010-04-11 11:11:49 +0000
commit9c69c3afd6ba8ed4814f5c1aa1b5d0ea12a8eb11 (patch)
tree1cd650990f68f65b8de2675fdf1eb77c7c56383d /gcc
parentc460cd49da9989d9b4cda350ae21eb12d233ace1 (diff)
downloadgcc-9c69c3afd6ba8ed4814f5c1aa1b5d0ea12a8eb11.zip
gcc-9c69c3afd6ba8ed4814f5c1aa1b5d0ea12a8eb11.tar.gz
gcc-9c69c3afd6ba8ed4814f5c1aa1b5d0ea12a8eb11.tar.bz2
trans.c (Case_Statement_to_gnu): Bool-ify variable.
* gcc-interface/trans.c (Case_Statement_to_gnu): Bool-ify variable. (gnat_to_gnu) <N_Null_Statement>: When not optimizing, generate a goto to the next statement. From-SVN: r158200
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/ChangeLog6
-rw-r--r--gcc/ada/gcc-interface/trans.c23
2 files changed, 25 insertions, 4 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 2b8801f..3643811 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,9 @@
+2010-04-11 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gcc-interface/trans.c (Case_Statement_to_gnu): Bool-ify variable.
+ (gnat_to_gnu) <N_Null_Statement>: When not optimizing, generate a
+ goto to the next statement.
+
2010-04-09 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/gigi.h (maybe_variable): Delete.
diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c
index 5fe9460..cb5ff94 100644
--- a/gcc/ada/gcc-interface/trans.c
+++ b/gcc/ada/gcc-interface/trans.c
@@ -1876,8 +1876,8 @@ Case_Statement_to_gnu (Node_Id gnat_node)
Present (gnat_when);
gnat_when = Next_Non_Pragma (gnat_when))
{
+ bool choices_added_p = false;
Node_Id gnat_choice;
- int choices_added = 0;
/* First compile all the different case choices for the current WHEN
alternative. */
@@ -1940,14 +1940,14 @@ Case_Statement_to_gnu (Node_Id gnat_node)
gnu_low, gnu_high,
create_artificial_label (input_location)),
gnat_choice);
- choices_added++;
+ choices_added_p = true;
}
}
/* 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. */
- if (choices_added > 0)
+ if (choices_added_p)
{
add_stmt (build_stmt_group (Statements (gnat_when), true));
add_stmt (build1 (GOTO_EXPR, void_type_node,
@@ -4465,7 +4465,22 @@ gnat_to_gnu (Node_Id gnat_node)
break;
case N_Null_Statement:
- gnu_result = alloc_stmt_list ();
+ /* When not optimizing, turn null statements from source into gotos to
+ the next statement that the middle-end knows how to preserve. */
+ if (!optimize && Comes_From_Source (gnat_node))
+ {
+ tree stmt, label = create_label_decl (NULL_TREE);
+ start_stmt_group ();
+ stmt = build1 (GOTO_EXPR, void_type_node, label);
+ set_expr_location_from_node (stmt, gnat_node);
+ add_stmt (stmt);
+ stmt = build1 (LABEL_EXPR, void_type_node, label);
+ set_expr_location_from_node (stmt, gnat_node);
+ add_stmt (stmt);
+ gnu_result = end_stmt_group ();
+ }
+ else
+ gnu_result = alloc_stmt_list ();
break;
case N_Assignment_Statement: