On Fri, Mar 04, 2011 at 07:54:29PM +0200, Janne Blomqvist wrote:
> This should fix the problem reported on HP-UX 10.2. Committed as obvious:

Well, it is not so obvious, you shouldn't be ignoring the return value from
strftime, because if it fails, ltm will contain raondom undefined values.
If there are different return values, you should just
__builtin_choose_expr (__builtin_classify_type (localtime_r (timep, &ltm)) == 5,
                       failed = localtime_r (timep, &ltm) == NULL,
                       failed = localtime_r (timep, &ltm) != 0);
if (failed)
  return 0;
or something similar.

> --- intrinsics/ctime.c  (revision 170679)
> +++ intrinsics/ctime.c  (working copy)
> @@ -39,9 +39,13 @@ static size_t
>  strctime (char *s, size_t max, const time_t *timep)
>  {
>  #ifdef HAVE_STRFTIME
> -  struct tm res;
> -  struct tm *ltm = localtime_r (timep, &res);
> -  return strftime (s, max, "%c", ltm);
> +  struct tm ltm;
> +  /* Note: We can't use the return value of localtime_r, as some
> +     targets provide localtime_r based on a draft of the POSIX
> +     standard where the return type is int rather than the
> +     standardized struct tm*.  */
> +  localtime_r (timep, &ltm);
> +  return strftime (s, max, "%c", &ltm);
>  #else
>    return 0;
>  #endif
> Index: ChangeLog
> ===================================================================
> --- ChangeLog   (revision 170679)
> +++ ChangeLog   (working copy)
> @@ -1,3 +1,9 @@
> +2011-03-04  Janne Blomqvist  <j...@gcc.gnu.org>
> +
> +       PR libfortran/47802
> +       * intrinsics/ctime.c (strctime): Don't use return value of
> +       localtime_r.
> +

        Jakub

Reply via email to