[Ada] Spurious dependency on secondary stack
This patch reimplements the handling of the secondary stack when the
iteration scheme of a loop statement requires this support.
Prior to this modification, an iterator loop over a container was
assumed to require unconditional secondary stack management. This is
however not always true because of user-defined iterator types, where
routines First and Next return an iterator that does require the
secondary stack.
------------
-- Source --
------------
-- gnat.adc
pragma Restrictions (No_Secondary_Stack);
-- test.ads
package Test is
type Test_Type is private
with
Default_Initial_Condition,
Iterable => (First => First_Element,
Next => Next_Element,
Has_Element => Has_Element,
Element => Element);
type Cursor_Type is private;
function First_Element (T : Test_Type) return Cursor_Type;
function Next_Element (T : Test_Type; C : Cursor_Type) return Cursor_Type;
function Has_Element (T : Test_Type; C : Cursor_Type) return Boolean;
function Element (T : Test_Type; C : Cursor_Type) return Natural;
private
type Cursor_Type is new Natural;
type Test_Type is record
null;
end record;
function First_Element (T : Test_Type) return Cursor_Type
is (0);
function Next_Element (T : Test_Type; C : Cursor_Type) return Cursor_Type
is (0);
function Has_Element (T : Test_Type; C : Cursor_Type) return Boolean
is (False);
function Element (T : Test_Type; C : Cursor_Type) return Natural
is (0);
end Test;
-- main.adb
with Test; use Test;
procedure Main is
F : Boolean;
M : Test_Type;
begin
for Elem of M loop
null;
end loop;
F := (for all C of M => C = 1);
F := (for all C in M => True);
end Main;
-----------------
-- Compilation --
-----------------
$ gnatmake -q --RTS=zfp -nostdlib main.adb
2018-09-26 Hristian Kirtchev <kirtchev@adacore.com>
gcc/ada/
* exp_ch4.adb (Expand_N_Allocator): Ensure that the use of the
secondary stack does not clash with restriction
No_Secondary_Stack.
* exp_ch6.adb (Expand_N_Extended_Return_Statement): Ensure that
the use of the secondary stack does not clash with restriction
No_Secondary_Stack.
* sem_ch5.adb (Analyze_Loop_Statement): Wrap the loop in a block
prior to analysis in order to either provide a local scope for
an iterator, or ensure that the secondary stack is properly
managed.
(Check_Call): Account for the case where the tree may be
unanalyzed or contain prior errors.
(Has_Call_Using_Secondary_Stack): Renamed to Has_Sec_Stack_Call.
Update all uses of the subprogram.
(Prepare_Loop_Statement): New routine.
From-SVN: r264625