From 7d4ee5f8e2ab894fdeaa67824eb32103cda947f8 Mon Sep 17 00:00:00 2001 From: Arnaud Charlet Date: Wed, 4 Nov 2020 08:58:47 -0500 Subject: [PATCH] [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. --- 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; -- 2.30.2