[multiple changes]
authorArnaud Charlet <charlet@gcc.gnu.org>
Tue, 6 Jan 2015 09:02:05 +0000 (10:02 +0100)
committerArnaud Charlet <charlet@gcc.gnu.org>
Tue, 6 Jan 2015 09:02:05 +0000 (10:02 +0100)
2015-01-06  Bob Duff  <duff@adacore.com>

* a-cfinve.adb (Copy): Set the discriminant to the Length when
Capacity = 0.
* a-cofove.ads (Capacity): Add a postcondition.
* a-cfinve.ads (Capacity): Add a postcondition.
(Reserve_Capacity): Correct the postcondition in the case where
Capacity = 0; that means "Capacity => Length (Container)".
* a-cofove.adb (Elems[c]): Add a comment
explaining the dangers and how to avoid them.

2015-01-06  Ed Schonberg  <schonberg@adacore.com>

* sem_ch12.adb: Code clean up.

From-SVN: r219225

gcc/ada/ChangeLog
gcc/ada/a-cfinve.adb
gcc/ada/a-cfinve.ads
gcc/ada/a-cofove.adb
gcc/ada/a-cofove.ads
gcc/ada/sem_ch12.adb

index 6c1780dc52f142bf6c7379a2d40df51f475263c1..b0b4b967eef9aaa473dd8e59142dba11bb91da21 100644 (file)
@@ -1,3 +1,17 @@
+2015-01-06  Bob Duff  <duff@adacore.com>
+
+       * a-cfinve.adb (Copy): Set the discriminant to the Length when
+       Capacity = 0.
+       * a-cofove.ads (Capacity): Add a postcondition.
+       * a-cfinve.ads (Capacity): Add a postcondition.
+       (Reserve_Capacity): Correct the postcondition in the case where
+       Capacity = 0; that means "Capacity => Length (Container)".
+       * a-cofove.adb (Elems[c]): Add a comment
+       explaining the dangers and how to avoid them.
+
+2015-01-06  Ed Schonberg  <schonberg@adacore.com>
+
+       * sem_ch12.adb: Code clean up.
 2015-01-06  Arnaud Charlet  <charlet@adacore.com>
 
        * gnatvsn.ads: Bump copyright year.
index 6574fcb43649e2f6fe3614e3338272d3702178ba..f088b9ed11872c04326f5c951d9ad5ee0fbf91ed 100644 (file)
@@ -2,8 +2,7 @@
 --                                                                          --
 --                         GNAT LIBRARY COMPONENTS                          --
 --                                                                          --
---                          A D A . C O N T A I N E R S
---           . F O R M A L _ I N D E F I N I T E _ V E C T O R S            --
+--                 ADA.CONTAINERS.FORMAL_INDEFINITE_VECTORS                 --
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
@@ -89,7 +88,8 @@ is
 
    function Contains
      (Container : Vector;
-      Item      : Element_Type) return Boolean is
+      Item      : Element_Type) return Boolean
+   is
      (Contains (Container.V, H (Item)));
 
    ----------
@@ -98,8 +98,10 @@ is
 
    function Copy
      (Source   : Vector;
-      Capacity : Capacity_Range := 0) return Vector is
-     (Capacity, V => Copy (Source.V, Capacity));
+      Capacity : Capacity_Range := 0) return Vector
+   is
+     ((if Capacity = 0 then Length (Source) else Capacity),
+       V => Copy (Source.V, Capacity));
 
    ---------------------
    -- Current_To_Last --
@@ -139,7 +141,8 @@ is
    function Find_Index
      (Container : Vector;
       Item      : Element_Type;
-      Index     : Index_Type := Index_Type'First) return Extended_Index is
+      Index     : Index_Type := Index_Type'First) return Extended_Index
+   is
      (Find_Index (Container.V, H (Item), Index));
 
    -------------------
@@ -200,7 +203,9 @@ is
    -----------------
 
    function Has_Element
-     (Container : Vector; Position : Extended_Index) return Boolean is
+     (Container : Vector;
+      Position  : Extended_Index) return Boolean
+   is
      (Has_Element (Container.V, Position));
 
    --------------
@@ -272,7 +277,8 @@ is
    function Reverse_Find_Index
      (Container : Vector;
       Item      : Element_Type;
-      Index     : Index_Type := Index_Type'Last) return Extended_Index is
+      Index     : Index_Type := Index_Type'Last) return Extended_Index
+   is
      (Reverse_Find_Index (Container.V, H (Item), Index));
 
    ----------
@@ -290,7 +296,8 @@ is
 
    function To_Vector
      (New_Item : Element_Type;
-      Length   : Capacity_Range) return Vector is
+      Length   : Capacity_Range) return Vector
+   is
    begin
       return (Length, To_Vector (H (New_Item), Length));
    end To_Vector;
index b78633b4f8cc0674494af0fcbfd2d562b3c44750..7559df6e4b5dfc351173e013d18de58789c52cfe 100644 (file)
@@ -2,8 +2,7 @@
 --                                                                          --
 --                         GNAT LIBRARY COMPONENTS                          --
 --                                                                          --
---                          A D A . C O N T A I N E R S
---           . F O R M A L _ I N D E F I N I T E _ V E C T O R S            --
+--                 ADA.CONTAINERS.FORMAL_INDEFINITE_VECTORS                 --
 --                                                                          --
 --                                 S p e c                                  --
 --                                                                          --
@@ -41,7 +40,7 @@ generic
    type Index_Type is range <>;
    type Element_Type (<>) is private;
    Max_Size_In_Storage_Elements : Natural :=
-     Element_Type'Max_Size_In_Storage_Elements;
+                                    Element_Type'Max_Size_In_Storage_Elements;
    --  This has the same meaning as in Ada.Containers.Bounded_Holders, with the
    --  same restrictions.
 
@@ -81,7 +80,8 @@ is
      Global => null;
 
    function Capacity (Container : Vector) return Capacity_Range with
-     Global => null;
+     Global => null,
+     Post   => Capacity'Result >= Container.Capacity;
 
    procedure Reserve_Capacity
      (Container : in out Vector;
@@ -111,7 +111,7 @@ is
       Capacity : Capacity_Range := 0) return Vector
    with
      Global => null,
-     Pre    => (if Bounded then Length (Source) <= Capacity);
+     Pre    => (if Bounded then (Capacity = 0 or Length (Source) <= Capacity));
 
    function Element
      (Container : Vector;
@@ -133,16 +133,17 @@ is
       New_Item  : Vector)
    with
      Global => null,
-     Pre    => (if Bounded then
-                 Length (Container) + Length (New_Item) <= Container.Capacity);
+     Pre    => (if Bounded
+                then Length (Container) + Length (New_Item) <=
+                                                       Container.Capacity);
 
    procedure Append
      (Container : in out Vector;
       New_Item  : Element_Type)
    with
      Global => null,
-     Pre    => (if Bounded then
-                  Length (Container) < Container.Capacity);
+     Pre    => (if Bounded
+                then Length (Container) < Container.Capacity);
 
    procedure Delete_Last
      (Container : in out Vector)
@@ -243,7 +244,7 @@ private
    package Def is new Formal_Vectors (Index_Type, Holder, "=", Bounded);
    use Def;
 
-   --  ????Assert that Def subtypes have the same range.
+   --  ????Assert that Def subtypes have the same range
 
    type Vector (Capacity : Capacity_Range) is limited record
       V : Def.Vector (Capacity);
index 9cfd1328cf2d2a6f72a4497784c9986029d65742..ef37cc0226e271ca37ff70d22e4a1efa6372fc42 100644 (file)
@@ -59,6 +59,9 @@ is
    --  possible bounds. This means that the pointer is a thin pointer. This is
    --  necessary because 'Unrestricted_Access doesn't work when it produces
    --  access-to-unconstrained and is returned from a function.
+   --
+   --  Note that this is dangerous: make sure calls to this use an indexed
+   --  component or slice that is within the bounds 1 .. Length (Container).
 
    function Get_Element
      (Container : Vector;
index 9e91bc8bae040ab9d8f3a35b53e9e0e00c8a2bb3..3d4c1b37ecdd2c22e7335335febc2a481874b5df 100644 (file)
@@ -84,7 +84,8 @@ is
      Global => null;
 
    function Capacity (Container : Vector) return Capacity_Range with
-     Global => null;
+     Global => null,
+     Post => Capacity'Result >= Container.Capacity;
 
    procedure Reserve_Capacity
      (Container : in out Vector;
index 6062a88d60f7d079b9c16c8c3a2a95bd524b4415..ab118c620757884a82b63e4faa65c039bd9f91cf 100644 (file)
@@ -1804,12 +1804,13 @@ package body Sem_Ch12 is
                               (Defining_Entity (Analyzed_Formal)))
                        and then Ekind (Defining_Entity (Analyzed_Formal)) =
                                                                     E_Function
+                       and then Expander_Active
                      then
                         --  If actual is an entity (function or operator),
                         --  and expander is active, build wrapper for it.
                         --  Note that wrappers play no role within a generic.
 
-                        if Present (Match) and then Expander_Active then
+                        if Present (Match) then
                            if Nkind (Match) = N_Operator_Symbol then
 
                               --  If the name is a default, find its visible
@@ -1837,7 +1838,6 @@ package body Sem_Ch12 is
                         elsif Box_Present (Formal)
                            and then Nkind (Defining_Entity (Analyzed_Formal)) =
                                                     N_Defining_Operator_Symbol
-                           and then Expander_Active
                         then
                            Append_To (Assoc,
                              Build_Operator_Wrapper