r264625 - in /trunk/gcc/ada: ChangeLog exp_ch4....

pmderodat@gcc.gnu.org pmderodat@gcc.gnu.org
Wed Sep 26 09:18:00 GMT 2018


Author: pmderodat
Date: Wed Sep 26 09:18:35 2018
New Revision: 264625

URL: https://gcc.gnu.org/viewcvs?rev=264625&root=gcc&view=rev
Log:
[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.

Modified:
    trunk/gcc/ada/ChangeLog
    trunk/gcc/ada/exp_ch4.adb
    trunk/gcc/ada/exp_ch6.adb
    trunk/gcc/ada/sem_ch5.adb



More information about the Gcc-cvs mailing list