Re: porting alignof to HP-NonStop

2010-12-24 Thread Bruno Haible
Joachim Schmitz wrote:
 typedef struct { char slot1; char slot2; } char_helper;

 ((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?

No, I don't see why. That's why I suggested that you reduce this test case
until you see why.

Bruno



Re: porting alignof to HP-NonStop

2010-12-23 Thread Bruno Haible
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



RE: porting alignof to HP-NonStop

2010-12-23 Thread Joachim Schmitz
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