[Ada] Secondary stack leak with access-to-subprogram
authorHristian Kirtchev <kirtchev@adacore.com>
Tue, 31 Jul 2018 09:56:31 +0000 (09:56 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Tue, 31 Jul 2018 09:56:31 +0000 (09:56 +0000)
This patch modifies call resolution to recognize when the designated type of
an access-to-subprogram requires secondary stack management, and establish
the proper transient block.

------------
-- Source --
------------

--  leak7.adb

procedure Leak7 is
   Max_Iterations : constant := 10_000;

   function Func return String is
   begin
      return "Will this leak? Or will it dry?";
   end Func;

   type Func_Ptr is access function return String;

   procedure Anonymous_Leak (Func : access function return String) is
   begin
      for Iteration in 1 .. Max_Iterations loop
         declare
            Val : constant String := Func.all;
         begin null; end;
      end loop;
   end Anonymous_Leak;

   procedure Named_Leak (Func : Func_Ptr) is
   begin
      for Iteration in 1 .. Max_Iterations loop
         declare
            Val : constant String := Func.all;
         begin null; end;
      end loop;
   end Named_Leak;

begin
   Anonymous_Leak (Func'Access);
   Named_Leak     (Func'Access);
end Leak7;

----------------------------
-- Compilation and output --
----------------------------

$ gnatmake -q leak7.adb
$ valgrind ./leak7 >& leak7.txt
$ grep -c "still reachable" leak7.txt
0

2018-07-31  Hristian Kirtchev  <kirtchev@adacore.com>

gcc/ada/

* sem_res.adb (Resolve_Call): Establish a transient scope to
manage the secondary stack when the designated type of an
access-to-subprogram requires it.

From-SVN: r263103

gcc/ada/ChangeLog
gcc/ada/sem_res.adb

index 8207826eabee9b4823989fd66aeae4daccce81b7..43d837b3095d04b7a2b86cecb079939736787886 100644 (file)
@@ -1,3 +1,9 @@
+2018-07-31  Hristian Kirtchev  <kirtchev@adacore.com>
+
+       * sem_res.adb (Resolve_Call): Establish a transient scope to
+       manage the secondary stack when the designated type of an
+       access-to-subprogram requires it.
+
 2018-07-31  Ed Schonberg  <schonberg@adacore.com>
 
        * exp_ch7.adb (Check_Unnesting_Elaboration_Code): To find local
index 5f9f1c3911db28f8b34091f511a75b0d13205263..ddfa5430a7b7a0effd9b055c1aa57c421b77b766 100644 (file)
@@ -6433,7 +6433,7 @@ package body Sem_Res is
          null;
 
       elsif Expander_Active
-        and then Ekind (Nam) = E_Function
+        and then Ekind_In (Nam, E_Function, E_Subprogram_Type)
         and then Requires_Transient_Scope (Etype (Nam))
       then
          Establish_Transient_Scope (N, Manage_Sec_Stack => True);