s-stoele.adb ("mod"): mod negative value raises Constraint_Error
authorRobert Dewar <dewar@adacore.com>
Thu, 13 Dec 2007 10:35:02 +0000 (11:35 +0100)
committerArnaud Charlet <charlet@gcc.gnu.org>
Thu, 13 Dec 2007 10:35:02 +0000 (11:35 +0100)
2007-12-06  Robert Dewar  <dewar@adacore.com>

* s-stoele.adb ("mod"): mod negative value raises Constraint_Error

From-SVN: r130864

gcc/ada/s-stoele.adb

index 01f9fdae2a41998b37a2c47d207d462358ae7032..67aae726e75c871e6c83f48e34ae3bb4f4996fa1 100644 (file)
@@ -47,8 +47,9 @@ package body System.Storage_Elements is
      new Ada.Unchecked_Conversion (Address, Storage_Offset);
 
    --  Conversion to/from integers
-   --  Those functions must be place first because they are inlined_always
-   --  and are used in other subprograms defined in this unit.
+
+   --  These functions must be place first because they are inlined_always
+   --  and are used and inlined in other subprograms defined in this unit.
 
    function To_Integer (Value : Address) return Integer_Address is
    begin
@@ -87,12 +88,18 @@ package body System.Storage_Elements is
       Right : Storage_Offset) return Storage_Offset
    is
    begin
-      if Right >= 0 then
+      if Right > 0 then
          return Storage_Offset
-                  (To_Integer (Left) mod Integer_Address (Right));
+           (To_Integer (Left) mod Integer_Address (Right));
+
+         --  The negative case makes no sense since it is a case of a mod where
+         --  the left argument is unsigned and the right argument is signed. In
+         --  accordance with the (spirit of the) permission of RM 13.7.1(16),
+         --  we raise CE, and also include the zero case here. Yes, the RM says
+         --  PE, but this really is so obviously more like a constraint error.
+
       else
-         return -Storage_Offset
-                  ((-To_Integer (Left)) mod Integer_Address (-Right));
+         raise Constraint_Error;
       end if;
    end "mod";
 end System.Storage_Elements;