mktime: check signed shifts on long_int and time_t, too
authorPaul Eggert <eggert@cs.ucla.edu>
Fri, 16 Mar 2012 09:57:35 +0000 (02:57 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Wed, 23 May 2012 21:36:24 +0000 (14:36 -0700)
* time/mktime.c (SHR): Check that shifts work as desired
on the types long_int and time_t too, as SHR is used on
such types.

ChangeLog
time/mktime.c

index 5b99dac..b5cf376 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2012-05-23  Paul Eggert  <eggert@cs.ucla.edu>
 
+       mktime: check signed shifts on long_int and time_t, too
+       * time/mktime.c (SHR): Check that shifts work as desired
+       on the types long_int and time_t too, as SHR is used on
+       such types.
+
        mktime: do not assume 'long' is wide enough
        * time/mktime.c (verify): Move decl up.
        (long_int): New type.
index 6d4db69..5144987 100644 (file)
@@ -89,9 +89,11 @@ verify (long_int_is_wide_enough, INT_MAX == INT_MAX * (long_int) 2 / 2);
    implementations (e.g., UNICOS 9.0 on a Cray Y-MP EL) don't shift
    right in the usual way when A < 0, so SHR falls back on division if
    ordinary A >> B doesn't seem to be the usual signed shift.  */
-#define SHR(a, b)      \
-  (-1 >> 1 == -1       \
-   ? (a) >> (b)                \
+#define SHR(a, b)                                               \
+  ((-1 >> 1 == -1                                               \
+    && (long_int) -1 >> 1 == -1                                 \
+    && ((time_t) -1 >> 1 == -1 || ! TYPE_SIGNED (time_t)))      \
+   ? (a) >> (b)                                                 \
    : (a) / (1 << (b)) - ((a) % (1 << (b)) < 0))
 
 /* The extra casts in the following macros work around compiler bugs,