Subject: bug#30718: coreutils-8.29 compilation failure using xlC on AIX

From: Paul Eggert <[email-masked]>
Date: Mon, 5 Mar 2018 15:55:51 -0800

On 03/05/2018 12:48 PM, John Wiersba wrote:
> I'm not sure of the rationale for using enum here, but apparently the AIX xlC compiler
> doesn't like it.

That's a bug in the IBM xlC compiler; could you please report it to IBM?

The code uses an enum because it wants to name the expression. The C 
standard requires that static array sizes have constant bounds, and 
enums are constants, so this technique conforms to C89 (as well as to 
C99 and C11). If the IBM compiler is complaining about it then it's not 
conforming to the standard. Most likely the compiler is incorrectly 
hoisting the static decl to be as if it were outside the function body, 
which is an incorrect transformation.

Anyway, I installed the attached patch into coreutils, to work around 
the compiler bug. Thanks for reporting the problem.

>From 6d0989816d0e3c26dd90c50bd63040293d2b7f7a Mon Sep 17 00:00:00 2001
From: Paul Eggert <[email-masked]>
Date: Mon, 5 Mar 2018 15:50:39 -0800
Subject: [PATCH] stat: work around IBM xlC bug

Problem reported by John Wiersba (Bug#30718)
* src/stat.c (human_time): Avoid giving an integer constant
expression a name, as it runs afoul of a bug in IBM XL C/C++ for
AIX 12.01.0000.0002.
---
 src/stat.c | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/src/stat.c b/src/stat.c
index 8614a4d11..c5da60260 100644
--- a/src/stat.c
+++ b/src/stat.c
@@ -590,12 +590,10 @@ human_access (struct stat const *statbuf)
 static char * ATTRIBUTE_WARN_UNUSED_RESULT
 human_time (struct timespec t)
 {
-  /* STR must be at least this big, either because localtime_rz fails,
-     or because the time zone is truly outlandish so that %z expands
-     to a long string.  */
-  enum { intmax_bufsize = INT_BUFSIZE_BOUND (intmax_t) };
-
-  static char str[intmax_bufsize
+  /* STR must be at least INT_BUFSIZE_BOUND (intmax_t) big, either
+     because localtime_rz fails, or because the time zone is truly
+     outlandish so that %z expands to a long string.  */
+  static char str[INT_BUFSIZE_BOUND (intmax_t)
                   + INT_STRLEN_BOUND (int) /* YYYY */
                   + 1 /* because YYYY might equal INT_MAX + 1900 */
                   + sizeof "-MM-DD HH:MM:SS.NNNNNNNNN +"];
-- 
2.14.3