Jim Meyering wrote: > Markus Armbruster <[EMAIL PROTECTED]> wrote: > > With the appended patch, koji ate it up: > > http://koji.fedoraproject.org/koji/taskinfo?taskID=886652 > > Great! Thanks a lot, Markus. > > Bruno, FYI, Markus discovered that > an upcoming idutils release fails to compile on ppc-based systems: > (details here http://koji.fedoraproject.org/koji/taskinfo?taskID=886563)
Thanks for the report. Your build pages indicate a cross-compiling build, and in this setting I can actually reproduce it. (While Nelson Beebe's report says "Apple Mac OS X 10.x PowerPC", I could not reproduce any problem on MacOS X 10.3.9.) $ uname -sr Darwin 9.3.0 $ gcc --version| head -1 i686-apple-darwin9-gcc-4.0.1 (GCC) 4.0.1 (Apple Inc. build 5465) $ cat foo.c static long double one = 1.0L * 1.0L; static long double quarter = 0.5L * 0.5L; static long double third = 1.0L / 3.0L; #include <float.h> long double minus_zero = -LDBL_MIN * LDBL_MIN; $ gcc -arch ppc -c foo.c foo.c:3: error: initializer element is not constant foo.c:5: error: initializer element is not constant I don't much like the requirement to define minus_zero in every function that needs it. Therefore I'm applying this. It also fixes the problem, and takes care of the special compiler bugs in HP-UX cc and in IRIX 6.2 cc (see <http://lists.gnu.org/archive/html/bug-gnulib/2008-10/msg00116.html>). 2008-10-17 Bruno Haible <[EMAIL PROTECTED]> * m4/signbit.m4 (gl_SIGNBIT_TEST_PROGRAM): On platforms other than HP-UX and IRIX, use -0.0L. * tests/test-ceill.c (minus_zero): Likewise. * tests/test-floorl.c (minus_zero): Likewise. * tests/test-frexpl.c (minus_zero): Likewise. * tests/test-isnan.c (minus_zerol): Likewise. * tests/test-isnanl.h (minus_zero): Likewise. * tests/test-ldexpl.c (minus_zero): Likewise. * tests/test-roundl.c (minus_zero): Likewise. * tests/test-signbit.c (minus_zerol): Likewise. * tests/test-snprintf-posix.h (minus_zerol): Likewise. * tests/test-sprintf-posix.h (minus_zerol): Likewise. * tests/test-truncl.c (minus_zero): Likewise. * tests/test-vasnprintf-posix.c (minus_zerol): Likewise. * tests/test-vasprintf-posix.c (minus_zerol): Likewise. Reported by Markus Armbruster <[EMAIL PROTECTED]> via Jim Meyering and by Nelson H. F. Beebe <[EMAIL PROTECTED]> via Eric Blake. *** m4/signbit.m4.orig 2008-10-18 03:08:24.000000000 +0200 --- m4/signbit.m4 2008-10-18 03:02:23.000000000 +0200 *************** *** 131,139 **** double p0d = 0.0; double m0d = -p0d; /* On HP-UX 10.20, negating 0.0L does not yield -0.0L. ! So we use another constant expression instead. */ long double p0l = 0.0L; ! #ifdef __hpux long double m0l = -LDBL_MIN * LDBL_MIN; #else long double m0l = -p0l; --- 131,141 ---- double p0d = 0.0; double m0d = -p0d; /* On HP-UX 10.20, negating 0.0L does not yield -0.0L. ! So we use another constant expression instead. ! But that expression does not work on other platforms, such as when ! cross-compiling to PowerPC on MacOS X 10.5. */ long double p0l = 0.0L; ! #if defined __hpux || defined __sgi long double m0l = -LDBL_MIN * LDBL_MIN; #else long double m0l = -p0l; *** tests/test-ceill.c.orig 2008-10-18 03:08:25.000000000 +0200 --- tests/test-ceill.c 2008-10-18 03:02:29.000000000 +0200 *************** *** 40,47 **** while (0) /* On HP-UX 10.20, negating 0.0L does not yield -0.0L. ! So we use minus_zero instead. */ long double minus_zero = -LDBL_MIN * LDBL_MIN; int main () --- 40,53 ---- while (0) /* On HP-UX 10.20, negating 0.0L does not yield -0.0L. ! So we use minus_zero instead. ! Note that the expression -LDBL_MIN * LDBL_MIN does not work on other ! platforms, such as when cross-compiling to PowerPC on MacOS X 10.5. */ ! #if defined __hpux || defined __sgi long double minus_zero = -LDBL_MIN * LDBL_MIN; + #else + long double minus_zero = -0.0L; + #endif int main () *** tests/test-floorl.c.orig 2008-10-18 03:08:25.000000000 +0200 --- tests/test-floorl.c 2008-10-18 03:02:31.000000000 +0200 *************** *** 40,47 **** while (0) /* On HP-UX 10.20, negating 0.0L does not yield -0.0L. ! So we use minus_zero instead. */ long double minus_zero = -LDBL_MIN * LDBL_MIN; int main () --- 40,53 ---- while (0) /* On HP-UX 10.20, negating 0.0L does not yield -0.0L. ! So we use minus_zero instead. ! Note that the expression -LDBL_MIN * LDBL_MIN does not work on other ! platforms, such as when cross-compiling to PowerPC on MacOS X 10.5. */ ! #if defined __hpux || defined __sgi long double minus_zero = -LDBL_MIN * LDBL_MIN; + #else + long double minus_zero = -0.0L; + #endif int main () *** tests/test-frexpl.c.orig 2008-10-18 03:08:25.000000000 +0200 --- tests/test-frexpl.c 2008-10-18 03:02:38.000000000 +0200 *************** *** 58,65 **** #endif /* On HP-UX 10.20, negating 0.0L does not yield -0.0L. ! So we use minus_zero instead. */ long double minus_zero = -LDBL_MIN * LDBL_MIN; static long double my_ldexp (long double x, int d) --- 58,71 ---- #endif /* On HP-UX 10.20, negating 0.0L does not yield -0.0L. ! So we use minus_zero instead. ! Note that the expression -LDBL_MIN * LDBL_MIN does not work on other ! platforms, such as when cross-compiling to PowerPC on MacOS X 10.5. */ ! #if defined __hpux || defined __sgi long double minus_zero = -LDBL_MIN * LDBL_MIN; + #else + long double minus_zero = -0.0L; + #endif static long double my_ldexp (long double x, int d) *** tests/test-isnan.c.orig 2008-10-18 03:08:25.000000000 +0200 --- tests/test-isnan.c 2008-10-18 03:02:40.000000000 +0200 *************** *** 49,56 **** double zerod = 0.0; /* On HP-UX 10.20, negating 0.0L does not yield -0.0L. ! So we use minus_zerol instead. */ long double minus_zerol = -LDBL_MIN * LDBL_MIN; static void test_float (void) --- 49,62 ---- double zerod = 0.0; /* On HP-UX 10.20, negating 0.0L does not yield -0.0L. ! So we use minus_zerol instead. ! Note that the expression -LDBL_MIN * LDBL_MIN does not work on other ! platforms, such as when cross-compiling to PowerPC on MacOS X 10.5. */ ! #if defined __hpux || defined __sgi long double minus_zerol = -LDBL_MIN * LDBL_MIN; + #else + long double minus_zerol = -0.0L; + #endif static void test_float (void) *** tests/test-isnanl.h.orig 2008-10-18 03:08:25.000000000 +0200 --- tests/test-isnanl.h 2008-10-18 03:02:42.000000000 +0200 *************** *** 34,41 **** while (0) /* On HP-UX 10.20, negating 0.0L does not yield -0.0L. ! So we use minus_zero instead. */ long double minus_zero = -LDBL_MIN * LDBL_MIN; int main () --- 34,47 ---- while (0) /* On HP-UX 10.20, negating 0.0L does not yield -0.0L. ! So we use minus_zero instead. ! Note that the expression -LDBL_MIN * LDBL_MIN does not work on other ! platforms, such as when cross-compiling to PowerPC on MacOS X 10.5. */ ! #if defined __hpux || defined __sgi long double minus_zero = -LDBL_MIN * LDBL_MIN; + #else + long double minus_zero = -0.0L; + #endif int main () *** tests/test-ldexpl.c.orig 2008-10-18 03:08:25.000000000 +0200 --- tests/test-ldexpl.c 2008-10-18 03:02:44.000000000 +0200 *************** *** 40,47 **** while (0) /* On HP-UX 10.20, negating 0.0L does not yield -0.0L. ! So we use minus_zero instead. */ long double minus_zero = -LDBL_MIN * LDBL_MIN; int main () --- 40,53 ---- while (0) /* On HP-UX 10.20, negating 0.0L does not yield -0.0L. ! So we use minus_zero instead. ! Note that the expression -LDBL_MIN * LDBL_MIN does not work on other ! platforms, such as when cross-compiling to PowerPC on MacOS X 10.5. */ ! #if defined __hpux || defined __sgi long double minus_zero = -LDBL_MIN * LDBL_MIN; + #else + long double minus_zero = -0.0L; + #endif int main () *** tests/test-roundl.c.orig 2008-10-18 03:08:25.000000000 +0200 --- tests/test-roundl.c 2008-10-18 03:02:33.000000000 +0200 *************** *** 42,49 **** while (0) /* On HP-UX 10.20, negating 0.0L does not yield -0.0L. ! So we use minus_zero instead. */ long double minus_zero = -LDBL_MIN * LDBL_MIN; int main () --- 42,55 ---- while (0) /* On HP-UX 10.20, negating 0.0L does not yield -0.0L. ! So we use minus_zero instead. ! Note that the expression -LDBL_MIN * LDBL_MIN does not work on other ! platforms, such as when cross-compiling to PowerPC on MacOS X 10.5. */ ! #if defined __hpux || defined __sgi long double minus_zero = -LDBL_MIN * LDBL_MIN; + #else + long double minus_zero = -0.0L; + #endif int main () *** tests/test-signbit.c.orig 2008-10-18 03:08:25.000000000 +0200 --- tests/test-signbit.c 2008-10-18 03:02:26.000000000 +0200 *************** *** 48,55 **** So we use -zerod instead. */ /* On HP-UX 10.20, negating 0.0L does not yield -0.0L. ! So we use minus_zerol instead. */ long double minus_zerol = -LDBL_MIN * LDBL_MIN; static void test_signbitf () --- 48,61 ---- So we use -zerod instead. */ /* On HP-UX 10.20, negating 0.0L does not yield -0.0L. ! So we use minus_zerol instead. ! Note that the expression -LDBL_MIN * LDBL_MIN does not work on other ! platforms, such as when cross-compiling to PowerPC on MacOS X 10.5. */ ! #if defined __hpux || defined __sgi long double minus_zerol = -LDBL_MIN * LDBL_MIN; + #else + long double minus_zerol = -0.0L; + #endif static void test_signbitf () *** tests/test-snprintf-posix.h.orig 2008-10-18 03:08:25.000000000 +0200 --- tests/test-snprintf-posix.h 2008-10-18 03:02:47.000000000 +0200 *************** *** 32,39 **** double zerod = 0.0; /* On HP-UX 10.20, negating 0.0L does not yield -0.0L. ! So we use minus_zerol instead. */ long double minus_zerol = -LDBL_MIN * LDBL_MIN; /* Representation of an 80-bit 'long double' as an initializer for a sequence of 'unsigned int' words. */ --- 32,45 ---- double zerod = 0.0; /* On HP-UX 10.20, negating 0.0L does not yield -0.0L. ! So we use minus_zerol instead. ! Note that the expression -LDBL_MIN * LDBL_MIN does not work on other ! platforms, such as when cross-compiling to PowerPC on MacOS X 10.5. */ ! #if defined __hpux || defined __sgi long double minus_zerol = -LDBL_MIN * LDBL_MIN; + #else + long double minus_zerol = -0.0L; + #endif /* Representation of an 80-bit 'long double' as an initializer for a sequence of 'unsigned int' words. */ *** tests/test-sprintf-posix.h.orig 2008-10-18 03:08:25.000000000 +0200 --- tests/test-sprintf-posix.h 2008-10-18 03:02:49.000000000 +0200 *************** *** 32,39 **** double zerod = 0.0; /* On HP-UX 10.20, negating 0.0L does not yield -0.0L. ! So we use minus_zerol instead. */ long double minus_zerol = -LDBL_MIN * LDBL_MIN; /* Representation of an 80-bit 'long double' as an initializer for a sequence of 'unsigned int' words. */ --- 32,45 ---- double zerod = 0.0; /* On HP-UX 10.20, negating 0.0L does not yield -0.0L. ! So we use minus_zerol instead. ! Note that the expression -LDBL_MIN * LDBL_MIN does not work on other ! platforms, such as when cross-compiling to PowerPC on MacOS X 10.5. */ ! #if defined __hpux || defined __sgi long double minus_zerol = -LDBL_MIN * LDBL_MIN; + #else + long double minus_zerol = -0.0L; + #endif /* Representation of an 80-bit 'long double' as an initializer for a sequence of 'unsigned int' words. */ *** tests/test-truncl.c.orig 2008-10-18 03:08:25.000000000 +0200 --- tests/test-truncl.c 2008-10-18 03:02:36.000000000 +0200 *************** *** 40,47 **** while (0) /* On HP-UX 10.20, negating 0.0L does not yield -0.0L. ! So we use minus_zero instead. */ long double minus_zero = -LDBL_MIN * LDBL_MIN; int main () --- 40,53 ---- while (0) /* On HP-UX 10.20, negating 0.0L does not yield -0.0L. ! So we use minus_zero instead. ! Note that the expression -LDBL_MIN * LDBL_MIN does not work on other ! platforms, such as when cross-compiling to PowerPC on MacOS X 10.5. */ ! #if defined __hpux || defined __sgi long double minus_zero = -LDBL_MIN * LDBL_MIN; + #else + long double minus_zero = -0.0L; + #endif int main () *** tests/test-vasnprintf-posix.c.orig 2008-10-18 03:08:25.000000000 +0200 --- tests/test-vasnprintf-posix.c 2008-10-18 03:02:51.000000000 +0200 *************** *** 57,64 **** double zerod = 0.0; /* On HP-UX 10.20, negating 0.0L does not yield -0.0L. ! So we use minus_zerol instead. */ long double minus_zerol = -LDBL_MIN * LDBL_MIN; /* Representation of an 80-bit 'long double' as an initializer for a sequence of 'unsigned int' words. */ --- 57,70 ---- double zerod = 0.0; /* On HP-UX 10.20, negating 0.0L does not yield -0.0L. ! So we use minus_zerol instead. ! Note that the expression -LDBL_MIN * LDBL_MIN does not work on other ! platforms, such as when cross-compiling to PowerPC on MacOS X 10.5. */ ! #if defined __hpux || defined __sgi long double minus_zerol = -LDBL_MIN * LDBL_MIN; + #else + long double minus_zerol = -0.0L; + #endif /* Representation of an 80-bit 'long double' as an initializer for a sequence of 'unsigned int' words. */ *** tests/test-vasprintf-posix.c.orig 2008-10-18 03:08:25.000000000 +0200 --- tests/test-vasprintf-posix.c 2008-10-18 03:02:53.000000000 +0200 *************** *** 57,64 **** double zerod = 0.0; /* On HP-UX 10.20, negating 0.0L does not yield -0.0L. ! So we use minus_zerol instead. */ long double minus_zerol = -LDBL_MIN * LDBL_MIN; /* Representation of an 80-bit 'long double' as an initializer for a sequence of 'unsigned int' words. */ --- 57,70 ---- double zerod = 0.0; /* On HP-UX 10.20, negating 0.0L does not yield -0.0L. ! So we use minus_zerol instead. ! Note that the expression -LDBL_MIN * LDBL_MIN does not work on other ! platforms, such as when cross-compiling to PowerPC on MacOS X 10.5. */ ! #if defined __hpux || defined __sgi long double minus_zerol = -LDBL_MIN * LDBL_MIN; + #else + long double minus_zerol = -0.0L; + #endif /* Representation of an 80-bit 'long double' as an initializer for a sequence of 'unsigned int' words. */