bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: M4 tests fail when built with PGI compilers


From: Stewart, Adam James
Subject: RE: M4 tests fail when built with PGI compilers
Date: Thu, 9 Feb 2017 16:50:47 +0000

Paul,

I didn't realize my PGI installation was already obsolete. I updated to PGI 
16.10, applied your patch, and `make check` passes all tests! Thanks for the 
help!

Adam J. Stewart
Assistant Systems Administrator
Laboratory Computing Resource Center
Computing, Environment and Life Sciences
Argonne National Laboratory

________________________________________
From: Paul Eggert address@hidden
Sent: Wednesday, February 08, 2017 6:19 PM
To: Stewart, Adam James
Cc: Eric Blake; address@hidden; Bug-gnulib
Subject: Re: M4 tests fail when built with PGI compilers

On 02/06/2017 01:37 PM, Stewart, Adam James wrote:
> I tried applying your patch, and it looks like I got a bit further along, but 
> `make check` still crashes with:
>
>    CC       test-stddef.o
> PGC-S-0045-Illegal field size 
> (/blues/gpfs/home/software/spack-0.10.0/var/spack/stage/m4-1.4.18-zwtcbe4z66lx36aq7iuwsqbmz35a76jp/m4-1.4.18/tests/test-stddef.c:
>  45)
> PGC-S-0045-Illegal field size 
> (/blues/gpfs/home/software/spack-0.10.0/var/spack/stage/m4-1.4.18-zwtcbe4z66lx36aq7iuwsqbmz35a76jp/m4-1.4.18/tests/test-stddef.c:
>  46)
> PGC/x86-64 Linux 16.5-0: compilation completed with severe errors
> make[5]: *** [test-stddef.o] Error 2
>
> Lines 45 and 46 of test-stddef.c look like:
>
>        /* Solaris 10 has a bug where offsetof is under-parenthesized, and
>        cannot be used as an arbitrary expression.  However, since it is
>        unlikely to bite real code, we ignore that short-coming.  */
>         /* verify (sizeof offsetof (struct d, e) == sizeof (size_t)); */
> 45   verify (sizeof (offsetof (struct d, e)) == sizeof (size_t));
> 46   verify (offsetof (struct d, e) < -1); /* Must be unsigned.  */
>         verify (offsetof (struct d, f) == 1);
>
> Is this expected?

No, possibly it's a bug in pgcc, possibly it's a Gnulib bug, or maybe
it's just that Gnulib should work around the pgcc bug. It's hard to tell
from these symptoms. To figure it out, you might try doing this:

   cd tests && rm test-stddef.o && make V=1 test-stddef.o

This will output some long command like this:

source='../../m4-1.4.18/tests/test-stddef.c' object='test-stddef.o'
libtool=no \
DEPDIR=.deps depmode=pgcc /bin/sh ../../m4-1.4.18/build-aux/depcomp \
pgcc -DEXEEXT=\"\" -I. -I../../m4-1.4.18/tests -I../lib
-DIN_M4_GNULIB_TESTS=1 -I. -I../../m4-1.4.18/tests -I..
-I../../m4-1.4.18/tests/.. -I../lib -I../../m4-1.4.18/tests/../lib   -g
-c -o test-stddef.o ../../m4-1.4.18/tests/test-stddef.c

Change the "-g -c -o test-stddef.o" to "-E" and collect the output into
a file t.i, like this:

pgcc -DEXEEXT=\"\" -I. -I../../m4-1.4.18/tests -I../lib
-DIN_M4_GNULIB_TESTS=1 -I. -I../../m4-1.4.18/tests -I..
-I../../m4-1.4.18/tests/.. -I../lib -I../../m4-1.4.18/tests/../lib -E
../../m4-1.4.18/tests/test-stddef.c >t.i

Then look in t.i for the first line after the declaration of struct d.
On my platform the line looks like this:

extern int ( * _gl_verify_function45 ( void ) ) [ ( ! ! sizeof ( struct
{ unsigned int _gl_verify_error_if_negative : ( sizeof ( ( ( unsigned
long ) ( & ( ( ( struct d * ) 0 ) -> e ) ) ) ) == sizeof ( size_t ) ) ?
1 : - 1 ; } ) ) ] ;

If it looks different, figure out why. If not, try compiling this test
case with pgcc -c:

   #include <stddef.h>
   struct d { char e; char f; };

   extern int (*g (void))
   [(!!sizeof (struct { unsigned int h :
         (sizeof (offsetof (struct d, e)) == sizeof (size_t)) ? 1 : -1;
}))];

This is valid C code, and if pgcc rejects it you have a simple case
illustrating a pgcc compiler bug.

I notice you're running pgcc 16.5. For what it's worth I do not observe
the problem with pgcc 16.10 (x86-64 GNU/Linux). So maybe it's a pgcc bug
that is already fixed in later versions.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]