Hi,

On 2009-08-30 I asked Paul Eggert:
> static inline time_t
> ydhms_diff (long int year1, long int yday1, int hour1, int min1, int sec1,
>           int year0, int yday0, int hour0, int min0, int sec0)
> {
>   verify (C99_integer_division, -1 / 2 == 0);
>   verify (long_int_year_and_yday_are_wide_enough,
>         INT_MAX <= LONG_MAX / 2 || TIME_T_MAX <= UINT_MAX);
> 
> The failing assertion is the second one.
> 
> The situation is that 'int' and 'long' are 32-bit, but 'time_t' is 64-bit.
> 
> Why is that verify() there? If the code is supposed to be correct when
> 'int' and 'long' are 32-bit and 'time_t' is 32-bit as well, why would
> changing 'time_t' to 64-bit cause a problem? Recall that
>   - time_t is the output type, not the input type,
>   - the caller verifies the result against overflow,
>   - the year1 and yday1 arguments are computed from 'int' values.

No one answered. So, assuming that my understanding is correct that nothing
can go wrong when 'time_t' is 64 bit large, I'm disabling this assertion:


2009-09-17  Bruno Haible  <br...@clisp.org>

        Disable assertion that fails on NetBSD 5 / i386.
        * lib/mktime.c (ydhms_diff): Disable assertion about time_t size.
        Reported by Sam Steingold <s...@gnu.org>
        and Hasso Tepper <ha...@netbsd.org>.

--- lib/mktime.c.orig   2009-09-17 08:03:02.000000000 +0200
+++ lib/mktime.c        2009-09-17 08:01:05.000000000 +0200
@@ -1,5 +1,5 @@
 /* Convert a `struct tm' to a time_t value.
-   Copyright (C) 1993-1999, 2002-2005, 2006, 2007 Free Software Foundation, 
Inc.
+   Copyright (C) 1993-1999, 2002-2007, 2009 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Paul Eggert <egg...@twinsun.com>.
 
@@ -165,8 +165,11 @@
            int year0, int yday0, int hour0, int min0, int sec0)
 {
   verify (C99_integer_division, -1 / 2 == 0);
+#if 0 /* This assertion fails on 32-bit systems with 64-bit time_t, such as
+         NetBSD 5 on i386.  */
   verify (long_int_year_and_yday_are_wide_enough,
          INT_MAX <= LONG_MAX / 2 || TIME_T_MAX <= UINT_MAX);
+#endif
 
   /* Compute intervening leap days correctly even if year is negative.
      Take care to avoid integer overflow here.  */


Reply via email to