summaryrefslogtreecommitdiff
path: root/gcc/ada/a-convec.adb
diff options
context:
space:
mode:
authorcharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>2011-11-23 13:51:23 +0000
committercharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>2011-11-23 13:51:23 +0000
commit212a85cbd8f302065907a06dd61362d14c41aa37 (patch)
tree267a728ee3a7d34623bc37b747312a45db885308 /gcc/ada/a-convec.adb
parent1d7479f66e96e089d61873262d5041e9f09bb059 (diff)
downloadgcc-212a85cbd8f302065907a06dd61362d14c41aa37.tar.gz
2011-11-23 Ed Schonberg <schonberg@adacore.com>
* freeze.adb (Freeze_All_Ent): An incomplete type is not frozen by a subprogram body that does not come from source. 2011-11-23 Pascal Obry <obry@adacore.com> * s-oscons-tmplt.c: Add PTY_Library constant. It contains the library for pseudo terminal support. * g-exptty.ads: Add pseudo-terminal library into a Linker_Options pragma. 2011-11-23 Ed Schonberg <schonberg@adacore.com> * sem_ch9.adb: No check on entry family index if generic. 2011-11-23 Thomas Quinot <quinot@adacore.com> * sem_ch9.adb, s-taprop.ads, s-taprop-hpux-dce.adb, s-taprop-irix.adb, s-taprop-posix.adb, s-taprop-rtx.adb, s-taprop-solaris.adb, s-taprop-tru64.adb, s-taprop-vxworks.adb: Move dependency on System.OS_Constants from shared spec of System.Tasking.Primitive_Operations to the specific body variants that really require this dependency. 2011-11-23 Ed Schonberg <schonberg@adacore.com> * sem_ch8.adb (Analyze_Subprogram_Renaming_Declaration): If the declaration has aspects, analyze them so they can be properly rejected. 2011-11-23 Hristian Kirtchev <kirtchev@adacore.com> * a-comutr.adb, a-coorma.adb, a-coorse.adb, a-convec.adb, a-cihase.adb, a-cimutr.adb, a-coinve.adb, a-ciorma.adb, a-ciorse.adb, a-cobove.adb, a-cohama.adb, a-cihama.adb, a-cidlli.adb, a-cdlili.adb, a-cbhama.adb, a-cbhase.adb, a-cbmutr.adb, a-cborma.adb, a-cborse.adb, a-cbdlli.adb: Add with and use clause for Ada.Finalization. Type Iterator and Child_Iterator are now derived from Limited_Controlled. (Finalize): New routine. (Iterate): Add a renaming of counter Busy and increment it. Update the return aggregate. (Iterate_Children): Add a renaming of counter Busy and increment it. Update the return aggregate. (Iterate_Subtree): Add a renaming of counter Busy and increment it. Update the return aggregate. * a-cdlili.ads, a-cidlli.ads: Type List_Access is now a general access type. * a-cihama.ads: Type Map_Access is now a general access type. * a-comutr.ads, a-cimutr.ads: Use type Natural for the two locks associated with the tree. * a-cohama.ads: Type Map_Access is now a general access type. * a-coinve.ads, a-convec.ads: Type Vector_Access is now a general access type. * exp_ch5.adb (Expand_Iterator_Loop): Do not create a block to wrap the loop as this is done at an earlier step, during analysis. The declarations of the iterator and the cursor use the usual Insert_Action mechanism when added into the tree. * sem_ch5.adb (Analyze_Loop_Statement): Remove local constant Loop_Statement and replace all respective uses by N. Add local constant Loc. Preanalyze the loop iterator to discover whether it is a container iterator and if it is, wrap the loop in a block. This ensures that any controlled temporaries produced by the iteration scheme share the same lifetime of the loop. (Is_Container_Iterator): New routine. (Is_Wrapped_In_Block): New routine. (Pre_Analyze_Range): Move spec and body to the library level. 2011-11-23 Sergey Rybin <rybin@adacore.com frybin> * gnat_ugn.texi, vms_data.ads: Add documentation for new gnatpp option that controls casing of type and subtype names. 2011-11-23 Yannick Moy <moy@adacore.com> * sem_ch3.adb: Minor addition of comments. 2011-11-23 Thomas Quinot <quinot@adacore.com> * prj-part.adb (Extension_Withs): New global variable, contains the head of the list of WITH clauses from the EXTENDS ALL projects for which virtual packages are being created. (Look_For_Virtual_Projects_For): When recursing through an EXTENDS ALL, add the WITH clauses of the extending project to Extension_Withs. When adding a project to the Virtual_Hash, record the associated Extension_Withs list. (Create_Virtual_Extending_Project): Add a copy of the appropriate Extension_Withs to the virtual project. 2011-11-23 Thomas Quinot <quinot@adacore.com> * mlib-tgt-specific-vxworks.adb: Minor reformatting. 2011-11-23 Thomas Quinot <quinot@adacore.com> * Make-generated.in (Sdefault.Target_Name): Set to $(target_noncanonical) instead of $(target) for consistency. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@181668 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ada/a-convec.adb')
-rw-r--r--gcc/ada/a-convec.adb81
1 files changed, 54 insertions, 27 deletions
diff --git a/gcc/ada/a-convec.adb b/gcc/ada/a-convec.adb
index 79071810182..a94f11c9f93 100644
--- a/gcc/ada/a-convec.adb
+++ b/gcc/ada/a-convec.adb
@@ -29,7 +29,6 @@
with Ada.Containers.Generic_Array_Sort;
with Ada.Unchecked_Deallocation;
-
with System; use type System.Address;
package body Ada.Containers.Vectors is
@@ -37,12 +36,15 @@ package body Ada.Containers.Vectors is
procedure Free is
new Ada.Unchecked_Deallocation (Elements_Type, Elements_Access);
- type Iterator is new Vector_Iterator_Interfaces.Reversible_Iterator with
+ type Iterator is new Limited_Controlled and
+ Vector_Iterator_Interfaces.Reversible_Iterator with
record
Container : Vector_Access;
Index : Index_Type;
end record;
+ overriding procedure Finalize (Object : in out Iterator);
+
overriding function First (Object : Iterator) return Cursor;
overriding function Last (Object : Iterator) return Cursor;
overriding function Next
@@ -778,6 +780,18 @@ package body Ada.Containers.Vectors is
Free (X);
end Finalize;
+ procedure Finalize (Object : in out Iterator) is
+ begin
+ if Object.Container /= null then
+ declare
+ B : Natural renames Object.Container.all.Busy;
+
+ begin
+ B := B - 1;
+ end;
+ end if;
+ end Finalize;
+
----------
-- Find --
----------
@@ -800,7 +814,7 @@ package body Ada.Containers.Vectors is
for J in Position.Index .. Container.Last loop
if Container.Elements.EA (J) = Item then
- return (Container'Unchecked_Access, J);
+ return (Container'Unrestricted_Access, J);
end if;
end loop;
@@ -835,7 +849,7 @@ package body Ada.Containers.Vectors is
if Is_Empty (Container) then
return No_Element;
else
- return (Container'Unchecked_Access, Index_Type'First);
+ return (Container'Unrestricted_Access, Index_Type'First);
end if;
end First;
@@ -1500,7 +1514,7 @@ package body Ada.Containers.Vectors is
begin
if Before.Container /= null
- and then Before.Container /= Container'Unchecked_Access
+ and then Before.Container /= Container'Unrestricted_Access
then
raise Program_Error with "Before cursor denotes wrong container";
end if;
@@ -1536,7 +1550,7 @@ package body Ada.Containers.Vectors is
begin
if Before.Container /= null
- and then Before.Container /= Container'Unchecked_Access
+ and then Before.Container /= Container'Unrestricted_Access
then
raise Program_Error with "Before cursor denotes wrong container";
end if;
@@ -1547,7 +1561,7 @@ package body Ada.Containers.Vectors is
then
Position := No_Element;
else
- Position := (Container'Unchecked_Access, Before.Index);
+ Position := (Container'Unrestricted_Access, Before.Index);
end if;
return;
@@ -1569,7 +1583,7 @@ package body Ada.Containers.Vectors is
Insert (Container, Index, New_Item);
- Position := (Container'Unchecked_Access, Index);
+ Position := (Container'Unrestricted_Access, Index);
end Insert;
procedure Insert
@@ -1582,7 +1596,7 @@ package body Ada.Containers.Vectors is
begin
if Before.Container /= null
- and then Before.Container /= Container'Unchecked_Access
+ and then Before.Container /= Container'Unrestricted_Access
then
raise Program_Error with "Before cursor denotes wrong container";
end if;
@@ -1619,7 +1633,7 @@ package body Ada.Containers.Vectors is
begin
if Before.Container /= null
- and then Before.Container /= Container'Unchecked_Access
+ and then Before.Container /= Container'Unrestricted_Access
then
raise Program_Error with "Before cursor denotes wrong container";
end if;
@@ -1630,7 +1644,7 @@ package body Ada.Containers.Vectors is
then
Position := No_Element;
else
- Position := (Container'Unchecked_Access, Before.Index);
+ Position := (Container'Unrestricted_Access, Before.Index);
end if;
return;
@@ -1652,7 +1666,7 @@ package body Ada.Containers.Vectors is
Insert (Container, Index, New_Item, Count);
- Position := (Container'Unchecked_Access, Index);
+ Position := (Container'Unrestricted_Access, Index);
end Insert;
procedure Insert
@@ -2036,7 +2050,7 @@ package body Ada.Containers.Vectors is
begin
if Before.Container /= null
- and then Before.Container /= Container'Unchecked_Access
+ and then Before.Container /= Container'Unrestricted_Access
then
raise Program_Error with "Before cursor denotes wrong container";
end if;
@@ -2047,7 +2061,7 @@ package body Ada.Containers.Vectors is
then
Position := No_Element;
else
- Position := (Container'Unchecked_Access, Before.Index);
+ Position := (Container'Unrestricted_Access, Before.Index);
end if;
return;
@@ -2069,7 +2083,7 @@ package body Ada.Containers.Vectors is
Insert_Space (Container, Index, Count => Count);
- Position := (Container'Unchecked_Access, Index);
+ Position := (Container'Unrestricted_Access, Index);
end Insert_Space;
--------------
@@ -2089,15 +2103,14 @@ package body Ada.Containers.Vectors is
(Container : Vector;
Process : not null access procedure (Position : Cursor))
is
- V : Vector renames Container'Unrestricted_Access.all;
- B : Natural renames V.Busy;
+ B : Natural renames Container'Unrestricted_Access.all.Busy;
begin
B := B + 1;
begin
for Indx in Index_Type'First .. Container.Last loop
- Process (Cursor'(Container'Unchecked_Access, Indx));
+ Process (Cursor'(Container'Unrestricted_Access, Indx));
end loop;
exception
when others =>
@@ -2112,9 +2125,16 @@ package body Ada.Containers.Vectors is
(Container : Vector)
return Vector_Iterator_Interfaces.Reversible_Iterator'Class
is
- It : constant Iterator := (Container'Unchecked_Access, Index_Type'First);
+ B : Natural renames Container'Unrestricted_Access.all.Busy;
+
begin
- return It;
+ return It : constant Iterator :=
+ (Limited_Controlled with
+ Container => Container'Unrestricted_Access,
+ Index => Index_Type'First)
+ do
+ B := B + 1;
+ end return;
end Iterate;
function Iterate
@@ -2122,9 +2142,16 @@ package body Ada.Containers.Vectors is
Start : Cursor)
return Vector_Iterator_Interfaces.Reversible_Iterator'class
is
- It : constant Iterator := (Container'Unchecked_Access, Start.Index);
+ B : Natural renames Container'Unrestricted_Access.all.Busy;
+
begin
- return It;
+ return It : constant Iterator :=
+ (Limited_Controlled with
+ Container => Container'Unrestricted_Access,
+ Index => Start.Index)
+ do
+ B := B + 1;
+ end return;
end Iterate;
----------
@@ -2136,7 +2163,7 @@ package body Ada.Containers.Vectors is
if Is_Empty (Container) then
return No_Element;
else
- return (Container'Unchecked_Access, Container.Last);
+ return (Container'Unrestricted_Access, Container.Last);
end if;
end Last;
@@ -2903,7 +2930,7 @@ package body Ada.Containers.Vectors is
begin
if Position.Container /= null
- and then Position.Container /= Container'Unchecked_Access
+ and then Position.Container /= Container'Unrestricted_Access
then
raise Program_Error with "Position cursor denotes wrong container";
end if;
@@ -2915,7 +2942,7 @@ package body Ada.Containers.Vectors is
for Indx in reverse Index_Type'First .. Last loop
if Container.Elements.EA (Indx) = Item then
- return (Container'Unchecked_Access, Indx);
+ return (Container'Unrestricted_Access, Indx);
end if;
end loop;
@@ -2960,7 +2987,7 @@ package body Ada.Containers.Vectors is
begin
for Indx in reverse Index_Type'First .. Container.Last loop
- Process (Cursor'(Container'Unchecked_Access, Indx));
+ Process (Cursor'(Container'Unrestricted_Access, Indx));
end loop;
exception
when others =>
@@ -3061,7 +3088,7 @@ package body Ada.Containers.Vectors is
if Index not in Index_Type'First .. Container.Last then
return No_Element;
else
- return (Container'Unchecked_Access, Index);
+ return (Container'Unrestricted_Access, Index);
end if;
end To_Cursor;