mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-22 13:00:06 +00:00
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.
This commit is contained in:
parent
f04dfbc244
commit
03cf7fe31b
@ -1,5 +1,10 @@
|
|||||||
2012-05-23 Paul Eggert <eggert@cs.ucla.edu>
|
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
|
mktime: do not assume 'long' is wide enough
|
||||||
* time/mktime.c (verify): Move decl up.
|
* time/mktime.c (verify): Move decl up.
|
||||||
(long_int): New type.
|
(long_int): New type.
|
||||||
|
@ -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
|
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
|
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. */
|
ordinary A >> B doesn't seem to be the usual signed shift. */
|
||||||
#define SHR(a, b) \
|
#define SHR(a, b) \
|
||||||
(-1 >> 1 == -1 \
|
((-1 >> 1 == -1 \
|
||||||
? (a) >> (b) \
|
&& (long_int) -1 >> 1 == -1 \
|
||||||
|
&& ((time_t) -1 >> 1 == -1 || ! TYPE_SIGNED (time_t))) \
|
||||||
|
? (a) >> (b) \
|
||||||
: (a) / (1 << (b)) - ((a) % (1 << (b)) < 0))
|
: (a) / (1 << (b)) - ((a) % (1 << (b)) < 0))
|
||||||
|
|
||||||
/* The extra casts in the following macros work around compiler bugs,
|
/* The extra casts in the following macros work around compiler bugs,
|
||||||
|
Loading…
Reference in New Issue
Block a user