OSDN Git Service

* gcc-interface/trans.c (Subprogram_Body_to_gnu): Pop the stack of
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 18 Sep 2013 10:25:44 +0000 (10:25 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 18 Sep 2013 10:25:44 +0000 (10:25 +0000)
return variables for subprograms using the CICO mechanism.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@202686 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ada/ChangeLog
gcc/ada/gcc-interface/trans.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/in_out_parameter4.adb [new file with mode: 0644]

index 003eb66..43f861c 100644 (file)
@@ -1,3 +1,8 @@
+2013-09-18  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * 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  <ebotcazou@adacore.com>
 
        * gcc-interface/trans.c (can_equal_min_or_max_val_p): Be prepared for
index d63ffe8..baefdea 100644 (file)
@@ -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)));
index 26f4ce1..9a44623 100644 (file)
@@ -1,3 +1,7 @@
+2013-09-18  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/in_out_parameter4.adb: New test.
+
 2013-08-13  Eric Botcazou  <ebotcazou@adacore.com>
 
        * 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 (file)
index 0000000..4f5cc21
--- /dev/null
@@ -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;