sem_attr.adb
399 KB
-
[Ada] Memory leak with 'Range of a function call in a loop · f56add9c
If a for loop starts with "for X in F (...)'Range loop", where F is a function returning an unconstrained array, then memory is leaked. This patch fixes that bug. Running these commands: gnatmake -q -f main.adb main On the following sources: with Text_IO; use Text_IO; package P is function Get_Objects return String; end P; package body P is function Get_Objects return String is begin return "xyzzy"; end Get_Objects; end P; with Text_IO; use Text_IO; pragma Warnings (Off, "an internal GNAT unit"); with System.Secondary_Stack; pragma Warnings (On, "an internal GNAT unit"); with P; use P; procedure Main is Max_Iterations : constant Integer := 1_000; procedure Leak_Call is begin for Id in Get_Objects'Range loop null; end loop; end Leak_Call; procedure SS_Info is new System.Secondary_Stack.SS_Info (Text_IO.Put_Line); begin for Iteration in 1 .. Max_Iterations loop Leak_Call; end loop; SS_Info; end Main; Should produce the following output: Secondary Stack information: Total size : 10240 bytes Current allocated space : 0 bytes Number of Chunks : 1 Default size of Chunks : 10240 2019-09-19 Bob Duff <duff@adacore.com> gcc/ada/ * sem_attr.adb (Resolve_Attribute): Make sure the secondary stack is properly managed in the case of a 'Range attribute in a loop. From-SVN: r275938
Bob Duff committed