From 01e552339c62982387c5ea0add15c1ca43bba42b Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Wed, 18 Sep 2013 10:25:44 +0000 Subject: [PATCH] trans.c (Subprogram_Body_to_gnu): Pop the stack of return variables for subprograms using the CICO mechanism. * gcc-interface/trans.c (Subprogram_Body_to_gnu): Pop the stack of return variables for subprograms using the CICO mechanism. From-SVN: r202686 --- gcc/ada/ChangeLog | 5 ++++ gcc/ada/gcc-interface/trans.c | 2 ++ gcc/testsuite/ChangeLog | 4 +++ gcc/testsuite/gnat.dg/in_out_parameter4.adb | 30 +++++++++++++++++++++ 4 files changed, 41 insertions(+) create mode 100644 gcc/testsuite/gnat.dg/in_out_parameter4.adb diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 003eb661fc16..43f861c7e5ae 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,8 @@ +2013-09-18 Eric Botcazou + + * gcc-interface/trans.c (Subprogram_Body_to_gnu): Pop the stack of + return variables for subprograms using the CICO mechanism. + 2013-08-13 Eric Botcazou * gcc-interface/trans.c (can_equal_min_or_max_val_p): Be prepared for diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index d63ffe8ab5d5..baefdea30994 100644 --- a/gcc/ada/gcc-interface/trans.c +++ b/gcc/ada/gcc-interface/trans.c @@ -3438,6 +3438,8 @@ Subprogram_Body_to_gnu (Node_Id gnat_node) { tree gnu_retval; + VEC_pop (tree, gnu_return_var_stack); + add_stmt (gnu_result); add_stmt (build1 (LABEL_EXPR, void_type_node, VEC_last (tree, gnu_return_label_stack))); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 26f4ce1e5755..9a44623db7c1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2013-09-18 Eric Botcazou + + * gnat.dg/in_out_parameter4.adb: New test. + 2013-08-13 Eric Botcazou * gnat.dg/loop_optimization16.adb: New test. diff --git a/gcc/testsuite/gnat.dg/in_out_parameter4.adb b/gcc/testsuite/gnat.dg/in_out_parameter4.adb new file mode 100644 index 000000000000..4f5cc2181983 --- /dev/null +++ b/gcc/testsuite/gnat.dg/in_out_parameter4.adb @@ -0,0 +1,30 @@ +-- { dg-do run } +-- { dg-options "-gnat12 -gnatVa" } + +procedure In_Out_Parameter4 is + + type Enum is (E_Undetermined, E_Down, E_Up); + subtype Status_T is Enum range E_Down .. E_Up; + + function Recurse (Val : in out Integer) return Status_T is + + Result : Status_T; + + procedure Dummy (I : in out Integer) is begin null; end; + + begin + if Val > 500 then + Val := Val - 1; + Result := Recurse (Val); + return Result; + else + return E_UP; + end if; + end; + + Val : Integer := 501; + S : Status_T; + +begin + S := Recurse (Val); +end; -- 2.47.2