From: Bruno Haible Date: Sun, 31 May 2009 19:43:32 +0000 (+0200) Subject: Fix test-alignof failure. X-Git-Tag: v0.1~5888 X-Git-Url: http://erislabs.net/gitweb/?a=commitdiff_plain;h=757fcfd1ef1892f1472c0712acdf8a2d4ec774da;p=gnulib.git Fix test-alignof failure. --- diff --git a/ChangeLog b/ChangeLog index aacc63af7..a8367d464 100644 --- 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 index 3752ef394..b09d0078e 100644 --- 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_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) offsetof (struct { char __slot1; type __slot2; }, __slot2) +# 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 index 851cbf092..73694aa5e 100644 --- a/tests/test-alignof.c +++ b/tests/test-alignof.c @@ -31,7 +31,9 @@ typedef struct { char a[4]; } struct4; #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)