On 10/24/10, Philip Guenther <guent...@sendmail.com> wrote: > On Sat, 23 Oct 2010, Landry Breuil wrote: >> i'm porting an app which uses: >> static gdouble line_speed = NAN; >> static gdouble line_course = NAN; >> >> which yields: >> gpspoint.c:84: error: initializer element is not constant >> gpspoint.c:85: error: initializer element is not constant >> >> Kirill Bychkov pointed out >> (http://marc.info/?l=openbsd-ports&m=128645629406557&w=2) >> to me that netbsd had the following related pr which affects us too: >> http://gnats.netbsd.org/cgi-bin/query-pr-single.pl?number=40695 >> >> Can we consider using the same libc fix ? > > I'm with Mike in not seeing the benefit of the linker warning, especially > if the math.h change still uses __nan for the non-GCC case, or rather for > the not-gcc-3.3-or-newer case. The gcc2 platforms will obviously continue > to be non-compliant. ok guenther@ on the math.h bit.
actually, c99 requires all of those macros expand to the constant expressions. - make HUGE_VAL, HUGE_VALF, HUGE_VALL, INFINITY, NAN expand to the constant expressions with the help of gcc post-3.3. i'm attaching the diff below with hope that gmail doesn't mangle it. alternatively, you can find it on cvs:~martynas. Index: math.h =================================================================== RCS file: /cvs/src/include/math.h,v retrieving revision 1.26 diff -u -r1.26 math.h --- math.h 25 Jul 2009 11:38:09 -0000 1.26 +++ math.h 24 Oct 2010 00:07:47 -0000 @@ -25,7 +25,11 @@ * ANSI/POSIX */ extern char __infinity[]; +#if __GNUC_PREREQ__(3, 3) +#define HUGE_VAL __builtin_huge_val() +#else /* __GNUC_PREREQ__(3, 3) */ #define HUGE_VAL (*(double *)(void *)__infinity) +#endif /* __GNUC_PREREQ__(3, 3) */ /* * C99 @@ -34,6 +38,12 @@ typedef __double_t double_t; typedef __float_t float_t; +#if __GNUC_PREREQ__(3, 3) +#define HUGE_VALF __builtin_huge_valf() +#define HUGE_VALL __builtin_huge_vall() +#define INFINITY __builtin_inff() +#define NAN __builtin_nanf("") +#else /* __GNUC_PREREQ__(3, 3) */ #ifdef __vax__ extern char __infinityf[]; #define HUGE_VALF (*(float *)(void *)__infinityf) @@ -46,6 +56,7 @@ extern char __nan[]; #define NAN (*(float *)(void *)__nan) #endif /* !__vax__ */ +#endif /* __GNUC_PREREQ__(3, 3) */ #define FP_INFINITE 0x01 #define FP_NAN 0x02