diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index e18dff08d6b..2ff72261881 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,14 @@ +2014-07-16 Robert Dewar + + * a-coinho.adb, a-coinho-shared.adb, a-coinho-shared.ads: Minor + reformatting. + +2014-07-16 Ed Schonberg + + * a-cohase.ads: Type Iterator must be controlled, so that the + tampering bit is properly set through an iteration. + * a-cohase.adb: Add Finalize operation for type Iterator. + 2014-07-16 Ed Schonberg * a-coinho-shared.adb, a-coinho-shared.ads: Proper structures for diff --git a/gcc/ada/a-cohase.adb b/gcc/ada/a-cohase.adb index 129ad6a7120..1c3db68f807 100644 --- a/gcc/ada/a-cohase.adb +++ b/gcc/ada/a-cohase.adb @@ -6,7 +6,7 @@ -- -- -- B o d y -- -- -- --- Copyright (C) 2004-2013, Free Software Foundation, Inc. -- +-- Copyright (C) 2004-2014, 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- -- @@ -601,6 +601,17 @@ package body Ada.Containers.Hashed_Sets is end if; end Finalize; + procedure Finalize (Object : in out Iterator) is + begin + if Object.Container /= null then + declare + B : Natural renames Object.Container.HT.Busy; + begin + B := B - 1; + end; + end if; + end Finalize; + ---------- -- Find -- ---------- @@ -1029,8 +1040,12 @@ package body Ada.Containers.Hashed_Sets is function Iterate (Container : Set) return Set_Iterator_Interfaces.Forward_Iterator'Class is + B : Natural renames Container'Unrestricted_Access.all.HT.Busy; begin - return Iterator'(Container => Container'Unrestricted_Access); + B := B + 1; + return It : constant Iterator := + Iterator'(Limited_Controlled with + Container => Container'Unrestricted_Access); end Iterate; ------------ diff --git a/gcc/ada/a-cohase.ads b/gcc/ada/a-cohase.ads index 2931800aaf8..9e4ebc173f5 100644 --- a/gcc/ada/a-cohase.ads +++ b/gcc/ada/a-cohase.ads @@ -6,7 +6,7 @@ -- -- -- S p e c -- -- -- --- Copyright (C) 2004-2013, Free Software Foundation, Inc. -- +-- Copyright (C) 2004-2014, 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 -- @@ -543,8 +543,8 @@ private No_Element : constant Cursor := (Container => null, Node => null); - type Iterator is limited new - Set_Iterator_Interfaces.Forward_Iterator with record + type Iterator is new Limited_Controlled + and Set_Iterator_Interfaces.Forward_Iterator with record Container : Set_Access; end record; @@ -553,5 +553,6 @@ private overriding function Next (Object : Iterator; Position : Cursor) return Cursor; + overriding procedure Finalize (Object : in out Iterator); end Ada.Containers.Hashed_Sets; diff --git a/gcc/ada/a-coinho-shared.adb b/gcc/ada/a-coinho-shared.adb index c9f117ebcfe..df2d55ad574 100644 --- a/gcc/ada/a-coinho-shared.adb +++ b/gcc/ada/a-coinho-shared.adb @@ -38,12 +38,13 @@ package body Ada.Containers.Indefinite_Holders is function "=" (Left, Right : Holder) return Boolean is begin - if Left.Reference = null and Right.Reference = null then + if Left.Reference = Right.Reference then + -- Covers both null and not null but the same shared object cases. + return True; elsif Left.Reference /= null and Right.Reference /= null then return Left.Reference.Element.all = Right.Reference.Element.all; - else return False; end if; @@ -66,6 +67,7 @@ package body Ada.Containers.Indefinite_Holders is begin if Control.Container /= null then Reference (Control.Container.Reference); + declare B : Natural renames Control.Container.Busy; begin @@ -122,10 +124,9 @@ package body Ada.Containers.Indefinite_Holders is (Element => Container.Reference.Element.all'Access, Control => (Controlled with Container'Unrestricted_Access)); B : Natural renames Ref.Control.Container.Busy; - begin Reference (Ref.Control.Container.Reference); - B := B + 1; + B := B + 1; return Ref; end Constant_Reference; diff --git a/gcc/ada/a-coinho-shared.ads b/gcc/ada/a-coinho-shared.ads index 8294d8e6a27..3e1ed18a4b0 100644 --- a/gcc/ada/a-coinho-shared.ads +++ b/gcc/ada/a-coinho-shared.ads @@ -130,8 +130,7 @@ private overriding procedure Adjust (Container : in out Holder); overriding procedure Finalize (Container : in out Holder); - type Reference_Control_Type is new Controlled with - record + type Reference_Control_Type is new Controlled with record Container : Holder_Access; end record; diff --git a/gcc/ada/a-coinho.adb b/gcc/ada/a-coinho.adb index 4cb717936d6..9fe4c143e4d 100644 --- a/gcc/ada/a-coinho.adb +++ b/gcc/ada/a-coinho.adb @@ -40,10 +40,8 @@ package body Ada.Containers.Indefinite_Holders is begin if Left.Element = null and Right.Element = null then return True; - elsif Left.Element /= null and Right.Element /= null then return Left.Element.all = Right.Element.all; - else return False; end if;