bug-gnulib
[Top][All Lists]
Advanced

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

Re: alignof failure


From: Bruno Haible
Subject: Re: alignof failure
Date: Sun, 31 May 2009 21:43:44 +0200
User-agent: KMail/1.9.9

Hi Simon,

Thanks for insisting.

> How about this patch?

It goes into this direction, yes. Additionally, it looks like most callers
of the 'alignof' macro want the "field in struct" semantics (or at least,
can live with this semantics). So I'm using this semantics for 'alignof'.

I'll push this:

2009-05-31  Simon Josefsson  <address@hidden>
            Bruno Haible  <address@hidden>

        Fix test-alignof failure.
        * lib/alignof.h (alignof_slot): New macro.
        (alignof_type): New macro, with the same semantics as the previous
        'alignof'.
        (alignof): Alias to alignof_slot.
        * tests/test-alignof.c (CHECK): Check alignof_slot, not alignof. Also
        check that the results are usable as constant expressions.

*** lib/alignof.h.orig  2009-05-31 21:40:34.000000000 +0200
--- lib/alignof.h       2009-05-31 21:40:31.000000000 +0200
***************
*** 20,33 ****
  
  #include <stddef.h>
  
! /* Determine the alignment of a type at compile time.  */
! #if defined __GNUC__
! # define alignof __alignof__
! #elif defined __cplusplus
    template <class type> struct alignof_helper { char __slot1; type __slot2; };
! # define alignof(type) offsetof (alignof_helper<type>, __slot2)
  #else
! # define alignof(type) offsetof (struct { char __slot1; type __slot2; }, 
__slot2)
  #endif
  
  #endif /* _ALIGNOF_H */
--- 20,48 ----
  
  #include <stddef.h>
  
! /* Determine the alignment of a structure slot (field) of a given type,
!    at compile time.  Note that the result depends on the ABI.  */
! #if defined __cplusplus
    template <class type> struct alignof_helper { char __slot1; type __slot2; };
! # define alignof_slot(type) offsetof (alignof_helper<type>, __slot2)
! #else
! # define alignof_slot(type) offsetof (struct { char __slot1; type __slot2; }, 
__slot2)
! #endif
! 
! /* Determine the good alignment of a object of the given type at compile time.
!    Note that this is not necessarily the same as alignof_slot(type).
!    For example, with GNU C on x86 platforms: alignof_type(double) = 8, but
!    - when -malign-double is not specified:  alignof_slot(double) = 4,
!    - when -malign-double is specified:      alignof_slot(double) = 8.  */
! #if defined __GNUC__
! # define alignof_type __alignof__
  #else
! # define alignof_type alignof_slot
  #endif
  
+ /* alignof is an alias for alignof_slot semantics, since that's what most
+    callers need.
+    Note: The result cannot be used as a value for an 'enum' constant,  */
+ #define alignof alignof_slot
+ 
  #endif /* _ALIGNOF_H */
*** tests/test-alignof.c.orig   2009-05-31 21:40:34.000000000 +0200
--- tests/test-alignof.c        2009-05-31 21:36:09.000000000 +0200
***************
*** 31,37 ****
  
  #define CHECK(type) \
    typedef struct { char slot1; type slot2; } type##_helper; \
!   verify (alignof (type) == offsetof (type##_helper, slot2));
  
  CHECK (char)
  CHECK (short)
--- 31,39 ----
  
  #define CHECK(type) \
    typedef struct { char slot1; type slot2; } type##_helper; \
!   verify (alignof_slot (type) == offsetof (type##_helper, slot2)); \
!   const int type##_slot_alignment = alignof_slot (type); \
!   const int type##_type_alignment = alignof_type (type);
  
  CHECK (char)
  CHECK (short)




reply via email to

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