Jim Meyering wrote:
Building coreutils configured with --enable-gcc-warnings and using
bleeding-edge gcc evoked a build failure due to the time_rz module.
The attached patch removes the warning/error-evoking test.

This patch doesn't look right: if localtime_r fails, the original code returns NULL, but the revised code does not. I installed the attached further patch which fixes that, and which attempts to work around the compiler warning (though I can't easily test that).
From 87cc4074336ad1028e446f1c68ee7ae543a96bdb Mon Sep 17 00:00:00 2001
From: Paul Eggert <[email protected]>
Date: Sun, 18 Oct 2015 10:24:37 -0700
Subject: [PATCH] time_rz: return NULL if localtime_r fails

* lib/time_rz.c (localtime_rz): Return NULL if localtime_r fails,
while still attempting to pacify bleeding-edge GCC.
---
 ChangeLog     | 4 ++++
 lib/time_rz.c | 5 ++---
 2 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 01a0536..3a9768e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2015-10-18  Paul Eggert  <[email protected]>
 
+       time_rz: return NULL if localtime_r fails
+       * lib/time_rz.c (localtime_rz): Return NULL if localtime_r fails,
+       while still attempting to pacify bleeding-edge GCC.
+
        fts: port to C11 alignof
        * doc/posix-headers/stdalign.texi (stdalign.h):
        Document the C11 restriction.
diff --git a/lib/time_rz.c b/lib/time_rz.c
index 396cdd2..8a0cbb2 100644
--- a/lib/time_rz.c
+++ b/lib/time_rz.c
@@ -288,9 +288,8 @@ localtime_rz (timezone_t tz, time_t const *t, struct tm *tm)
       timezone_t old_tz = set_tz (tz);
       if (old_tz)
         {
-          if (localtime_r (t, tm) && !save_abbr (tz, tm))
-            tm = NULL;
-          if (revert_tz (old_tz))
+          bool abbr_saved = localtime_r (t, tm) && save_abbr (tz, tm);
+          if (revert_tz (old_tz) && abbr_saved)
             return tm;
         }
       return NULL;
-- 
2.1.0

Reply via email to