diff gcc/ada/libgnat/a-calfor.adb @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 84e7813d76e9
children
line wrap: on
line diff
--- a/gcc/ada/libgnat/a-calfor.adb	Thu Oct 25 07:37:49 2018 +0900
+++ b/gcc/ada/libgnat/a-calfor.adb	Thu Feb 13 11:34:05 2020 +0900
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 2006-2018, Free Software Foundation, Inc.         --
+--          Copyright (C) 2006-2019, 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- --
@@ -52,6 +52,15 @@
    --  such as 1983-*1-j3 u5:n7:k9 which should be 1983-01-03 05:07:09. Raise
    --  Constraint_Error if there is a mismatch.
 
+   procedure Split_Duration
+     (Seconds    : Duration;
+      Hour       : out Natural;
+      Minute     : out Minute_Number;
+      Second     : out Second_Number;
+      Sub_Second : out Second_Duration);
+   --  Version of Split that allows durations < 100 hours.
+   --  Will raise Time_Error if Seconds >= 100 hours.
+
    ----------------
    -- Check_Char --
    ----------------
@@ -140,7 +149,7 @@
       Include_Time_Fraction : Boolean := False) return String
    is
       To_Char    : constant array (0 .. 9) of Character := "0123456789";
-      Hour       : Hour_Number;
+      Hour       : Natural;
       Minute     : Minute_Number;
       Second     : Second_Number;
       Sub_Second : Duration;
@@ -155,7 +164,7 @@
       Result : String := "-00:00:00.00";
 
    begin
-      Split (abs (Elapsed_Time), Hour, Minute, Second, Sub_Second);
+      Split_Duration (abs Elapsed_Time, Hour, Minute, Second, Sub_Second);
 
       --  Hour processing, positions 2 and 3
 
@@ -361,6 +370,34 @@
              Sub_Second;
    end Seconds_Of;
 
+   --------------------
+   -- Split_Duration --
+   --------------------
+
+   procedure Split_Duration
+     (Seconds    : Duration;
+      Hour       : out Natural;
+      Minute     : out Minute_Number;
+      Second     : out Second_Number;
+      Sub_Second : out Second_Duration)
+   is
+      Secs : Natural;
+   begin
+      --  Check that Seconds is below 100 hours
+
+      if Seconds >= 3600.0 * 100.0 then
+         raise Time_Error;
+      end if;
+
+      Secs := (if Seconds = 0.0 then 0 else Natural (Seconds - 0.5));
+
+      Sub_Second := Second_Duration (Seconds - Duration (Secs));
+      Hour       := Natural (Secs / 3_600);
+      Secs       := Secs mod 3_600;
+      Minute     := Minute_Number (Secs / 60);
+      Second     := Second_Number (Secs mod 60);
+   end Split_Duration;
+
    -----------
    -- Split --
    -----------
@@ -372,8 +409,7 @@
       Second     : out Second_Number;
       Sub_Second : out Second_Duration)
    is
-      Secs : Natural;
-
+      Unchecked_Hour : Natural;
    begin
       --  Validity checks
 
@@ -381,23 +417,13 @@
          raise Constraint_Error;
       end if;
 
-      Secs := (if Seconds = 0.0 then 0 else Natural (Seconds - 0.5));
-
-      Sub_Second := Second_Duration (Seconds - Day_Duration (Secs));
-      Hour       := Hour_Number (Secs / 3_600);
-      Secs       := Secs mod 3_600;
-      Minute     := Minute_Number (Secs / 60);
-      Second     := Second_Number (Secs mod 60);
+      Split_Duration (Seconds, Unchecked_Hour, Minute, Second, Sub_Second);
 
-      --  Validity checks
-
-      if not Hour'Valid
-        or else not Minute'Valid
-        or else not Second'Valid
-        or else not Sub_Second'Valid
-      then
+      if Unchecked_Hour > Hour_Number'Last then
          raise Time_Error;
       end if;
+
+      Hour := Unchecked_Hour;
    end Split;
 
    -----------