diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2010-04-11 11:11:49 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2010-04-11 11:11:49 +0000 |
commit | 9c69c3afd6ba8ed4814f5c1aa1b5d0ea12a8eb11 (patch) | |
tree | 1cd650990f68f65b8de2675fdf1eb77c7c56383d /gcc | |
parent | c460cd49da9989d9b4cda350ae21eb12d233ace1 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/ada/gcc-interface/trans.c | 23 |
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: |