[multiple changes]
authorArnaud Charlet <charlet@gcc.gnu.org>
Tue, 20 Oct 2015 12:21:37 +0000 (14:21 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Tue, 20 Oct 2015 12:21:37 +0000 (14:21 +0200)
2015-10-20  Steve Baird  <baird@adacore.com>

* pprint.adb: Code clean up.

2015-10-20  Bob Duff  <duff@adacore.com>

* a-cfinve.ads, a-coboho.ads: Improve comments.
* a-coboho.adb (Size_In_Storage_Elements): Improve error message
in case of "Size is too big" exception.

2015-10-20  Bob Duff  <duff@adacore.com>

* a-contai.ads: Remove check names (moved to snames.ads-tmpl).
* snames.ads-tmpl: Add check names that were previously in
a-contai.ads, so they are now visible in configuration files.
* types.ads: Add checks corresponding to snames.ads-tmpl.

From-SVN: r229069

gcc/ada/ChangeLog
gcc/ada/a-cfinve.ads
gcc/ada/a-coboho.adb
gcc/ada/a-coboho.ads
gcc/ada/a-contai.ads
gcc/ada/pprint.adb
gcc/ada/snames.ads-tmpl
gcc/ada/types.ads

index aa6d6ee6fa5a50c81b7de63a4a977d259567e448..ea3417e9e1b04e88790aa8536af6a887b4b22116 100644 (file)
@@ -1,3 +1,20 @@
+2015-10-20  Steve Baird  <baird@adacore.com>
+
+       * pprint.adb: Code clean up.
+
+2015-10-20  Bob Duff  <duff@adacore.com>
+
+       * a-cfinve.ads, a-coboho.ads: Improve comments.
+       * a-coboho.adb (Size_In_Storage_Elements): Improve error message
+       in case of "Size is too big" exception.
+
+2015-10-20  Bob Duff  <duff@adacore.com>
+
+       * a-contai.ads: Remove check names (moved to snames.ads-tmpl).
+       * snames.ads-tmpl: Add check names that were previously in
+       a-contai.ads, so they are now visible in configuration files.
+       * types.ads: Add checks corresponding to snames.ads-tmpl.
+
 2015-10-20  Ed Schonberg  <schonberg@adacore.com>
 
        * sem_ch5.adb (Analyze_Loop_Statement): Attach generated loop
index 2fef4af7856f54928c3393f89f6362f1b000431b..17f6f7c22d0f270de5266847487639987ce510ea 100644 (file)
@@ -41,8 +41,12 @@ generic
    type Element_Type (<>) is private;
    Max_Size_In_Storage_Elements : Natural :=
                                     Element_Type'Max_Size_In_Storage_Elements;
-   --  This has the same meaning as in Ada.Containers.Bounded_Holders, with the
-   --  same restrictions.
+   --  Maximum size of Vector elements in bytes. This has the same meaning as
+   --  in Ada.Containers.Bounded_Holders, with the same restrictions. Note that
+   --  setting this too small can lead to erroneous execution; see comments in
+   --  Ada.Containers.Bounded_Holders. If Element_Type is class-wide, it is the
+   --  responsibility of clients to calculate the maximum size of all types in
+   --  the class.
 
    with function "=" (Left, Right : Element_Type) return Boolean is <>;
 
index 4ea0fa047aa4c8b3f7365a4d2dc7458c97b88868..590e807dd32c1864e70b3908e4a9ebd430029800 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---            Copyright (C) 2014, Free Software Foundation, Inc.            --
+--            Copyright (C) 2015, 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- --
 ------------------------------------------------------------------------------
 
 with Unchecked_Conversion;
-with Ada.Assertions; use Ada.Assertions;
 
 package body Ada.Containers.Bounded_Holders is
 
    pragma Annotate (CodePeer, Skip_Analysis);
 
-   function Size_In_Storage_Elements (Element : Element_Type) return Natural is
-     (Element'Size / System.Storage_Unit)
-       with Pre =>
-       (Element'Size mod System.Storage_Unit = 0 or else
-          raise Assertion_Error with "Size must be a multiple of Storage_Unit")
-       and then
-         (Element'Size / System.Storage_Unit <= Max_Size_In_Storage_Elements
-            or else raise Assertion_Error with "Size is too big");
+   function Size_In_Storage_Elements (Element : Element_Type) return Natural;
    --  This returns the size of Element in storage units. It raises an
    --  exception if the size is not a multiple of Storage_Unit, or if the size
    --  is too big.
 
+   ------------------------------
+   -- Size_In_Storage_Elements --
+   ------------------------------
+
+   function Size_In_Storage_Elements (Element : Element_Type) return Natural is
+      Max_Size : Natural renames Max_Size_In_Storage_Elements;
+
+   begin
+      return S : constant Natural := Element'Size / System.Storage_Unit do
+         pragma Assert
+           (Element'Size mod System.Storage_Unit = 0,
+            "Size must be a multiple of Storage_Unit");
+
+         pragma Assert
+           (S <= Max_Size, "Size is too big:" & S'Img & " >" & Max_Size'Img);
+      end return;
+   end Size_In_Storage_Elements;
+
    function Cast is new
      Unchecked_Conversion (System.Address, Element_Access);
 
@@ -65,9 +75,9 @@ package body Ada.Containers.Bounded_Holders is
       return Cast (Container'Address).all;
    end Get;
 
-   ---------------------
-   -- Replace_Element --
-   ---------------------
+   ---------
+   -- Set --
+   ---------
 
    procedure Set (Container : in out Holder; New_Item  : Element_Type) is
       Storage : Storage_Array
index 7e6933e22deefdcc7967742790fb11362ff6a82f..8764410d40748735292ac954c7e8ad7270964a34 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 S p e c                                  --
 --                                                                          --
---            Copyright (C) 2014, Free Software Foundation, Inc.            --
+--            Copyright (C) 2015, 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 --
@@ -51,9 +51,14 @@ package Ada.Containers.Bounded_Holders is
    --
    --  Each object of type Holder is allocated Max_Size_In_Storage_Elements
    --  bytes. If you try to create a holder from an object of type Element_Type
-   --  that is too big, an exception is raised. This applies to To_Holder and
-   --  Replace_Element. If you pass an Element_Type object that is smaller than
-   --  Max_Size_In_Storage_Elements, it works fine, but some space is wasted.
+   --  that is too big, an exception is raised (assuming assertions are
+   --  enabled). This applies to To_Holder and Set. If you pass an Element_Type
+   --  object that is smaller than Max_Size_In_Storage_Elements, it works fine,
+   --  but some space is wasted.
+   --
+   --  NOTE: If assertions are disabled, and you try to use an Element that is
+   --  too big, execution is erroneous, and anything can happen, such as
+   --  overwriting arbitrary memory locations.
    --
    --  Element_Type must not be an unconstrained array type. It can be a
    --  class-wide type or a type with non-defaulted discriminants.
index 5ae53ff875da38be065ed8a30b3353d712283f7a..be8a808747bf67833f5347c39f3a3dc87eb93d2a 100644 (file)
 --                                                                          --
 ------------------------------------------------------------------------------
 
-pragma Check_Name (Container_Checks);
-pragma Check_Name (Tampering_Check);
---  The above checks are not in the Ada RM. They are added in order to allow
---  suppression of checks within containers packages. Suppressing
---  Tampering_Check suppresses the tampering checks and associated machinery,
---  which is very expensive. Suppressing Container_Checks suppresses
---  Tampering_Check as well as all the other (not-so-expensive) containers
---  checks.
-
 package Ada.Containers is
    pragma Pure;
 
index 102611fa3717b3a02500482fc93fd3d4ebcc5e53..cc0bfe5f970b96fbf1d2b5f519b7b628ffce1027 100644 (file)
@@ -713,11 +713,11 @@ package body Pprint is
       end loop;
 
       declare
+         Scn      : Source_Ptr := Original_Location (Sloc (Left));
          End_Sloc : constant Source_Ptr :=
                       Original_Location (Sloc (Right));
          Src      : constant Source_Buffer_Ptr :=
                       Source_Text (Get_Source_File_Index (Scn));
-         Scn      : Source_Ptr := Original_Location (Sloc (Left));
 
       begin
          if Scn > End_Sloc then
index 881f36589f86e704b8a84a13f8fa66fc24a550cb..c0860e48544b5f5978e2afc00494e17fc2c76a0f 100644 (file)
@@ -1105,6 +1105,8 @@ package Snames is
    Name_Storage_Check                  : constant Name_Id := N + $;
    Name_Tag_Check                      : constant Name_Id := N + $;
    Name_Validity_Check                 : constant Name_Id := N + $; -- GNAT
+   Name_Container_Checks               : constant Name_Id := N + $; -- GNAT
+   Name_Tampering_Check                : constant Name_Id := N + $; -- GNAT
    Name_All_Checks                     : constant Name_Id := N + $;
    Last_Check_Name                     : constant Name_Id := N + $;
 
index af772fa70fc45a09dc2a4e61d15f90afe76fc21c..8b21b10ca4df36578881c58df4cd51e0c8a27ebf 100644 (file)
@@ -679,11 +679,13 @@ package Types is
    Storage_Check          : constant := 15;
    Tag_Check              : constant := 16;
    Validity_Check         : constant := 17;
+   Container_Checks       : constant := 18;
+   Tampering_Check        : constant := 19;
    --  Values used to represent individual predefined checks (including the
    --  setting of Atomic_Synchronization, which is implemented internally using
    --  a "check" whose name is Atomic_Synchronization).
 
-   All_Checks : constant := 18;
+   All_Checks : constant := 20;
    --  Value used to represent All_Checks value
 
    subtype Predefined_Check_Id is Check_Id range 1 .. All_Checks;