Solaris10でvarnishをmake

Solaris10でvarnishをmakeすると、こんなエラー。varnish-2.1.3,gcc3.4.3という環境。

$ ./configure
$ /usr/local/bin/make
(中略)
/bin/bash ../../libtool --tag=CC   --mode=compile gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I../.. -I../../include    -g -O2 -MT vcc_parse.lo -MD -MP -MF .deps/vcc_parse.Tpo -c -o vcc_parse.lo vcc_parse.c
libtool: compile:  gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I../.. -I../../include -g -O2 -MT vcc_parse.lo -MD -MP -MF .deps/vcc_parse.Tpo -c vcc_parse.c  -fPIC -DPIC -o .libs/vcc_parse.o
vcc_parse.c: In function `vcc_DoubleVal':
vcc_parse.c:158: error: incompatible types in return
make: *** [vcc_parse.lo] Error 1
$ 

エラー該当部分のソースはこんな感じ。

double
vcc_DoubleVal(struct tokenlist *tl)
{
        double d = 0.0, e = 0.1;
        const char *p;

        Expect(tl, CNUM);
        if (tl->err)
                return (NAN);
        for (p = tl->t->b; p < tl->t->e; p++) {
                d *= 10;
                d += *p - '0';
        }
(後略)

return(NAN)のところでエラーがでています。このNAN、コンパイラプリプロセッサモードで展開したところ、
"__builtin_nan"となっていました。NANというマクロは /usr/include/iso/math_c99.hで定義されています。

#define        NAN             __builtin_nan

__builtin_nanはgccの組み込み関数なので、上記のreturn(NAN)だと関数へのポインタを返すという意味になってしまいます。それでコンパイルエラーがでていたんでしょう。

ではLinux機でNANというマクロはどう展開されるかを調査。こんなソースを書いて、プリプロセッサで展開。

$ cat c.c
#include<stdio.h>
#include<math.h>
NAN;
$ gcc -E c.c
(中略)

(__builtin_nanf (""));

ということで、ちゃんと関数を読んだ結果ってマクロになっています。
故に、vcc_parse.cの158行目は以下のように改修。

                return (__builtin_nanf(""));

っと、リンクで__builtin_nanfがないよっていわれました。。うーん。
もうちょっと調べます。