[gcc r11-5478] [Ada] To_GM_Time returning invalid value for Invalid_Time

Pierre-Marie de Rodat pmderodat@gcc.gnu.org
Fri Nov 27 09:19:33 GMT 2020


https://gcc.gnu.org/g:7d4ee5f8e2ab894fdeaa67824eb32103cda947f8

commit r11-5478-g7d4ee5f8e2ab894fdeaa67824eb32103cda947f8
Author: Arnaud Charlet <charlet@adacore.com>
Date:   Wed Nov 4 08:58:47 2020 -0500

    [Ada] To_GM_Time returning invalid value for Invalid_Time
    
    gcc/ada/
    
            * libgnat/s-os_lib.adb (To_GM_Time): Return valid and consistent
            values for Invalid_Time.

Diff:
---
 gcc/ada/libgnat/s-os_lib.adb | 25 ++++++++++++++++++++++++-
 1 file changed, 24 insertions(+), 1 deletion(-)

diff --git a/gcc/ada/libgnat/s-os_lib.adb b/gcc/ada/libgnat/s-os_lib.adb
index 288325c895f..93522bc13eb 100644
--- a/gcc/ada/libgnat/s-os_lib.adb
+++ b/gcc/ada/libgnat/s-os_lib.adb
@@ -1365,6 +1365,21 @@ package body System.OS_Lib is
       S  : Integer;
 
    begin
+      --  Special case Invalid_Time which is handled differently between
+      --  Windows and Linux: Linux will set to 1 second before 1970-01-01
+      --  while Windows will set the time to 1970-01-01 with Second set to -1,
+      --  which is not a valid value.
+
+      if Date = Invalid_Time then
+         Year   := 1969;
+         Month  := 12;
+         Day    := 31;
+         Hour   := 23;
+         Minute := 59;
+         Second := 59;
+         return;
+      end if;
+
       --  Use the global lock because To_GM_Time is not thread safe
 
       Locked_Processing : begin
@@ -1387,7 +1402,15 @@ package body System.OS_Lib is
 
       Year   := Y + 1900;
       Month  := Mo + 1;
-      Day    := D;
+
+      --  May happen if To_GM_Time fails
+
+      if D = 0 then
+         Day := 1;
+      else
+         Day := D;
+      end if;
+
       Hour   := H;
       Minute := Mn;
       Second := S;


More information about the Gcc-cvs mailing list