PR 47802 Use builtins to check localtime_r return type
authorJanne Blomqvist <jb@gcc.gnu.org>
Fri, 4 Mar 2011 19:07:49 +0000 (21:07 +0200)
committerJanne Blomqvist <jb@gcc.gnu.org>
Fri, 4 Mar 2011 19:07:49 +0000 (21:07 +0200)
From-SVN: r170683

libgfortran/ChangeLog
libgfortran/intrinsics/ctime.c

index 73e2bb2ad1318a26ad8053e5bb65805851cf2c96..33e2836ea7ff46c2ae65170116427d6c0415e5e9 100644 (file)
@@ -1,3 +1,9 @@
+2011-03-04  Janne Blomqvist  <jb@gcc.gnu.org>
+
+       PR libfortran/47802
+       * intrinsics/ctime.c (strctime): Use builtins to check localtime_r
+       return type.
+
 2011-03-04  Janne Blomqvist  <jb@gcc.gnu.org>
 
        PR libfortran/47802
index 29a0e6f00f2fda37344d59e997023df988da4149..92c0431357e5c0a25ac074954abe47b51237cea3 100644 (file)
@@ -40,11 +40,16 @@ strctime (char *s, size_t max, const time_t *timep)
 {
 #ifdef HAVE_STRFTIME
   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
+  int failed;
+  /* Some targets provide a 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);
+  __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;
   return strftime (s, max, "%c", &ltm);
 #else
   return 0;