The compiler is no longer using the secondary stack in the case of
"for ... of" loops over arrays. No small test case is available.
Tested on x86_64-pc-linux-gnu, committed on trunk
2016-04-20 Bob Duff <[email protected]>
* sem_ch5.adb (Analyze_Iterator_Specification): Do not use secondary
stack when possible.
Index: sem_ch5.adb
===================================================================
--- sem_ch5.adb (revision 235240)
+++ sem_ch5.adb (working copy)
@@ -1753,14 +1753,6 @@
------------------------------------
procedure Analyze_Iterator_Specification (N : Node_Id) is
- Loc : constant Source_Ptr := Sloc (N);
- Def_Id : constant Node_Id := Defining_Identifier (N);
- Subt : constant Node_Id := Subtype_Indication (N);
- Iter_Name : constant Node_Id := Name (N);
-
- Typ : Entity_Id;
- Bas : Entity_Id;
-
procedure Check_Reverse_Iteration (Typ : Entity_Id);
-- For an iteration over a container, if the loop carries the Reverse
-- indicator, verify that the container type has an Iterate aspect that
@@ -1822,6 +1814,16 @@
return Etype (Ent);
end Get_Cursor_Type;
+ -- Local variables
+
+ Def_Id : constant Node_Id := Defining_Identifier (N);
+ Iter_Name : constant Node_Id := Name (N);
+ Loc : constant Source_Ptr := Sloc (N);
+ Subt : constant Node_Id := Subtype_Indication (N);
+
+ Bas : Entity_Id;
+ Typ : Entity_Id;
+
-- Start of processing for Analyze_iterator_Specification
begin
@@ -1925,7 +1927,7 @@
-- Do not perform this expansion in SPARK mode, since the formal
-- verification directly deals with the source form of the iterator.
- -- Ditto for ASIS and when expansion is disabled,, where the temporary
+ -- Ditto for ASIS and when expansion is disabled, where the temporary
-- may hide the transformation of a selected component into a prefixed
-- function call, and references need to see the original expression.
@@ -2001,7 +2003,7 @@
-- to it. It has no effect on the generated code if no actions
-- are added to it (see Wrap_Transient_Declaration).
- if Expander_Active then
+ if not Is_Array_Type (Typ) and then Expander_Active then
Establish_Transient_Scope (Name (Decl), Sec_Stack => True);
end if;