# HG changeset patch # User Bruno Haible # Date 1243799012 -7200 # Node ID 9ef2eb4b8fe1bd00ec7e79b6441c901948d19d93 # Parent 58b1732d052a5d65b25c16de04fff5a4d01b45ba Fix test-alignof failure. diff --git a/ChangeLog b/ChangeLog --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2009-05-31 Simon Josefsson + Bruno Haible + + 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. + 2009-05-31 Bruno Haible * tests/zerosize-ptr.h (zerosize_ptr): Specify more details. diff --git a/lib/alignof.h b/lib/alignof.h --- a/lib/alignof.h +++ b/lib/alignof.h @@ -20,14 +20,29 @@ #include -/* Determine the alignment of a type at compile time. */ -#if defined __GNUC__ -# define alignof __alignof__ -#elif defined __cplusplus +/* 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 struct alignof_helper { char __slot1; type __slot2; }; -# define alignof(type) offsetof (alignof_helper, __slot2) +# define alignof_slot(type) offsetof (alignof_helper, __slot2) #else -# define alignof(type) offsetof (struct { char __slot1; type __slot2; }, __slot2) +# 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 */ diff --git a/tests/test-alignof.c b/tests/test-alignof.c --- a/tests/test-alignof.c +++ b/tests/test-alignof.c @@ -31,7 +31,9 @@ #define CHECK(type) \ typedef struct { char slot1; type slot2; } type##_helper; \ - verify (alignof (type) == offsetof (type##_helper, slot2)); + 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)