===================================================================
@@ -3049,10 +3049,6 @@
Iter_Type := Etype (Name (I_Spec));
- if Is_Iterator (Iter_Type) then
- Pack := Scope (Pack);
- end if;
-
-- The "of" case uses an internally generated cursor whose type
-- is found in the container package. The domain of iteration
-- is expanded into a call to the default Iterator function, but
@@ -3074,42 +3070,42 @@
begin
Cursor := Make_Temporary (Loc, 'I');
- if Is_Iterator (Iter_Type) then
- null;
+ -- For an container element iterator, the iterator type
+ -- is obtained from the corresponding aspect.
- else
- Iter_Type := Etype (Default_Iter);
+ Iter_Type := Etype (Default_Iter);
+ Pack := Scope (Iter_Type);
- -- Rewrite domain of iteration as a call to the default
- -- iterator for the container type. If the container is
- -- a derived type and the aspect is inherited, convert
- -- container to parent type. The Cursor type is also
- -- inherited from the scope of the parent.
+ -- Rewrite domain of iteration as a call to the default
+ -- iterator for the container type. If the container is
+ -- a derived type and the aspect is inherited, convert
+ -- container to parent type. The Cursor type is also
+ -- inherited from the scope of the parent.
- if Base_Type (Etype (Container)) =
- Base_Type (Etype (First_Formal (Default_Iter)))
- then
- Container_Arg := New_Copy_Tree (Container);
+ if Base_Type (Etype (Container)) =
+ Base_Type (Etype (First_Formal (Default_Iter)))
+ then
+ Container_Arg := New_Copy_Tree (Container);
- else
- Container_Arg :=
- Make_Type_Conversion (Loc,
- Subtype_Mark =>
- New_Occurrence_Of
- (Etype (First_Formal (Default_Iter)), Loc),
- Expression => New_Copy_Tree (Container));
- end if;
-
- Rewrite (Name (I_Spec),
- Make_Function_Call (Loc,
- Name => New_Occurrence_Of (Default_Iter, Loc),
- Parameter_Associations =>
- New_List (Container_Arg)));
- Analyze_And_Resolve (Name (I_Spec));
+ else
+ Container_Arg :=
+ Make_Type_Conversion (Loc,
+ Subtype_Mark =>
+ New_Occurrence_Of
+ (Etype (First_Formal (Default_Iter)), Loc),
+ Expression => New_Copy_Tree (Container));
end if;
- -- Find cursor type in proper container package.
+ Rewrite (Name (I_Spec),
+ Make_Function_Call (Loc,
+ Name => New_Occurrence_Of (Default_Iter, Loc),
+ Parameter_Associations =>
+ New_List (Container_Arg)));
+ Analyze_And_Resolve (Name (I_Spec));
+ -- Find cursor type in proper iterator package, which
+ -- is an instantiation of Iterator_Interfaces.
+
Ent := First_Entity (Pack);
while Present (Ent) loop
if Chars (Ent) = Name_Cursor then
@@ -3145,7 +3141,7 @@
-- Generate:
-- declare
- -- Id : Element_Type := Pack.Element (curosr);
+ -- Id : Element_Type := Element (curosr);
-- begin
-- <original loop statements>
-- end;
@@ -3222,6 +3218,8 @@
-- while Iterator.Has_Element loop
-- <Stats>
-- end loop;
+ --
+ -- Has_Element is the second actual in the iterator package
New_Loop :=
Make_Loop_Statement (Loc,
@@ -3230,16 +3228,18 @@
Condition =>
Make_Function_Call (Loc,
Name =>
- Make_Selected_Component (Loc,
- Prefix => New_Occurrence_Of (Pack, Loc),
- Selector_Name =>
- Make_Identifier (Loc, Name_Has_Element)),
-
+ New_Occurrence_Of (
+ Next_Entity (First_Entity (Pack)), Loc),
Parameter_Associations =>
New_List (
New_Reference_To (Cursor, Loc)))),
+
Statements => Stats,
End_Label => Empty);
+ -- Make_Selected_Component (Loc,
+ -- Prefix => New_Reference_To (Cursor, Loc),
+ -- Selector_Name =>
+ -- Make_Identifier (Loc, Name_Has_Element))),
-- Create the declarations for Iterator and cursor and insert then
-- before the source loop. Given that the domain of iteration is
@@ -3248,7 +3248,7 @@
-- Generate:
-- I : Iterator_Type renames Container;
- -- C : Pack.Cursor_Type := Container.[First | Last];
+ -- C : Cursor_Type := Container.[First | Last];
Insert_Action (N,
Make_Object_Renaming_Declaration (Loc,