Here's one of those CHECK macros expanded typedef struct { char slot1; char slot2; } char_helper; extern int (* verify_function40 (void)) [(! !sizeof (struct { unsigned int verify_error_if_negative_size__: (((size_t)__INTADDR__(&(((struct { char __slot1; char __slot2; } *)0)->__slot2))) == ((size_t)__INTADDR__(&(((char_helper *)0)->slot2)))) ? 1 : -1; }))]; const int char_slot_alignment = ((size_t)__INTADDR__(&(((struct { char __slot1; char __slot2; } *)0)->__slot2))); const int char_type_alignment = ((size_t)__INTADDR__(&(((struct { char __slot1; char __slot2; } *)0)->__slot2)));
Seem like the bit filed it complains about starts with the unsigned int verify_error_if_negative_size__: ... looks like (((size_t)__INTADDR__(&(((struct { char __slot1; char __slot2; } *)0)->__slot2))) == ((size_t)__INTADDR__(&(((char_helper *)0)->slot2)))) ? 1 : -1; Goes negative (-1), because ((size_t)__INTADDR__(&(((struct { char __slot1; char __slot2; } *)0)->__slot2))) Is not equal to ((size_t)__INTADDR__(&(((char_helper *)0)->slot2))) do you see why, resp. what's wrong here? -----Original Message----- From: Bruno Haible [mailto:br...@clisp.org] Sent: Thursday, December 23, 2010 1:36 PM To: Joachim Schmitz Cc: bug-gnulib@gnu.org Subject: Re: porting alignof to HP-NonStop Joachim Schmitz wrote: > During compile of gltests: > Something very weird errors in test-allignof.c: > source='test-alignof.c' object='test-alignof.o' libtool=no > DEPDIR=.deps depmode=none /bin/sh ./../build-aux/depcomp cc > -DHAVE_CONFIG_H -I. -DGNULIB_STRICT_CHECKING=1 -I. -I. -I.. -I./.. > -I../gllib -I./../gllib -I/usr/local/include -g -Wnowarn -c -o > test-alignof.o test-alignof.c > CHECK (char) > ^ > "/usr/local/Floss/gnulib/testdir-posix/gltests/test-alignof.c", line 40: > error(197): > invalid size for bit field > ... This looks pretty weird: alignof_slot (char) and offsetof (char_helper, slot2) should be different?? Where alignof_slot (char) is defined as offsetof (struct { char __slot1; char __slot2; }, __slot2) and char_helper is defined through typedef struct { char slot1; char slot2; } char_helper; The only differences between the left-hand side and the right-hand side are the names of the struct fields, and the use of 'typedef'. You need to look at the preprocessed output (cc -E) of test-alignof.c and trim it down to produce a minimal test case. Bruno