diff options
author | Hristian Kirtchev <kirtchev@adacore.com> | 2018-09-26 09:18:35 +0000 |
---|---|---|
committer | Pierre-Marie de Rodat <pmderodat@gcc.gnu.org> | 2018-09-26 09:18:35 +0000 |
commit | abbfd69841b2357d242d47abda8d0430269ab829 (patch) | |
tree | 0780ea6986b51d3e34b042b2235195b6dddbca58 /gcc/go | |
parent | c886a946134d08a3ae3ad2dacbcee8d6b981db1d (diff) | |
download | gcc-abbfd69841b2357d242d47abda8d0430269ab829.zip gcc-abbfd69841b2357d242d47abda8d0430269ab829.tar.gz gcc-abbfd69841b2357d242d47abda8d0430269ab829.tar.bz2 |
[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
Diffstat (limited to 'gcc/go')
0 files changed, 0 insertions, 0 deletions