From fd8b8c01c3d00065dc5cd4c000db79e5b47463d4 Mon Sep 17 00:00:00 2001 From: Arnaud Charlet Date: Thu, 25 Apr 2013 12:54:33 +0200 Subject: [PATCH] [multiple changes] 2013-04-25 Hristian Kirtchev * checks.adb (Apply_Predicate_Check): Update the comment associated with the call to Check_Expression_Against_Static_Predicate. * sem_ch3.adb (Analyze_Object_Declaration): Update the comment associated with the call to Check_Expression_Against_Static_Predicate. * sem_util.adb (Check_Expression_Against_Static_Predicate): Broaden the check from a static expression to an expression with a known value at compile time. * sem_util.ads (Check_Expression_Against_Static_Predicate): Update comment on usage. 2013-04-25 Thomas Quinot * exp_attr.adb (Expand_N_Attribute_Reference, cases Position, First_Bit, and Last_Bit): Fix incorrect test in implementation of RM 2005 13.5.2(3/2). 2013-04-25 Claire Dross * a-cfhase.adb, a-cfhase.ads, a-cforma.adb, a-cforma.ads, a-cfhama.adb, a-cfhama.ads, a-cforse.adb, a-cforse.ads, a-cofove.adb, a-cofove.ads (Query_Element): Removed. (Update_Element): Removed. (Insert): The version with no New_Item specified is removed. (Iterate): Removed. (Write): Removed. (Read): Removed. Every check of fields Busy and Lock has been removed. 2013-04-25 Robert Dewar * sem_prag.adb (Analyze_Pragma, case Contract_Cases): Remove call to S14_Pragma (Find_Related_Subprogram): Require proper placement in subprogram body (Find_Related_Subprogram): Detect duplicates for all cases (Find_Related_Subprogram): Handle case of spec nested inside body. From-SVN: r198297 --- gcc/ada/ChangeLog | 38 +++++ gcc/ada/a-cfhama.adb | 304 +------------------------------------- gcc/ada/a-cfhama.ads | 63 +------- gcc/ada/a-cfhase.adb | 307 +------------------------------------- gcc/ada/a-cfhase.ads | 47 +----- gcc/ada/a-cforma.adb | 332 +---------------------------------------- gcc/ada/a-cforma.ads | 59 +------- gcc/ada/a-cforse.adb | 294 +----------------------------------- gcc/ada/a-cforse.ads | 52 +------ gcc/ada/a-cofove.adb | 409 ++------------------------------------------------- gcc/ada/a-cofove.ads | 115 ++------------- gcc/ada/checks.adb | 4 +- gcc/ada/exp_attr.adb | 30 ++-- gcc/ada/sem_ch3.adb | 7 +- gcc/ada/sem_prag.adb | 101 ++++++++----- gcc/ada/sem_util.adb | 8 +- gcc/ada/sem_util.ads | 6 +- 17 files changed, 168 insertions(+), 2008 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 69141c3..bb90af8 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,41 @@ +2013-04-25 Hristian Kirtchev + + * checks.adb (Apply_Predicate_Check): Update the comment associated + with the call to Check_Expression_Against_Static_Predicate. + * sem_ch3.adb (Analyze_Object_Declaration): Update the comment + associated with the call to Check_Expression_Against_Static_Predicate. + * sem_util.adb (Check_Expression_Against_Static_Predicate): + Broaden the check from a static expression to an expression with + a known value at compile time. + * sem_util.ads (Check_Expression_Against_Static_Predicate): Update + comment on usage. + +2013-04-25 Thomas Quinot + + * exp_attr.adb (Expand_N_Attribute_Reference, cases Position, + First_Bit, and Last_Bit): Fix incorrect test in implementation of + RM 2005 13.5.2(3/2). + +2013-04-25 Claire Dross + + * a-cfhase.adb, a-cfhase.ads, a-cforma.adb, a-cforma.ads, a-cfhama.adb, + a-cfhama.ads, a-cforse.adb, a-cforse.ads, a-cofove.adb, a-cofove.ads + (Query_Element): Removed. + (Update_Element): Removed. + (Insert): The version with no New_Item specified is removed. + (Iterate): Removed. + (Write): Removed. + (Read): Removed. + Every check of fields Busy and Lock has been removed. + +2013-04-25 Robert Dewar + + * sem_prag.adb (Analyze_Pragma, case Contract_Cases): Remove + call to S14_Pragma (Find_Related_Subprogram): Require proper + placement in subprogram body (Find_Related_Subprogram): Detect + duplicates for all cases (Find_Related_Subprogram): Handle case + of spec nested inside body. + 2013-04-25 Arnaud Charlet * par-prag.adb: Fix typo. diff --git a/gcc/ada/a-cfhama.adb b/gcc/ada/a-cfhama.adb index c692cb6..fc5c986 100644 --- a/gcc/ada/a-cfhama.adb +++ b/gcc/ada/a-cfhama.adb @@ -6,7 +6,7 @@ -- -- -- B o d y -- -- -- --- Copyright (C) 2010-2012, Free Software Foundation, Inc. -- +-- Copyright (C) 2010-2013, Free Software Foundation, Inc. -- -- -- -- GNAT is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- @@ -159,8 +159,6 @@ package body Ada.Containers.Formal_Hashed_Maps is "Source length exceeds Target capacity"; end if; - -- Check busy bits - Clear (Target); Insert_Elements (Source); @@ -266,11 +264,6 @@ package body Ada.Containers.Formal_Hashed_Maps is "Position cursor of Delete has no element"; end if; - if Container.Busy > 0 then - raise Program_Error with - "Delete attempted to tamper with elements (map is busy)"; - end if; - pragma Assert (Vet (Container, Position), "bad cursor in Delete"); HT_Ops.Delete_Node_Sans_Free (Container, Position.Node); @@ -495,10 +488,6 @@ package body Ada.Containers.Formal_Hashed_Maps is Insert (Container, Key, New_Item, Position, Inserted); if not Inserted then - if Container.Lock > 0 then - raise Program_Error with - "Include attempted to tamper with cursors (map is locked)"; - end if; declare N : Node_Type renames Container.Nodes (Position.Node); @@ -516,54 +505,6 @@ package body Ada.Containers.Formal_Hashed_Maps is procedure Insert (Container : in out Map; Key : Key_Type; - Position : out Cursor; - Inserted : out Boolean) - is - procedure Assign_Key (Node : in out Node_Type); - pragma Inline (Assign_Key); - - function New_Node return Count_Type; - pragma Inline (New_Node); - - procedure Local_Insert is - new Key_Ops.Generic_Conditional_Insert (New_Node); - - procedure Allocate is - new Generic_Allocate (Assign_Key); - - ----------------- - -- Assign_Key -- - ----------------- - - procedure Assign_Key (Node : in out Node_Type) is - begin - Node.Key := Key; - - -- What is following commented out line doing here ??? - -- Node.Element := New_Item; - end Assign_Key; - - -------------- - -- New_Node -- - -------------- - - function New_Node return Count_Type is - Result : Count_Type; - begin - Allocate (Container, Result); - return Result; - end New_Node; - - -- Start of processing for Insert - - begin - - Local_Insert (Container, Key, Position.Node, Inserted); - end Insert; - - procedure Insert - (Container : in out Map; - Key : Key_Type; New_Item : Element_Type; Position : out Cursor; Inserted : out Boolean) @@ -635,47 +576,6 @@ package body Ada.Containers.Formal_Hashed_Maps is return Length (Container) = 0; end Is_Empty; - ------------- - -- Iterate -- - ------------- - - procedure Iterate - (Container : Map; - Process : not null - access procedure (Container : Map; Position : Cursor)) - is - procedure Process_Node (Node : Count_Type); - pragma Inline (Process_Node); - - procedure Local_Iterate is new HT_Ops.Generic_Iteration (Process_Node); - - ------------------ - -- Process_Node -- - ------------------ - - procedure Process_Node (Node : Count_Type) is - begin - Process (Container, (Node => Node)); - end Process_Node; - - B : Natural renames Container'Unrestricted_Access.Busy; - - -- Start of processing for Iterate - - begin - B := B + 1; - - begin - Local_Iterate (Container); - exception - when others => - B := B - 1; - raise; - end; - - B := B - 1; - end Iterate; - --------- -- Key -- --------- @@ -752,11 +652,6 @@ package body Ada.Containers.Formal_Hashed_Maps is "Source length exceeds Target capacity"; end if; - if Source.Busy > 0 then - raise Program_Error with - "attempt to tamper with cursors of Source (list is busy)"; - end if; - Clear (Target); if Source.Length = 0 then @@ -849,105 +744,6 @@ package body Ada.Containers.Formal_Hashed_Maps is return False; end Overlap; - ------------------- - -- Query_Element -- - ------------------- - - procedure Query_Element - (Container : in out Map; - Position : Cursor; - Process : not null access - procedure (Key : Key_Type; Element : Element_Type)) - is - begin - if not Has_Element (Container, Position) then - raise Constraint_Error with - "Position cursor of Query_Element has no element"; - end if; - - pragma Assert (Vet (Container, Position), "bad cursor in Query_Element"); - - declare - N : Node_Type renames Container.Nodes (Position.Node); - B : Natural renames Container.Busy; - L : Natural renames Container.Lock; - - begin - B := B + 1; - L := L + 1; - - declare - K : Key_Type renames N.Key; - E : Element_Type renames N.Element; - begin - Process (K, E); - exception - when others => - L := L - 1; - B := B - 1; - raise; - end; - - L := L - 1; - B := B - 1; - end; - end Query_Element; - - ---------- - -- Read -- - ---------- - - procedure Read - (Stream : not null access Root_Stream_Type'Class; - Container : out Map) - is - function Read_Node (Stream : not null access Root_Stream_Type'Class) - return Count_Type; - - procedure Read_Nodes is - new HT_Ops.Generic_Read (Read_Node); - - --------------- - -- Read_Node -- - --------------- - - function Read_Node - (Stream : not null access Root_Stream_Type'Class) return Count_Type - is - procedure Read_Element (Node : in out Node_Type); - pragma Inline (Read_Element); - - procedure Allocate is - new Generic_Allocate (Read_Element); - - procedure Read_Element (Node : in out Node_Type) is - begin - Element_Type'Read (Stream, Node.Element); - end Read_Element; - - Node : Count_Type; - - -- Start of processing for Read_Node - - begin - Allocate (Container, Node); - return Node; - end Read_Node; - - -- Start of processing for Read - - begin - Read_Nodes (Stream, Container); - end Read; - - procedure Read - (Stream : not null access Root_Stream_Type'Class; - Item : out Cursor) - is - begin - raise Program_Error with "attempt to stream set cursor"; - end Read; - ------------- -- Replace -- ------------- @@ -965,11 +761,6 @@ package body Ada.Containers.Formal_Hashed_Maps is "attempt to replace key not in map"; end if; - if Container.Lock > 0 then - raise Program_Error with - "Replace attempted to tamper with cursors (map is locked)"; - end if; - declare N : Node_Type renames Container.Nodes (Node); begin @@ -993,11 +784,6 @@ package body Ada.Containers.Formal_Hashed_Maps is "Position cursor of Replace_Element has no element"; end if; - if Container.Lock > 0 then - raise Program_Error with - "Replace_Element attempted to tamper with cursors (map is locked)"; - end if; - pragma Assert (Vet (Container, Position), "bad cursor in Replace_Element"); @@ -1085,52 +871,6 @@ package body Ada.Containers.Formal_Hashed_Maps is return True; end Strict_Equal; - -------------------- - -- Update_Element -- - -------------------- - - procedure Update_Element - (Container : in out Map; - Position : Cursor; - Process : not null access procedure (Key : Key_Type; - Element : in out Element_Type)) - is - begin - if not Has_Element (Container, Position) then - raise Constraint_Error with - "Position cursor of Update_Element has no element"; - end if; - - pragma Assert (Vet (Container, Position), - "bad cursor in Update_Element"); - - declare - B : Natural renames Container.Busy; - L : Natural renames Container.Lock; - - begin - B := B + 1; - L := L + 1; - - declare - N : Node_Type renames Container.Nodes (Position.Node); - K : Key_Type renames N.Key; - E : Element_Type renames N.Element; - - begin - Process (K, E); - exception - when others => - L := L - 1; - B := B - 1; - raise; - end; - - L := L - 1; - B := B - 1; - end; - end Update_Element; - --------- -- Vet -- --------- @@ -1191,46 +931,4 @@ package body Ada.Containers.Formal_Hashed_Maps is end; end Vet; - ----------- - -- Write -- - ----------- - - procedure Write - (Stream : not null access Root_Stream_Type'Class; - Container : Map) - is - procedure Write_Node - (Stream : not null access Root_Stream_Type'Class; - Node : Node_Type); - pragma Inline (Write_Node); - - procedure Write_Nodes is new HT_Ops.Generic_Write (Write_Node); - - ---------------- - -- Write_Node -- - ---------------- - - procedure Write_Node - (Stream : not null access Root_Stream_Type'Class; - Node : Node_Type) - is - begin - Key_Type'Write (Stream, Node.Key); - Element_Type'Write (Stream, Node.Element); - end Write_Node; - - -- Start of processing for Write - - begin - Write_Nodes (Stream, Container); - end Write; - - procedure Write - (Stream : not null access Root_Stream_Type'Class; - Item : Cursor) - is - begin - raise Program_Error with "attempt to stream map cursor"; - end Write; - end Ada.Containers.Formal_Hashed_Maps; diff --git a/gcc/ada/a-cfhama.ads b/gcc/ada/a-cfhama.ads index c076d40..fdbd7a0 100644 --- a/gcc/ada/a-cfhama.ads +++ b/gcc/ada/a-cfhama.ads @@ -6,7 +6,7 @@ -- -- -- S p e c -- -- -- --- Copyright (C) 2004-2011, Free Software Foundation, Inc. -- +-- Copyright (C) 2004-2013, Free Software Foundation, Inc. -- -- -- -- This specification is derived from the Ada Reference Manual for use with -- -- GNAT. The copyright notice above, and the license provisions that follow -- @@ -52,7 +52,6 @@ -- See detailed specifications for these subprograms private with Ada.Containers.Hash_Tables; -private with Ada.Streams; generic type Key_Type is private; @@ -87,14 +86,15 @@ package Ada.Containers.Formal_Hashed_Maps is function Is_Empty (Container : Map) return Boolean; - -- ??? what does clear do to active elements? procedure Clear (Container : in out Map); procedure Assign (Target : in out Map; Source : Map); - -- ??? - -- capacity=0 means use container.length as cap of tgt - -- modulos=0 means use default_modulous(container.length) + -- Copy returns a container stricty equal to Source + -- It must have the same cursors associated to each element + -- Therefore: + -- - capacity=0 means use container.capacity as cap of tgt + -- - the modulus cannot be changed. function Copy (Source : Map; Capacity : Count_Type := 0) return Map; @@ -108,18 +108,6 @@ package Ada.Containers.Formal_Hashed_Maps is Position : Cursor; New_Item : Element_Type); - procedure Query_Element - (Container : in out Map; - Position : Cursor; - Process : not null access - procedure (Key : Key_Type; Element : Element_Type)); - - procedure Update_Element - (Container : in out Map; - Position : Cursor; - Process : not null access - procedure (Key : Key_Type; Element : in out Element_Type)); - procedure Move (Target : in out Map; Source : in out Map); procedure Insert @@ -132,12 +120,6 @@ package Ada.Containers.Formal_Hashed_Maps is procedure Insert (Container : in out Map; Key : Key_Type; - Position : out Cursor; - Inserted : out Boolean); - - procedure Insert - (Container : in out Map; - Key : Key_Type; New_Item : Element_Type); procedure Include @@ -186,11 +168,6 @@ package Ada.Containers.Formal_Hashed_Maps is Right : Map; CRight : Cursor) return Boolean; - procedure Iterate - (Container : Map; - Process : not null access - procedure (Container : Map; Position : Cursor)); - function Default_Modulus (Capacity : Count_Type) return Hash_Type; function Strict_Equal (Left, Right : Map) return Boolean; @@ -237,39 +214,11 @@ private new HT_Types.Hash_Table_Type (Capacity, Modulus) with null record; use HT_Types; - use Ada.Streams; - - procedure Write - (Stream : not null access Root_Stream_Type'Class; - Container : Map); - - for Map'Write use Write; - - procedure Read - (Stream : not null access Root_Stream_Type'Class; - Container : out Map); - - for Map'Read use Read; - - type Map_Access is access all Map; - for Map_Access'Storage_Size use 0; type Cursor is record Node : Count_Type; end record; - procedure Read - (Stream : not null access Root_Stream_Type'Class; - Item : out Cursor); - - for Cursor'Read use Read; - - procedure Write - (Stream : not null access Root_Stream_Type'Class; - Item : Cursor); - - for Cursor'Write use Write; - Empty_Map : constant Map := (Capacity => 0, Modulus => 0, others => <>); No_Element : constant Cursor := (Node => 0); diff --git a/gcc/ada/a-cfhase.adb b/gcc/ada/a-cfhase.adb index d5d73e2..539a0a8 100644 --- a/gcc/ada/a-cfhase.adb +++ b/gcc/ada/a-cfhase.adb @@ -6,7 +6,7 @@ -- -- -- B o d y -- -- -- --- Copyright (C) 2010-2012, Free Software Foundation, Inc. -- +-- Copyright (C) 2010-2013, Free Software Foundation, Inc. -- -- -- -- GNAT is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- @@ -295,11 +295,6 @@ package body Ada.Containers.Formal_Hashed_Sets is raise Constraint_Error with "Position cursor has no element"; end if; - if Container.Busy > 0 then - raise Program_Error with - "attempt to tamper with elements (set is busy)"; - end if; - pragma Assert (Vet (Container, Position), "bad cursor in Delete"); HT_Ops.Delete_Node_Sans_Free (Container, Position.Node); @@ -333,11 +328,6 @@ package body Ada.Containers.Formal_Hashed_Sets is return; end if; - if Target.Busy > 0 then - raise Program_Error with - "attempt to tamper with elements (set is busy)"; - end if; - if Src_Length >= Target.Length then Tgt_Node := HT_Ops.First (Target); while Tgt_Node /= 0 loop @@ -572,9 +562,6 @@ package body Ada.Containers.Formal_Hashed_Sets is end; end Equivalent_Elements; - -- What does the following comment signify??? - -- NOT MODIFIED - --------------------- -- Equivalent_Keys -- --------------------- @@ -700,10 +687,6 @@ package body Ada.Containers.Formal_Hashed_Sets is Insert (Container, New_Item, Position, Inserted); if not Inserted then - if Container.Lock > 0 then - raise Program_Error with - "attempt to tamper with cursors (set is locked)"; - end if; Container.Nodes (Position.Node).Element := New_Item; end if; @@ -804,11 +787,6 @@ package body Ada.Containers.Formal_Hashed_Sets is return; end if; - if Target.Busy > 0 then - raise Program_Error with - "attempt to tamper with elements (set is busy)"; - end if; - Tgt_Node := HT_Ops.First (Target); while Tgt_Node /= 0 loop if Find (Source, TN (Tgt_Node).Element).Node /= 0 then @@ -930,48 +908,6 @@ package body Ada.Containers.Formal_Hashed_Sets is return True; end Is_Subset; - ------------- - -- Iterate -- - ------------- - - procedure Iterate - (Container : Set; - Process : - not null access procedure (Container : Set; Position : Cursor)) - is - procedure Process_Node (Node : Count_Type); - pragma Inline (Process_Node); - - procedure Iterate is - new HT_Ops.Generic_Iteration (Process_Node); - - ------------------ - -- Process_Node -- - ------------------ - - procedure Process_Node (Node : Count_Type) is - begin - Process (Container, (Node => Node)); - end Process_Node; - - B : Natural renames Container'Unrestricted_Access.Busy; - - -- Start of processing for Iterate - - begin - B := B + 1; - - begin - Iterate (Container); - exception - when others => - B := B - 1; - raise; - end; - - B := B - 1; - end Iterate; - ---------- -- Left -- ---------- @@ -1029,11 +965,6 @@ package body Ada.Containers.Formal_Hashed_Sets is "Source length exceeds Target capacity"; end if; - if Source.Busy > 0 then - raise Program_Error with - "attempt to tamper with cursors of Source (list is busy)"; - end if; - Clear (Target); if Source.Length = 0 then @@ -1117,103 +1048,6 @@ package body Ada.Containers.Formal_Hashed_Sets is return False; end Overlap; - ------------------- - -- Query_Element -- - ------------------- - - procedure Query_Element - (Container : in out Set; - Position : Cursor; - Process : not null access procedure (Element : Element_Type)) - is - begin - if not Has_Element (Container, Position) then - raise Constraint_Error with - "Position cursor of Query_Element has no element"; - end if; - - pragma Assert (Vet (Container, Position), "bad cursor in Query_Element"); - - declare - B : Natural renames Container.Busy; - L : Natural renames Container.Lock; - - begin - B := B + 1; - L := L + 1; - - begin - Process (Container.Nodes (Position.Node).Element); - exception - when others => - L := L - 1; - B := B - 1; - raise; - end; - - L := L - 1; - B := B - 1; - end; - end Query_Element; - - ---------- - -- Read -- - ---------- - - procedure Read - (Stream : not null access Root_Stream_Type'Class; - Container : out Set) - is - function Read_Node (Stream : not null access Root_Stream_Type'Class) - return Count_Type; - - procedure Read_Nodes is - new HT_Ops.Generic_Read (Read_Node); - - --------------- - -- Read_Node -- - --------------- - - function Read_Node (Stream : not null access Root_Stream_Type'Class) - return Count_Type - is - procedure Read_Element (Node : in out Node_Type); - pragma Inline (Read_Element); - - procedure Allocate is new Generic_Allocate (Read_Element); - - ------------------ - -- Read_Element -- - ------------------ - - procedure Read_Element (Node : in out Node_Type) is - begin - Element_Type'Read (Stream, Node.Element); - end Read_Element; - - Node : Count_Type; - - -- Start of processing for Read_Node - - begin - Allocate (Container, Node); - return Node; - end Read_Node; - - -- Start of processing for Read - - begin - Read_Nodes (Stream, Container); - end Read; - - procedure Read - (Stream : not null access Root_Stream_Type'Class; - Item : out Cursor) - is - begin - raise Program_Error with "attempt to stream set cursor"; - end Read; - ------------- -- Replace -- ------------- @@ -1230,11 +1064,6 @@ package body Ada.Containers.Formal_Hashed_Sets is "attempt to replace element not in set"; end if; - if Container.Lock > 0 then - raise Program_Error with - "attempt to tamper with cursors (set is locked)"; - end if; - Container.Nodes (Node).Element := New_Item; end Replace; @@ -1391,11 +1220,6 @@ package body Ada.Containers.Formal_Hashed_Sets is return; end if; - if Target.Busy > 0 then - raise Program_Error with - "attempt to tamper with elements (set is busy)"; - end if; - Iterate (Source); end Symmetric_Difference; @@ -1475,10 +1299,6 @@ package body Ada.Containers.Formal_Hashed_Sets is return; end if; - if Target.Busy > 0 then - raise Program_Error with - "attempt to tamper with elements (set is busy)"; - end if; Iterate (Source); end Union; @@ -1557,47 +1377,6 @@ package body Ada.Containers.Formal_Hashed_Sets is end; end Vet; - ----------- - -- Write -- - ----------- - - procedure Write - (Stream : not null access Root_Stream_Type'Class; - Container : Set) - is - procedure Write_Node - (Stream : not null access Root_Stream_Type'Class; - Node : Node_Type); - pragma Inline (Write_Node); - - procedure Write_Nodes is - new HT_Ops.Generic_Write (Write_Node); - - ---------------- - -- Write_Node -- - ---------------- - - procedure Write_Node - (Stream : not null access Root_Stream_Type'Class; - Node : Node_Type) - is - begin - Element_Type'Write (Stream, Node.Element); - end Write_Node; - - -- Start of processing for Write - - begin - Write_Nodes (Stream, Container); - end Write; - - procedure Write - (Stream : not null access Root_Stream_Type'Class; - Item : Cursor) - is - begin - raise Program_Error with "attempt to stream set cursor"; - end Write; package body Generic_Keys is ----------------------- @@ -1752,90 +1531,6 @@ package body Ada.Containers.Formal_Hashed_Sets is Replace_Element (Container, Node, New_Item); end Replace; - ----------------------------------- - -- Update_Element_Preserving_Key -- - ----------------------------------- - - procedure Update_Element_Preserving_Key - (Container : in out Set; - Position : Cursor; - Process : not null access - procedure (Element : in out Element_Type)) - is - Indx : Hash_Type; - N : Nodes_Type renames Container.Nodes; - - begin - if Position.Node = 0 then - raise Constraint_Error with - "Position cursor equals No_Element"; - end if; - - pragma Assert - (Vet (Container, Position), - "bad cursor in Update_Element_Preserving_Key"); - - -- Record bucket now, in case key is changed - - Indx := HT_Ops.Index (Container.Buckets, N (Position.Node)); - - declare - E : Element_Type renames N (Position.Node).Element; - K : constant Key_Type := Key (E); - B : Natural renames Container.Busy; - L : Natural renames Container.Lock; - - begin - B := B + 1; - L := L + 1; - - begin - Process (E); - exception - when others => - L := L - 1; - B := B - 1; - raise; - end; - - L := L - 1; - B := B - 1; - - if Equivalent_Keys (K, Key (E)) then - pragma Assert (Hash (K) = Hash (E)); - return; - end if; - end; - - -- Key was modified, so remove this node from set - - if Container.Buckets (Indx) = Position.Node then - Container.Buckets (Indx) := N (Position.Node).Next; - - else - declare - Prev : Count_Type := Container.Buckets (Indx); - - begin - while N (Prev).Next /= Position.Node loop - Prev := N (Prev).Next; - - if Prev = 0 then - raise Program_Error with - "Position cursor is bad (node not found)"; - end if; - end loop; - - N (Prev).Next := N (Position.Node).Next; - end; - end if; - - Container.Length := Container.Length - 1; - Free (Container, Position.Node); - - raise Program_Error with "key was modified"; - end Update_Element_Preserving_Key; - end Generic_Keys; end Ada.Containers.Formal_Hashed_Sets; diff --git a/gcc/ada/a-cfhase.ads b/gcc/ada/a-cfhase.ads index ad6c72f..a9278dc 100644 --- a/gcc/ada/a-cfhase.ads +++ b/gcc/ada/a-cfhase.ads @@ -6,7 +6,7 @@ -- -- -- S p e c -- -- -- --- Copyright (C) 2004-2011, Free Software Foundation, Inc. -- +-- Copyright (C) 2004-2013, Free Software Foundation, Inc. -- -- -- -- This specification is derived from the Ada Reference Manual for use with -- -- GNAT. The copyright notice above, and the license provisions that follow -- @@ -52,7 +52,6 @@ -- See detailed specifications for these subprograms private with Ada.Containers.Hash_Tables; -private with Ada.Streams; generic type Element_Type is private; @@ -68,8 +67,7 @@ package Ada.Containers.Formal_Hashed_Sets is pragma Pure; type Set (Capacity : Count_Type; Modulus : Hash_Type) is tagged private; - -- why is this commented out ??? - -- pragma Preelaborable_Initialization (Set); + pragma Preelaborable_Initialization (Set); type Cursor is private; pragma Preelaborable_Initialization (Cursor); @@ -108,11 +106,6 @@ package Ada.Containers.Formal_Hashed_Sets is Position : Cursor; New_Item : Element_Type); - procedure Query_Element - (Container : in out Set; - Position : Cursor; - Process : not null access procedure (Element : Element_Type)); - procedure Move (Target : in out Set; Source : in out Set); procedure Insert @@ -187,11 +180,6 @@ package Ada.Containers.Formal_Hashed_Sets is (Left : Element_Type; Right : Set; CRight : Cursor) return Boolean; - procedure Iterate - (Container : Set; - Process : - not null access procedure (Container : Set; Position : Cursor)); - function Default_Modulus (Capacity : Count_Type) return Hash_Type; generic @@ -222,12 +210,6 @@ package Ada.Containers.Formal_Hashed_Sets is function Contains (Container : Set; Key : Key_Type) return Boolean; - procedure Update_Element_Preserving_Key - (Container : in out Set; - Position : Cursor; - Process : not null access - procedure (Element : in out Element_Type)); - end Generic_Keys; function Strict_Equal (Left, Right : Set) return Boolean; @@ -262,38 +244,13 @@ private new HT_Types.Hash_Table_Type (Capacity, Modulus) with null record; use HT_Types; - use Ada.Streams; type Cursor is record Node : Count_Type; end record; - procedure Write - (Stream : not null access Root_Stream_Type'Class; - Item : Cursor); - - for Cursor'Write use Write; - - procedure Read - (Stream : not null access Root_Stream_Type'Class; - Item : out Cursor); - - for Cursor'Read use Read; - No_Element : constant Cursor := (Node => 0); - procedure Write - (Stream : not null access Root_Stream_Type'Class; - Container : Set); - - for Set'Write use Write; - - procedure Read - (Stream : not null access Root_Stream_Type'Class; - Container : out Set); - - for Set'Read use Read; - Empty_Set : constant Set := (Capacity => 0, Modulus => 0, others => <>); end Ada.Containers.Formal_Hashed_Sets; diff --git a/gcc/ada/a-cforma.adb b/gcc/ada/a-cforma.adb index 6b45ad6..ac76391 100644 --- a/gcc/ada/a-cforma.adb +++ b/gcc/ada/a-cforma.adb @@ -6,7 +6,7 @@ -- -- -- B o d y -- -- -- --- Copyright (C) 2010-2012, Free Software Foundation, Inc. -- +-- Copyright (C) 2010-2013, Free Software Foundation, Inc. -- -- -- -- GNAT is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- @@ -558,11 +558,6 @@ package body Ada.Containers.Formal_Ordered_Maps is Insert (Container, Key, New_Item, Position, Inserted); if not Inserted then - if Container.Lock > 0 then - raise Program_Error with - "attempt to tamper with cursors (map is locked)"; - end if; - declare N : Node_Type renames Container.Nodes (Position.Node); begin @@ -635,56 +630,6 @@ package body Ada.Containers.Formal_Ordered_Maps is end if; end Insert; - ------------ - -- Insert -- - ------------ - - procedure Insert - (Container : in out Map; - Key : Key_Type; - Position : out Cursor; - Inserted : out Boolean) - is - function New_Node return Node_Access; - - procedure Insert_Post is - new Key_Ops.Generic_Insert_Post (New_Node); - - procedure Insert_Sans_Hint is - new Key_Ops.Generic_Conditional_Insert (Insert_Post); - - -------------- - -- New_Node -- - -------------- - - function New_Node return Node_Access is - procedure Initialize (Node : in out Node_Type); - procedure Allocate_Node is new Generic_Allocate (Initialize); - - ---------------- - -- Initialize -- - ---------------- - - procedure Initialize (Node : in out Node_Type) is - begin - Node.Key := Key; - end Initialize; - - X : Node_Access; - - -- Start of processing for New_Node - - begin - Allocate_Node (Container, X); - return X; - end New_Node; - - -- Start of processing for Insert - - begin - Insert_Sans_Hint (Container, Key, Position.Node, Inserted); - end Insert; - -------------- -- Is_Empty -- -------------- @@ -720,48 +665,6 @@ package body Ada.Containers.Formal_Ordered_Maps is return Left < Right.Key; end Is_Less_Key_Node; - ------------- - -- Iterate -- - ------------- - - procedure Iterate - (Container : Map; - Process : - not null access procedure (Container : Map; Position : Cursor)) - is - procedure Process_Node (Node : Node_Access); - pragma Inline (Process_Node); - - procedure Local_Iterate is - new Tree_Operations.Generic_Iteration (Process_Node); - - ------------------ - -- Process_Node -- - ------------------ - - procedure Process_Node (Node : Node_Access) is - begin - Process (Container, (Node => Node)); - end Process_Node; - - B : Natural renames Container'Unrestricted_Access.Busy; - - -- Start of processing for Iterate - - begin - B := B + 1; - - begin - Local_Iterate (Container); - exception - when others => - B := B - 1; - raise; - end; - - B := B - 1; - end Iterate; - --------- -- Key -- --------- @@ -881,11 +784,6 @@ package body Ada.Containers.Formal_Ordered_Maps is "Source length exceeds Target capacity"; end if; - if Source.Busy > 0 then - raise Program_Error with - "attempt to tamper with cursors of Source (list is busy)"; - end if; - Clear (Target); loop @@ -1014,93 +912,6 @@ package body Ada.Containers.Formal_Ordered_Maps is end; end Previous; - ------------------- - -- Query_Element -- - ------------------- - - procedure Query_Element - (Container : in out Map; - Position : Cursor; - Process : not null access procedure (Key : Key_Type; - Element : Element_Type)) - is - begin - if not Has_Element (Container, Position) then - raise Constraint_Error with - "Position cursor of Query_Element has no element"; - end if; - - pragma Assert (Vet (Container, Position.Node), - "Position cursor of Query_Element is bad"); - - declare - B : Natural renames Container.Busy; - L : Natural renames Container.Lock; - - begin - B := B + 1; - L := L + 1; - - declare - N : Node_Type renames Container.Nodes (Position.Node); - K : Key_Type renames N.Key; - E : Element_Type renames N.Element; - - begin - Process (K, E); - exception - when others => - L := L - 1; - B := B - 1; - raise; - end; - - L := L - 1; - B := B - 1; - end; - end Query_Element; - - ---------- - -- Read -- - ---------- - - procedure Read - (Stream : not null access Root_Stream_Type'Class; - Container : out Map) - is - procedure Read_Element (Node : in out Node_Type); - pragma Inline (Read_Element); - - procedure Allocate is - new Generic_Allocate (Read_Element); - - procedure Read_Elements is - new Tree_Operations.Generic_Read (Allocate); - - ------------------ - -- Read_Element -- - ------------------ - - procedure Read_Element (Node : in out Node_Type) is - begin - Key_Type'Read (Stream, Node.Key); - Element_Type'Read (Stream, Node.Element); - end Read_Element; - - -- Start of processing for Read - - begin - Read_Elements (Stream, Container); - end Read; - - procedure Read - (Stream : not null access Root_Stream_Type'Class; - Item : out Cursor) - is - begin - raise Program_Error with "attempt to stream map cursor"; - end Read; - ------------- -- Replace -- ------------- @@ -1119,11 +930,6 @@ package body Ada.Containers.Formal_Ordered_Maps is raise Constraint_Error with "key not in map"; end if; - if Container.Lock > 0 then - raise Program_Error with - "attempt to tamper with cursors (map is locked)"; - end if; - declare N : Node_Type renames Container.Nodes (Node); begin @@ -1148,59 +954,12 @@ package body Ada.Containers.Formal_Ordered_Maps is "Position cursor of Replace_Element has no element"; end if; - if Container.Lock > 0 then - raise Program_Error with - "attempt to tamper with cursors (map is locked)"; - end if; - pragma Assert (Vet (Container, Position.Node), "Position cursor of Replace_Element is bad"); Container.Nodes (Position.Node).Element := New_Item; end Replace_Element; - --------------------- - -- Reverse_Iterate -- - --------------------- - - procedure Reverse_Iterate - (Container : Map; - Process : not null access procedure (Container : Map; - Position : Cursor)) - is - procedure Process_Node (Node : Node_Access); - pragma Inline (Process_Node); - - procedure Local_Reverse_Iterate is - new Tree_Operations.Generic_Reverse_Iteration (Process_Node); - - ------------------ - -- Process_Node -- - ------------------ - - procedure Process_Node (Node : Node_Access) is - begin - Process (Container, (Node => Node)); - end Process_Node; - - B : Natural renames Container'Unrestricted_Access.Busy; - - -- Start of processing for Reverse_Iterate - - begin - B := B + 1; - - begin - Local_Reverse_Iterate (Container); - exception - when others => - B := B - 1; - raise; - end; - - B := B - 1; - end Reverse_Iterate; - ----------- -- Right -- ----------- @@ -1305,93 +1064,4 @@ package body Ada.Containers.Formal_Ordered_Maps is return False; end Strict_Equal; - -------------------- - -- Update_Element -- - -------------------- - - procedure Update_Element - (Container : in out Map; - Position : Cursor; - Process : not null access procedure (Key : Key_Type; - Element : in out Element_Type)) - is - begin - if not Has_Element (Container, Position) then - raise Constraint_Error with - "Position cursor of Update_Element has no element"; - end if; - - pragma Assert (Vet (Container, Position.Node), - "Position cursor of Update_Element is bad"); - - declare - B : Natural renames Container.Busy; - L : Natural renames Container.Lock; - - begin - B := B + 1; - L := L + 1; - - declare - N : Node_Type renames Container.Nodes (Position.Node); - K : Key_Type renames N.Key; - E : Element_Type renames N.Element; - - begin - Process (K, E); - exception - when others => - L := L - 1; - B := B - 1; - raise; - end; - - L := L - 1; - B := B - 1; - end; - end Update_Element; - - ----------- - -- Write -- - ----------- - - procedure Write - (Stream : not null access Root_Stream_Type'Class; - Container : Map) - is - procedure Write_Node - (Stream : not null access Root_Stream_Type'Class; - Node : Node_Type); - pragma Inline (Write_Node); - - procedure Write_Nodes is - new Tree_Operations.Generic_Write (Write_Node); - - ---------------- - -- Write_Node -- - ---------------- - - procedure Write_Node - (Stream : not null access Root_Stream_Type'Class; - Node : Node_Type) - is - begin - Key_Type'Write (Stream, Node.Key); - Element_Type'Write (Stream, Node.Element); - end Write_Node; - - -- Start of processing for Write - - begin - Write_Nodes (Stream, Container); - end Write; - - procedure Write - (Stream : not null access Root_Stream_Type'Class; - Item : Cursor) - is - begin - raise Program_Error with "attempt to stream map cursor"; - end Write; - end Ada.Containers.Formal_Ordered_Maps; diff --git a/gcc/ada/a-cforma.ads b/gcc/ada/a-cforma.ads index 145ff51..c96fee0 100644 --- a/gcc/ada/a-cforma.ads +++ b/gcc/ada/a-cforma.ads @@ -6,7 +6,7 @@ -- -- -- S p e c -- -- -- --- Copyright (C) 2004-2011, Free Software Foundation, Inc. -- +-- Copyright (C) 2004-2013, Free Software Foundation, Inc. -- -- -- -- This specification is derived from the Ada Reference Manual for use with -- -- GNAT. The copyright notice above, and the license provisions that follow -- @@ -54,7 +54,6 @@ -- See detailed specifications for these subprograms private with Ada.Containers.Red_Black_Trees; -private with Ada.Streams; generic type Key_Type is private; @@ -99,18 +98,6 @@ package Ada.Containers.Formal_Ordered_Maps is Position : Cursor; New_Item : Element_Type); - procedure Query_Element - (Container : in out Map; - Position : Cursor; - Process : not null access - procedure (Key : Key_Type; Element : Element_Type)); - - procedure Update_Element - (Container : in out Map; - Position : Cursor; - Process : not null access - procedure (Key : Key_Type; Element : in out Element_Type)); - procedure Move (Target : in out Map; Source : in out Map); procedure Insert @@ -123,12 +110,6 @@ package Ada.Containers.Formal_Ordered_Maps is procedure Insert (Container : in out Map; Key : Key_Type; - Position : out Cursor; - Inserted : out Boolean); - - procedure Insert - (Container : in out Map; - Key : Key_Type; New_Item : Element_Type); procedure Include @@ -183,16 +164,6 @@ package Ada.Containers.Formal_Ordered_Maps is function Has_Element (Container : Map; Position : Cursor) return Boolean; - procedure Iterate - (Container : Map; - Process : - not null access procedure (Container : Map; Position : Cursor)); - - procedure Reverse_Iterate - (Container : Map; - Process : not null access - procedure (Container : Map; Position : Cursor)); - function Strict_Equal (Left, Right : Map) return Boolean; -- Strict_Equal returns True if the containers are physically equal, i.e. -- they are structurally equal (function "=" returns True) and that they @@ -234,38 +205,12 @@ private type Map (Capacity : Count_Type) is new Tree_Types.Tree_Type (Capacity) with null record; - use Ada.Streams; - type Cursor is record Node : Node_Access; end record; - procedure Write - (Stream : not null access Root_Stream_Type'Class; - Item : Cursor); - - for Cursor'Write use Write; - - procedure Read - (Stream : not null access Root_Stream_Type'Class; - Item : out Cursor); - - for Cursor'Read use Read; + Empty_Map : constant Map := (Capacity => 0, others => <>); No_Element : constant Cursor := (Node => 0); - procedure Write - (Stream : not null access Root_Stream_Type'Class; - Container : Map); - - for Map'Write use Write; - - procedure Read - (Stream : not null access Root_Stream_Type'Class; - Container : out Map); - - for Map'Read use Read; - - Empty_Map : constant Map := (Capacity => 0, others => <>); - end Ada.Containers.Formal_Ordered_Maps; diff --git a/gcc/ada/a-cforse.adb b/gcc/ada/a-cforse.adb index 0707d74..22e9222 100644 --- a/gcc/ada/a-cforse.adb +++ b/gcc/ada/a-cforse.adb @@ -6,7 +6,7 @@ -- -- -- B o d y -- -- -- --- Copyright (C) 2010-2012, Free Software Foundation, Inc. -- +-- Copyright (C) 2010-2013, Free Software Foundation, Inc. -- -- -- -- GNAT is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- @@ -807,64 +807,6 @@ package body Ada.Containers.Formal_Ordered_Sets is end if; end Replace; - ----------------------------------- - -- Update_Element_Preserving_Key -- - ----------------------------------- - - procedure Update_Element_Preserving_Key - (Container : in out Set; - Position : Cursor; - Process : not null access procedure (Element : in out Element_Type)) - is - begin - if not Has_Element (Container, Position) then - raise Constraint_Error with - "Position cursor has no element"; - end if; - - pragma Assert (Vet (Container, Position.Node), - "bad cursor in Update_Element_Preserving_Key"); - - declare - N : Tree_Types.Nodes_Type renames Container.Nodes; - - E : Element_Type renames N (Position.Node).Element; - K : constant Key_Type := Key (E); - - B : Natural renames Container.Busy; - L : Natural renames Container.Lock; - - begin - B := B + 1; - L := L + 1; - - begin - Process (E); - exception - when others => - L := L - 1; - B := B - 1; - raise; - end; - - L := L - 1; - B := B - 1; - - if Equivalent_Keys (K, Key (E)) then - return; - end if; - end; - - declare - X : constant Count_Type := Position.Node; - begin - Tree_Operations.Delete_Node_Sans_Free (Container, X); - Formal_Ordered_Sets.Free (Container, X); - end; - - raise Program_Error with "key was modified"; - end Update_Element_Preserving_Key; - end Generic_Keys; ----------------- @@ -892,11 +834,6 @@ package body Ada.Containers.Formal_Ordered_Sets is Insert (Container, New_Item, Position, Inserted); if not Inserted then - if Container.Lock > 0 then - raise Program_Error with - "attempt to tamper with cursors (set is locked)"; - end if; - declare N : Tree_Types.Nodes_Type renames Container.Nodes; begin @@ -1122,50 +1059,6 @@ package body Ada.Containers.Formal_Ordered_Sets is return Set_Ops.Set_Subset (Subset, Of_Set => Of_Set); end Is_Subset; - ------------- - -- Iterate -- - ------------- - - procedure Iterate - (Container : Set; - Process : not null access procedure (Container : Set; - Position : Cursor)) - is - procedure Process_Node (Node : Count_Type); - pragma Inline (Process_Node); - - procedure Local_Iterate is - new Tree_Operations.Generic_Iteration (Process_Node); - - ------------------ - -- Process_Node -- - ------------------ - - procedure Process_Node (Node : Count_Type) is - begin - Process (Container, (Node => Node)); - end Process_Node; - - -- Local variables - - B : Natural renames Container'Unrestricted_Access.Busy; - - -- Start of prccessing for Iterate - - begin - B := B + 1; - - begin - Local_Iterate (Container); - exception - when others => - B := B - 1; - raise; - end; - - B := B - 1; - end Iterate; - ---------- -- Last -- ---------- @@ -1257,11 +1150,6 @@ package body Ada.Containers.Formal_Ordered_Sets is "Source length exceeds Target capacity"; end if; - if Source.Busy > 0 then - raise Program_Error with - "attempt to tamper with cursors of Source (list is busy)"; - end if; - Clear (Target); loop @@ -1347,85 +1235,6 @@ package body Ada.Containers.Formal_Ordered_Sets is Position := Previous (Container, Position); end Previous; - ------------------- - -- Query_Element -- - ------------------- - - procedure Query_Element - (Container : in out Set; - Position : Cursor; - Process : not null access procedure (Element : Element_Type)) - is - begin - if not Has_Element (Container, Position) then - raise Constraint_Error with "Position cursor has no element"; - end if; - - pragma Assert (Vet (Container, Position.Node), - "bad cursor in Query_Element"); - - declare - B : Natural renames Container.Busy; - L : Natural renames Container.Lock; - - begin - B := B + 1; - L := L + 1; - - begin - Process (Container.Nodes (Position.Node).Element); - exception - when others => - L := L - 1; - B := B - 1; - raise; - end; - - L := L - 1; - B := B - 1; - end; - end Query_Element; - - ---------- - -- Read -- - ---------- - - procedure Read - (Stream : not null access Root_Stream_Type'Class; - Container : out Set) - is - procedure Read_Element (Node : in out Node_Type); - pragma Inline (Read_Element); - - procedure Allocate is - new Generic_Allocate (Read_Element); - - procedure Read_Elements is - new Tree_Operations.Generic_Read (Allocate); - - ------------------ - -- Read_Element -- - ------------------ - - procedure Read_Element (Node : in out Node_Type) is - begin - Element_Type'Read (Stream, Node.Element); - end Read_Element; - - -- Start of processing for Read - - begin - Read_Elements (Stream, Container); - end Read; - - procedure Read - (Stream : not null access Root_Stream_Type'Class; - Item : out Cursor) - is - begin - raise Program_Error with "attempt to stream set cursor"; - end Read; - ------------- -- Replace -- ------------- @@ -1439,11 +1248,6 @@ package body Ada.Containers.Formal_Ordered_Sets is "attempt to replace element not in set"; end if; - if Container.Lock > 0 then - raise Program_Error with - "attempt to tamper with cursors (set is locked)"; - end if; - Container.Nodes (Node).Element := New_Item; end Replace; @@ -1502,11 +1306,6 @@ package body Ada.Containers.Formal_Ordered_Sets is null; else - if Tree.Lock > 0 then - raise Program_Error with - "attempt to tamper with cursors (set is locked)"; - end if; - NN (Node).Element := Item; return; end if; @@ -1518,11 +1317,6 @@ package body Ada.Containers.Formal_Ordered_Sets is elsif Item < NN (Hint).Element then if Hint = Node then - if Tree.Lock > 0 then - raise Program_Error with - "attempt to tamper with cursors (set is locked)"; - end if; - NN (Node).Element := Item; return; end if; @@ -1532,7 +1326,7 @@ package body Ada.Containers.Formal_Ordered_Sets is raise Program_Error with "attempt to replace existing element"; end if; - Tree_Operations.Delete_Node_Sans_Free (Tree, Node); -- Checks busy-bit + Tree_Operations.Delete_Node_Sans_Free (Tree, Node); Local_Insert_With_Hint (Tree => Tree, @@ -1562,48 +1356,6 @@ package body Ada.Containers.Formal_Ordered_Sets is Replace_Element (Container, Position.Node, New_Item); end Replace_Element; - --------------------- - -- Reverse_Iterate -- - --------------------- - - procedure Reverse_Iterate - (Container : Set; - Process : not null access procedure (Container : Set; - Position : Cursor)) - is - procedure Process_Node (Node : Count_Type); - pragma Inline (Process_Node); - - procedure Local_Reverse_Iterate is - new Tree_Operations.Generic_Reverse_Iteration (Process_Node); - - ------------------ - -- Process_Node -- - ------------------ - - procedure Process_Node (Node : Count_Type) is - begin - Process (Container, (Node => Node)); - end Process_Node; - - B : Natural renames Container'Unrestricted_Access.Busy; - - -- Start of processing for Reverse_Iterate - - begin - B := B + 1; - - begin - Local_Reverse_Iterate (Container); - exception - when others => - B := B - 1; - raise; - end; - - B := B - 1; - end Reverse_Iterate; - ----------- -- Right -- ----------- @@ -1781,46 +1533,4 @@ package body Ada.Containers.Formal_Ordered_Sets is end return; end Union; - ----------- - -- Write -- - ----------- - - procedure Write - (Stream : not null access Root_Stream_Type'Class; - Container : Set) - is - procedure Write_Element - (Stream : not null access Root_Stream_Type'Class; - Node : Node_Type); - pragma Inline (Write_Element); - - procedure Write_Elements is - new Tree_Operations.Generic_Write (Write_Element); - - ------------------- - -- Write_Element -- - ------------------- - - procedure Write_Element - (Stream : not null access Root_Stream_Type'Class; - Node : Node_Type) - is - begin - Element_Type'Write (Stream, Node.Element); - end Write_Element; - - -- Start of processing for Write - - begin - Write_Elements (Stream, Container); - end Write; - - procedure Write - (Stream : not null access Root_Stream_Type'Class; - Item : Cursor) - is - begin - raise Program_Error with "attempt to stream set cursor"; - end Write; - end Ada.Containers.Formal_Ordered_Sets; diff --git a/gcc/ada/a-cforse.ads b/gcc/ada/a-cforse.ads index 03203cd..77862a6 100644 --- a/gcc/ada/a-cforse.ads +++ b/gcc/ada/a-cforse.ads @@ -6,7 +6,7 @@ -- -- -- S p e c -- -- -- --- Copyright (C) 2004-2011, Free Software Foundation, Inc. -- +-- Copyright (C) 2004-2013, Free Software Foundation, Inc. -- -- -- -- This specification is derived from the Ada Reference Manual for use with -- -- GNAT. The copyright notice above, and the license provisions that follow -- @@ -53,7 +53,6 @@ -- See detailed specifications for these subprograms private with Ada.Containers.Red_Black_Trees; -private with Ada.Streams; generic type Element_Type is private; @@ -100,11 +99,6 @@ package Ada.Containers.Formal_Ordered_Sets is Position : Cursor; New_Item : Element_Type); - procedure Query_Element - (Container : in out Set; - Position : Cursor; - Process : not null access procedure (Element : Element_Type)); - procedure Move (Target : in out Set; Source : in out Set); procedure Insert @@ -195,16 +189,6 @@ package Ada.Containers.Formal_Ordered_Sets is function Has_Element (Container : Set; Position : Cursor) return Boolean; - procedure Iterate - (Container : Set; - Process : - not null access procedure (Container : Set; Position : Cursor)); - - procedure Reverse_Iterate - (Container : Set; - Process : not null access - procedure (Container : Set; Position : Cursor)); - generic type Key_Type (<>) is private; @@ -237,12 +221,6 @@ package Ada.Containers.Formal_Ordered_Sets is function Contains (Container : Set; Key : Key_Type) return Boolean; - procedure Update_Element_Preserving_Key - (Container : in out Set; - Position : Cursor; - Process : not null access - procedure (Element : in out Element_Type)); - end Generic_Keys; function Strict_Equal (Left, Right : Set) return Boolean; @@ -280,41 +258,13 @@ private new Tree_Types.Tree_Type (Capacity) with null record; use Red_Black_Trees; - use Ada.Streams; - - type Set_Access is access all Set; - for Set_Access'Storage_Size use 0; type Cursor is record Node : Count_Type; end record; - procedure Write - (Stream : not null access Root_Stream_Type'Class; - Item : Cursor); - - for Cursor'Write use Write; - - procedure Read - (Stream : not null access Root_Stream_Type'Class; - Item : out Cursor); - - for Cursor'Read use Read; - No_Element : constant Cursor := (Node => 0); - procedure Write - (Stream : not null access Root_Stream_Type'Class; - Container : Set); - - for Set'Write use Write; - - procedure Read - (Stream : not null access Root_Stream_Type'Class; - Container : out Set); - - for Set'Read use Read; - Empty_Set : constant Set := (Capacity => 0, others => <>); end Ada.Containers.Formal_Ordered_Sets; diff --git a/gcc/ada/a-cofove.adb b/gcc/ada/a-cofove.adb index 548512d..69de29d 100644 --- a/gcc/ada/a-cofove.adb +++ b/gcc/ada/a-cofove.adb @@ -6,7 +6,7 @@ -- -- -- B o d y -- -- -- --- Copyright (C) 2010-2012, Free Software Foundation, Inc. -- +-- Copyright (C) 2010-2013, Free Software Foundation, Inc. -- -- -- -- GNAT is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- @@ -37,6 +37,11 @@ package body Ada.Containers.Formal_Vectors is (Container : Vector; Position : Count_Type) return Element_Type; + procedure Insert_Space + (Container : in out Vector; + Before : Extended_Index; + Count : Count_Type := 1); + --------- -- "&" -- --------- @@ -256,7 +261,7 @@ package body Ada.Containers.Formal_Vectors is -- Capacity -- -------------- - function Capacity (Container : Vector) return Capacity_Subtype is + function Capacity (Container : Vector) return Count_Type is begin return Container.Elements'Length; end Capacity; @@ -267,11 +272,6 @@ package body Ada.Containers.Formal_Vectors is procedure Clear (Container : in out Vector) is begin - if Container.Busy > 0 then - raise Program_Error with - "attempt to tamper with elements (vector is busy)"; - end if; - Container.Last := No_Index; end Clear; @@ -293,10 +293,10 @@ package body Ada.Containers.Formal_Vectors is function Copy (Source : Vector; - Capacity : Capacity_Subtype := 0) return Vector + Capacity : Count_Type := 0) return Vector is LS : constant Count_Type := Length (Source); - C : Capacity_Subtype; + C : Count_Type; begin if Capacity = 0 then @@ -339,11 +339,6 @@ package body Ada.Containers.Formal_Vectors is return; end if; - if Container.Busy > 0 then - raise Program_Error with - "attempt to tamper with elements (vector is busy)"; - end if; - declare I_As_Int : constant Int := Int (Index); Old_Last_As_Int : constant Int := Index_Type'Pos (Container.Last); @@ -437,11 +432,6 @@ package body Ada.Containers.Formal_Vectors is return; end if; - if Container.Busy > 0 then - raise Program_Error with - "attempt to tamper with elements (vector is busy)"; - end if; - Index := Int'Base (Container.Last) - Int'Base (Count); if Index < Index_Type'Pos (Index_Type'First) then @@ -607,7 +597,7 @@ package body Ada.Containers.Formal_Vectors is end if; declare - L : constant Capacity_Subtype := Length (Container); + L : constant Count_Type := Length (Container); begin for J in Count_Type range 1 .. L - 1 loop if Get_Element (Container, J + 1) < @@ -650,16 +640,6 @@ package body Ada.Containers.Formal_Vectors is -- I think we're missing this check in a-convec.adb... ??? - if Target.Busy > 0 then - raise Program_Error with - "attempt to tamper with elements (vector is busy)"; - end if; - - if Source.Busy > 0 then - raise Program_Error with - "attempt to tamper with elements (vector is busy)"; - end if; - I := Length (Target); Target.Set_Length (I + Length (Source)); @@ -709,11 +689,6 @@ package body Ada.Containers.Formal_Vectors is return; end if; - if Container.Lock > 0 then - raise Program_Error with - "attempt to tamper with cursors (vector is locked)"; - end if; - Sort (Container.Elements (1 .. Length (Container))); end Sort; @@ -807,11 +782,6 @@ package body Ada.Containers.Formal_Vectors is -- Resolve issue of capacity vs. max index ??? end; - if Container.Busy > 0 then - raise Program_Error with - "attempt to tamper with elements (vector is busy)"; - end if; - declare EA : Elements_Array renames Container.Elements; @@ -1055,30 +1025,6 @@ package body Ada.Containers.Formal_Vectors is Position := Cursor'(True, Index); end Insert; - procedure Insert - (Container : in out Vector; - Before : Extended_Index; - Count : Count_Type := 1) - is - New_Item : Element_Type; -- Default-initialized value - pragma Warnings (Off, New_Item); - - begin - Insert (Container, Before, New_Item, Count); - end Insert; - - procedure Insert - (Container : in out Vector; - Before : Cursor; - Position : out Cursor; - Count : Count_Type := 1) - is - New_Item : Element_Type; -- Default-initialized value - pragma Warnings (Off, New_Item); - begin - Insert (Container, Before, New_Item, Position, Count); - end Insert; - ------------------ -- Insert_Space -- ------------------ @@ -1138,11 +1084,6 @@ package body Ada.Containers.Formal_Vectors is -- Resolve issue of capacity vs. max index ??? end; - if Container.Busy > 0 then - raise Program_Error with - "attempt to tamper with elements (vector is busy)"; - end if; - declare EA : Elements_Array renames Container.Elements; @@ -1166,46 +1107,6 @@ package body Ada.Containers.Formal_Vectors is Container.Last := New_Last; end Insert_Space; - procedure Insert_Space - (Container : in out Vector; - Before : Cursor; - Position : out Cursor; - Count : Count_Type := 1) - is - Index : Index_Type'Base; - - begin - if Count = 0 then - if not Before.Valid - or else Before.Index > Container.Last - then - Position := No_Element; - else - Position := (True, Before.Index); - end if; - - return; - end if; - - if not Before.Valid - or else Before.Index > Container.Last - then - if Container.Last = Index_Type'Last then - raise Constraint_Error with - "vector is already at its maximum length"; - end if; - - Index := Container.Last + 1; - - else - Index := Before.Index; - end if; - - Insert_Space (Container, Index, Count => Count); - - Position := Cursor'(True, Index); - end Insert_Space; - -------------- -- Is_Empty -- -------------- @@ -1215,34 +1116,6 @@ package body Ada.Containers.Formal_Vectors is return Last_Index (Container) < Index_Type'First; end Is_Empty; - ------------- - -- Iterate -- - ------------- - - procedure Iterate - (Container : Vector; - Process : - not null access procedure (Container : Vector; Position : Cursor)) - is - V : Vector renames Container'Unrestricted_Access.all; - B : Natural renames V.Busy; - - begin - B := B + 1; - - begin - for Indx in Index_Type'First .. Last_Index (Container) loop - Process (Container, Cursor'(True, Indx)); - end loop; - exception - when others => - B := B - 1; - raise; - end; - - B := B - 1; - end Iterate; - ---------- -- Last -- ---------- @@ -1282,13 +1155,13 @@ package body Ada.Containers.Formal_Vectors is -- Length -- ------------ - function Length (Container : Vector) return Capacity_Subtype is + function Length (Container : Vector) return Count_Type is L : constant Int := Int (Last_Index (Container)); F : constant Int := Int (Index_Type'First); N : constant Int'Base := L - F + 1; begin - return Capacity_Subtype (N); + return Count_Type (N); end Length; ---------- @@ -1328,16 +1201,6 @@ package body Ada.Containers.Formal_Vectors is return; end if; - if Target.Busy > 0 then - raise Program_Error with - "attempt to tamper with elements (Target is busy)"; - end if; - - if Source.Busy > 0 then - raise Program_Error with - "attempt to tamper with elements (Source is busy)"; - end if; - if N > Target.Capacity then raise Constraint_Error with -- correct exception here??? "length of Source is greater than capacity of Target"; @@ -1440,96 +1303,6 @@ package body Ada.Containers.Formal_Vectors is return No_Element; end Previous; - ------------------- - -- Query_Element -- - ------------------- - - procedure Query_Element - (Container : Vector; - Index : Index_Type; - Process : not null access procedure (Element : Element_Type)) - is - V : Vector renames Container'Unrestricted_Access.all; - B : Natural renames V.Busy; - L : Natural renames V.Lock; - - begin - if Index > Last_Index (Container) then - raise Constraint_Error with "Index is out of range"; - end if; - - B := B + 1; - L := L + 1; - - declare - II : constant Int'Base := Int (Index) - Int (No_Index); - I : constant Count_Type := Count_Type (II); - - begin - Process (Get_Element (V, I)); - exception - when others => - L := L - 1; - B := B - 1; - raise; - end; - - L := L - 1; - B := B - 1; - end Query_Element; - - procedure Query_Element - (Container : Vector; - Position : Cursor; - Process : not null access procedure (Element : Element_Type)) - is - begin - if not Position.Valid then - raise Constraint_Error with "Position cursor has no element"; - end if; - - Query_Element (Container, Position.Index, Process); - end Query_Element; - - ---------- - -- Read -- - ---------- - - procedure Read - (Stream : not null access Root_Stream_Type'Class; - Container : out Vector) - is - Length : Count_Type'Base; - Last : Index_Type'Base := No_Index; - - begin - Clear (Container); - - Count_Type'Base'Read (Stream, Length); - - if Length < 0 then - raise Program_Error with "stream appears to be corrupt"; - end if; - - if Length > Container.Capacity then - raise Storage_Error with "not enough capacity"; -- ??? - end if; - - for J in Count_Type range 1 .. Length loop - Last := Last + 1; - Element_Type'Read (Stream, Container.Elements (J)); - Container.Last := Last; - end loop; - end Read; - - procedure Read - (Stream : not null access Root_Stream_Type'Class; - Position : out Cursor) - is - begin - raise Program_Error with "attempt to stream vector cursor"; - end Read; - --------------------- -- Replace_Element -- --------------------- @@ -1544,11 +1317,6 @@ package body Ada.Containers.Formal_Vectors is raise Constraint_Error with "Index is out of range"; end if; - if Container.Lock > 0 then - raise Program_Error with - "attempt to tamper with cursors (vector is locked)"; - end if; - declare II : constant Int'Base := Int (Index) - Int (No_Index); I : constant Count_Type := Count_Type (II); @@ -1572,11 +1340,6 @@ package body Ada.Containers.Formal_Vectors is raise Constraint_Error with "Position cursor is out of range"; end if; - if Container.Lock > 0 then - raise Program_Error with - "attempt to tamper with cursors (vector is locked)"; - end if; - declare II : constant Int'Base := Int (Position.Index) - Int (No_Index); I : constant Count_Type := Count_Type (II); @@ -1591,11 +1354,11 @@ package body Ada.Containers.Formal_Vectors is procedure Reserve_Capacity (Container : in out Vector; - Capacity : Capacity_Subtype) + Capacity : Count_Type) is begin if Capacity > Container.Capacity then - raise Constraint_Error; -- ??? + raise Constraint_Error with "Capacity is out of range"; end if; end Reserve_Capacity; @@ -1609,11 +1372,6 @@ package body Ada.Containers.Formal_Vectors is return; end if; - if Container.Lock > 0 then - raise Program_Error with - "attempt to tamper with cursors (vector is locked)"; - end if; - declare I, J : Count_Type; E : Elements_Array renames Container.Elements; @@ -1699,34 +1457,6 @@ package body Ada.Containers.Formal_Vectors is return No_Index; end Reverse_Find_Index; - --------------------- - -- Reverse_Iterate -- - --------------------- - - procedure Reverse_Iterate - (Container : Vector; - Process : not null access procedure (Container : Vector; - Position : Cursor)) - is - V : Vector renames Container'Unrestricted_Access.all; - B : Natural renames V.Busy; - - begin - B := B + 1; - - begin - for Indx in reverse Index_Type'First .. Last_Index (Container) loop - Process (Container, Cursor'(True, Indx)); - end loop; - exception - when others => - B := B - 1; - raise; - end; - - B := B - 1; - end Reverse_Iterate; - ----------- -- Right -- ----------- @@ -1757,18 +1487,13 @@ package body Ada.Containers.Formal_Vectors is procedure Set_Length (Container : in out Vector; - Length : Capacity_Subtype) + Length : Count_Type) is begin if Length = Formal_Vectors.Length (Container) then return; end if; - if Container.Busy > 0 then - raise Program_Error with - "attempt to tamper with elements (vector is busy)"; - end if; - if Length > Container.Capacity then raise Constraint_Error; -- ??? end if; @@ -1799,11 +1524,6 @@ package body Ada.Containers.Formal_Vectors is return; end if; - if Container.Lock > 0 then - raise Program_Error with - "attempt to tamper with cursors (vector is locked)"; - end if; - declare II : constant Int'Base := Int (I) - Int (No_Index); JJ : constant Int'Base := Int (J) - Int (No_Index); @@ -1865,32 +1585,9 @@ package body Ada.Containers.Formal_Vectors is -- To_Vector -- --------------- - function To_Vector (Length : Capacity_Subtype) return Vector is - begin - if Length = 0 then - return Empty_Vector; - end if; - - declare - First : constant Int := Int (Index_Type'First); - Last_As_Int : constant Int'Base := First + Int (Length) - 1; - Last : Index_Type; - - begin - if Last_As_Int > Index_Type'Pos (Index_Type'Last) then - raise Constraint_Error with "Length is out of range"; -- ??? - end if; - - Last := Index_Type (Last_As_Int); - - return (Length, (others => <>), Last => Last, - others => <>); - end; - end To_Vector; - function To_Vector (New_Item : Element_Type; - Length : Capacity_Subtype) return Vector + Length : Count_Type) return Vector is begin if Length = 0 then @@ -1914,78 +1611,4 @@ package body Ada.Containers.Formal_Vectors is end; end To_Vector; - -------------------- - -- Update_Element -- - -------------------- - - procedure Update_Element - (Container : in out Vector; - Index : Index_Type; - Process : not null access procedure (Element : in out Element_Type)) - is - B : Natural renames Container.Busy; - L : Natural renames Container.Lock; - - begin - if Index > Container.Last then - raise Constraint_Error with "Index is out of range"; - end if; - - B := B + 1; - L := L + 1; - - declare - II : constant Int'Base := Int (Index) - Int (No_Index); - I : constant Count_Type := Count_Type (II); - - begin - Process (Container.Elements (I)); - exception - when others => - L := L - 1; - B := B - 1; - raise; - end; - - L := L - 1; - B := B - 1; - end Update_Element; - - procedure Update_Element - (Container : in out Vector; - Position : Cursor; - Process : not null access procedure (Element : in out Element_Type)) - is - begin - if not Position.Valid then - raise Constraint_Error with "Position cursor has no element"; - end if; - - Update_Element (Container, Position.Index, Process); - end Update_Element; - - ----------- - -- Write -- - ----------- - - procedure Write - (Stream : not null access Root_Stream_Type'Class; - Container : Vector) - is - begin - Count_Type'Base'Write (Stream, Length (Container)); - - for J in 1 .. Length (Container) loop - Element_Type'Write (Stream, Container.Elements (J)); - end loop; - end Write; - - procedure Write - (Stream : not null access Root_Stream_Type'Class; - Position : Cursor) - is - begin - raise Program_Error with "attempt to stream vector cursor"; - end Write; - end Ada.Containers.Formal_Vectors; diff --git a/gcc/ada/a-cofove.ads b/gcc/ada/a-cofove.ads index 24e2944..4d94383 100644 --- a/gcc/ada/a-cofove.ads +++ b/gcc/ada/a-cofove.ads @@ -6,7 +6,7 @@ -- -- -- S p e c -- -- -- --- Copyright (C) 2004-2011, Free Software Foundation, Inc. -- +-- Copyright (C) 2004-2013, Free Software Foundation, Inc. -- -- -- -- This specification is derived from the Ada Reference Manual for use with -- -- GNAT. The copyright notice above, and the license provisions that follow -- @@ -55,7 +55,6 @@ -- iterate over containers. Left returns the part of the container already -- scanned and Right the part not scanned yet. -private with Ada.Streams; with Ada.Containers; use Ada.Containers; @@ -72,21 +71,9 @@ package Ada.Containers.Formal_Vectors is range Index_Type'First - 1 .. Index_Type'Min (Index_Type'Base'Last - 1, Index_Type'Last) + 1; - -- ??? i don't think we can do this... - -- TODO: we need the ARG to either figure out how to declare this subtype, - -- or eliminate the requirement that it be present. - -- subtype Capacity_Subtype is Count_Type -- correct name??? - -- range 0 .. Count_Type'Max (0, - -- Index_Type'Pos (Index_Type'Last) - - -- Index_Type'Pos (Index_Type'First) + 1); - -- - -- so for now: - subtype Capacity_Subtype is Count_Type; - No_Index : constant Extended_Index := Extended_Index'First; - type Vector (Capacity : Capacity_Subtype) is tagged private; - -- pragma Preelaborable_Initialization (Vector); + type Vector (Capacity : Count_Type) is tagged private; type Cursor is private; pragma Preelaborable_Initialization (Cursor); @@ -97,11 +84,9 @@ package Ada.Containers.Formal_Vectors is function "=" (Left, Right : Vector) return Boolean; - function To_Vector (Length : Capacity_Subtype) return Vector; - function To_Vector (New_Item : Element_Type; - Length : Capacity_Subtype) return Vector; + Length : Count_Type) return Vector; function "&" (Left, Right : Vector) return Vector; @@ -111,17 +96,17 @@ package Ada.Containers.Formal_Vectors is function "&" (Left, Right : Element_Type) return Vector; - function Capacity (Container : Vector) return Capacity_Subtype; + function Capacity (Container : Vector) return Count_Type; procedure Reserve_Capacity (Container : in out Vector; - Capacity : Capacity_Subtype); + Capacity : Count_Type); - function Length (Container : Vector) return Capacity_Subtype; + function Length (Container : Vector) return Count_Type; procedure Set_Length (Container : in out Vector; - Length : Capacity_Subtype); + Length : Count_Type); function Is_Empty (Container : Vector) return Boolean; @@ -131,7 +116,7 @@ package Ada.Containers.Formal_Vectors is function Copy (Source : Vector; - Capacity : Capacity_Subtype := 0) return Vector; + Capacity : Count_Type := 0) return Vector; function To_Cursor (Container : Vector; @@ -157,26 +142,6 @@ package Ada.Containers.Formal_Vectors is Position : Cursor; New_Item : Element_Type); - procedure Query_Element - (Container : Vector; - Index : Index_Type; - Process : not null access procedure (Element : Element_Type)); - - procedure Query_Element - (Container : Vector; - Position : Cursor; - Process : not null access procedure (Element : Element_Type)); - - procedure Update_Element - (Container : in out Vector; - Index : Index_Type; - Process : not null access procedure (Element : in out Element_Type)); - - procedure Update_Element - (Container : in out Vector; - Position : Cursor; - Process : not null access procedure (Element : in out Element_Type)); - procedure Move (Target : in out Vector; Source : in out Vector); procedure Insert @@ -214,17 +179,6 @@ package Ada.Containers.Formal_Vectors is Position : out Cursor; Count : Count_Type := 1); - procedure Insert - (Container : in out Vector; - Before : Extended_Index; - Count : Count_Type := 1); - - procedure Insert - (Container : in out Vector; - Before : Cursor; - Position : out Cursor; - Count : Count_Type := 1); - procedure Prepend (Container : in out Vector; New_Item : Vector); @@ -243,17 +197,6 @@ package Ada.Containers.Formal_Vectors is New_Item : Element_Type; Count : Count_Type := 1); - procedure Insert_Space - (Container : in out Vector; - Before : Extended_Index; - Count : Count_Type := 1); - - procedure Insert_Space - (Container : in out Vector; - Before : Cursor; - Position : out Cursor; - Count : Count_Type := 1); - procedure Delete (Container : in out Vector; Index : Extended_Index; @@ -324,16 +267,6 @@ package Ada.Containers.Formal_Vectors is function Has_Element (Container : Vector; Position : Cursor) return Boolean; - procedure Iterate - (Container : Vector; - Process : not null access - procedure (Container : Vector; Position : Cursor)); - - procedure Reverse_Iterate - (Container : Vector; - Process : not null access - procedure (Container : Vector; Position : Cursor)); - generic with function "<" (Left, Right : Element_Type) return Boolean is <>; package Generic_Sorting is @@ -357,8 +290,6 @@ private pragma Inline (Element); pragma Inline (First_Element); pragma Inline (Last_Element); - pragma Inline (Query_Element); - pragma Inline (Update_Element); pragma Inline (Replace_Element); pragma Inline (Contains); pragma Inline (Next); @@ -367,44 +298,16 @@ private type Elements_Array is array (Count_Type range <>) of Element_Type; function "=" (L, R : Elements_Array) return Boolean is abstract; - type Vector (Capacity : Capacity_Subtype) is tagged record + type Vector (Capacity : Count_Type) is tagged record Elements : Elements_Array (1 .. Capacity); Last : Extended_Index := No_Index; - Busy : Natural := 0; - Lock : Natural := 0; end record; - use Ada.Streams; - - procedure Write - (Stream : not null access Root_Stream_Type'Class; - Container : Vector); - - for Vector'Write use Write; - - procedure Read - (Stream : not null access Root_Stream_Type'Class; - Container : out Vector); - - for Vector'Read use Read; - type Cursor is record Valid : Boolean := True; Index : Index_Type := Index_Type'First; end record; - procedure Write - (Stream : not null access Root_Stream_Type'Class; - Position : Cursor); - - for Cursor'Write use Write; - - procedure Read - (Stream : not null access Root_Stream_Type'Class; - Position : out Cursor); - - for Cursor'Read use Read; - Empty_Vector : constant Vector := (Capacity => 0, others => <>); No_Element : constant Cursor := (Valid => False, Index => Index_Type'First); diff --git a/gcc/ada/checks.adb b/gcc/ada/checks.adb index 5a5b7d1..570bfbc 100644 --- a/gcc/ada/checks.adb +++ b/gcc/ada/checks.adb @@ -2502,8 +2502,8 @@ package body Checks is -- Here for normal case of predicate active else - -- If the type has a static predicate and the expression is also - -- static, see if the expression satisfies the predicate. + -- If the type has a static predicate and the expression is known + -- at compile time, see if the expression satisfies the predicate. Check_Expression_Against_Static_Predicate (N, Typ); diff --git a/gcc/ada/exp_attr.adb b/gcc/ada/exp_attr.adb index 93f9b81..9e48afe 100644 --- a/gcc/ada/exp_attr.adb +++ b/gcc/ada/exp_attr.adb @@ -2741,20 +2741,20 @@ package body Exp_Attr is CE : constant Entity_Id := Entity (Selector_Name (Pref)); begin - -- In Ada 2005 (or later) if we have the standard nondefault - -- bit order, then we return the original value as given in - -- the component clause (RM 2005 13.5.2(3/2)). + -- In Ada 2005 (or later) if we have the non-default bit order, then + -- we return the original value as given in the component clause + -- (RM 2005 13.5.2(3/2)). if Present (Component_Clause (CE)) and then Ada_Version >= Ada_2005 - and then not Reverse_Bit_Order (Scope (CE)) + and then Reverse_Bit_Order (Scope (CE)) then Rewrite (N, Make_Integer_Literal (Loc, Intval => Expr_Value (First_Bit (Component_Clause (CE))))); Analyze_And_Resolve (N, Typ); - -- Otherwise (Ada 83/95 or Ada 2005 or later with reverse bit order), + -- Otherwise (Ada 83/95 or Ada 2005 or later with default bit order), -- rewrite with normalized value if we know it statically. elsif Known_Static_Component_Bit_Offset (CE) then @@ -3321,20 +3321,20 @@ package body Exp_Attr is CE : constant Entity_Id := Entity (Selector_Name (Pref)); begin - -- In Ada 2005 (or later) if we have the standard nondefault - -- bit order, then we return the original value as given in - -- the component clause (RM 2005 13.5.2(4/2)). + -- In Ada 2005 (or later) if we have the non-default bit order, then + -- we return the original value as given in the component clause + -- (RM 2005 13.5.2(3/2)). if Present (Component_Clause (CE)) and then Ada_Version >= Ada_2005 - and then not Reverse_Bit_Order (Scope (CE)) + and then Reverse_Bit_Order (Scope (CE)) then Rewrite (N, Make_Integer_Literal (Loc, Intval => Expr_Value (Last_Bit (Component_Clause (CE))))); Analyze_And_Resolve (N, Typ); - -- Otherwise (Ada 83/95 or Ada 2005 or later with reverse bit order), + -- Otherwise (Ada 83/95 or Ada 2005 or later with default bit order), -- rewrite with normalized value if we know it statically. elsif Known_Static_Component_Bit_Offset (CE) @@ -4243,18 +4243,18 @@ package body Exp_Attr is begin if Present (Component_Clause (CE)) then - -- In Ada 2005 (or later) if we have the standard nondefault - -- bit order, then we return the original value as given in - -- the component clause (RM 2005 13.5.2(2/2)). + -- In Ada 2005 (or later) if we have the non-default bit order, + -- then we return the original value as given in the component + -- clause (RM 2005 13.5.2(2/2)). if Ada_Version >= Ada_2005 - and then not Reverse_Bit_Order (Scope (CE)) + and then Reverse_Bit_Order (Scope (CE)) then Rewrite (N, Make_Integer_Literal (Loc, Intval => Expr_Value (Position (Component_Clause (CE))))); - -- Otherwise (Ada 83 or 95, or reverse bit order specified in + -- Otherwise (Ada 83 or 95, or default bit order specified in -- later Ada version), return the normalized value. else diff --git a/gcc/ada/sem_ch3.adb b/gcc/ada/sem_ch3.adb index 0817773..a3b2c4e 100644 --- a/gcc/ada/sem_ch3.adb +++ b/gcc/ada/sem_ch3.adb @@ -3277,8 +3277,8 @@ package body Sem_Ch3 is or else Is_Partially_Initialized_Type (T, Include_Implicit => False)) then - -- If the type has a static predicate and the expression is also - -- static, see if the expression satisfies the predicate. + -- If the type has a static predicate and the expression is known at + -- compile time, see if the expression satisfies the predicate. if Present (E) then Check_Expression_Against_Static_Predicate (E, T); @@ -3297,8 +3297,7 @@ package body Sem_Ch3 is if Is_String_Type (T) and then not Constant_Present (N) then Check_SPARK_Restriction - ("declaration of object of unconstrained type not allowed", - N); + ("declaration of object of unconstrained type not allowed", N); end if; -- Nothing to do in deferred constant case diff --git a/gcc/ada/sem_prag.adb b/gcc/ada/sem_prag.adb index 7f5b551..e148d05 100644 --- a/gcc/ada/sem_prag.adb +++ b/gcc/ada/sem_prag.adb @@ -202,7 +202,11 @@ package body Sem_Prag is Check_Duplicates : Boolean := False) return Node_Id; -- Find the declaration of the related subprogram subject to pragma Prag. -- If flag Check_Duplicates is set, the routine emits errors concerning - -- duplicate pragmas. + -- duplicate pragmas. If a related subprogram is found, then either the + -- corresponding N_Subprogram_Declaration node is returned, or, if the + -- pragma applies to a subprogram body, then the N_Subprogram_Body node + -- is returned. Note that in the latter case, no check is made to ensure + -- that there is no separate declaration of the subprogram. function Get_Base_Subprogram (Def_Id : Entity_Id) return Entity_Id; -- If Def_Id refers to a renamed subprogram, then the base subprogram (the @@ -10043,7 +10047,6 @@ package body Sem_Prag is begin GNAT_Pragma; - S14_Pragma; Check_Arg_Count (1); -- Ensure the proper placement of the pragma. Contract_Cases must @@ -18113,63 +18116,83 @@ package body Sem_Prag is is Context : constant Node_Id := Parent (Prag); Nam : constant Name_Id := Pragma_Name (Prag); - Decl : Node_Id; + Elmt : Node_Id; Subp_Decl : Node_Id; begin - -- The pragma is a byproduct of an aspect + pragma Assert (Nkind (Prag) = N_Pragma); + + -- If the pragma comes from an aspect, then what we want is the + -- declaration to which the aspect is attached, i.e. its parent. if Present (Corresponding_Aspect (Prag)) then - Subp_Decl := Parent (Corresponding_Aspect (Prag)); + return Parent (Corresponding_Aspect (Prag)); + end if; - -- The pragma is associated with a library-level subprogram + -- Otherwise the pragma must be a list element, and the first thing to + -- do is to position past any previous pragmas or generated code. What + -- we are doing here is looking for the preceding declaration. This is + -- also where we will check for a duplicate pragma. - elsif Nkind (Context) = N_Compilation_Unit_Aux then - Subp_Decl := Unit (Parent (Context)); + pragma Assert (Is_List_Member (Prag)); - -- The pragma appears inside the declarative part of a subprogram body + Elmt := Prag; + loop + Elmt := Prev (Elmt); + exit when No (Elmt); - elsif Nkind (Context) = N_Subprogram_Body then - Subp_Decl := Context; + -- Typically want we will want is the declaration original node. But + -- for the generic subprogram case, don't go to to the original node, + -- which is the unanalyzed tree: we need to attach the pre- and post- + -- conditions to the analyzed version at this point. They propagate + -- to the original tree when analyzing the corresponding body. - -- The pragma appears someplace after its related subprogram. Inspect - -- all previous declarations for a suitable candidate. + if Nkind (Elmt) not in N_Generic_Declaration then + Subp_Decl := Original_Node (Elmt); + else + Subp_Decl := Elmt; + end if; - else - Decl := Prag; - Subp_Decl := Empty; - while Present (Prev (Decl)) loop - Decl := Prev (Decl); + -- Skip prior pragmas - if Nkind (Decl) in N_Generic_Declaration then - Subp_Decl := Decl; - else - Subp_Decl := Original_Node (Decl); + if Nkind (Subp_Decl) = N_Pragma then + if Check_Duplicates and then Pragma_Name (Subp_Decl) = Nam then + Error_Msg_Name_1 := Nam; + Error_Msg_Sloc := Sloc (Subp_Decl); + Error_Msg_N ("pragma % duplicates pragma declared #", Prag); end if; - -- Skip prior pragmas + -- Skip internally generated code - if Nkind (Subp_Decl) = N_Pragma then - if Check_Duplicates and then Pragma_Name (Subp_Decl) = Nam then - Error_Msg_Name_1 := Nam; - Error_Msg_Sloc := Sloc (Subp_Decl); - Error_Msg_N ("pragma % duplicates pragma declared #", Prag); - end if; + elsif not Comes_From_Source (Subp_Decl) then + null; - -- Skip internally generated code + -- Otherwise we have a declaration to return - elsif not Comes_From_Source (Subp_Decl) then - null; + else + return Subp_Decl; + end if; + end loop; - -- The nearest preceding declaration is the related subprogram + -- We fell through, which means there was no declaration preceding the + -- pragma (either it was the first element of the list, or we only had + -- other pragmas and generated code before it). - else - exit; - end if; - end loop; - end if; + -- The pragma is associated with a library-level subprogram + + if Nkind (Context) = N_Compilation_Unit_Aux then + return Unit (Parent (Context)); - return Subp_Decl; + -- The pragma appears inside the declarative part of a subprogram body + + elsif Nkind (Context) = N_Subprogram_Body then + return Context; + + -- Otherwise no subprogram found, return original pragma + + else + return Prag; + end if; end Find_Related_Subprogram; ------------------------- diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb index bc1f3fb..c914703 100644 --- a/gcc/ada/sem_util.adb +++ b/gcc/ada/sem_util.adb @@ -1301,11 +1301,11 @@ package body Sem_Util is Typ : Entity_Id) is begin - -- When both the predicate and the expression are static, evaluate the - -- check at compile time. A type becomes non-static when it has aspect - -- Dynamic_Predicate. + -- When the predicate is static and the value of the expression is known + -- at compile time, evaluate the predicate check. A type is non-static + -- when it has aspect Dynamic_Predicate. - if Is_OK_Static_Expression (Expr) + if Compile_Time_Known_Value (Expr) and then Has_Predicates (Typ) and then Present (Static_Predicate (Typ)) and then not Has_Dynamic_Predicate_Aspect (Typ) diff --git a/gcc/ada/sem_util.ads b/gcc/ada/sem_util.ads index b5d1ed3..7ea5657 100644 --- a/gcc/ada/sem_util.ads +++ b/gcc/ada/sem_util.ads @@ -195,9 +195,9 @@ package Sem_Util is (Expr : Node_Id; Typ : Entity_Id); -- Determine whether an arbitrary expression satisfies the static predicate - -- of a type. The routine does nothing if Expr is non-static or Typ lacks a - -- static predicate, otherwise it may emit a warning if the expression is - -- prohibited by the predicate. + -- of a type. The routine does nothing if Expr is not known at compile time + -- or Typ lacks a static predicate, otherwise it may emit a warning if the + -- expression is prohibited by the predicate. procedure Check_Fully_Declared (T : Entity_Id; N : Node_Id); -- Verify that the full declaration of type T has been seen. If not, place -- 2.7.4