https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61447
Bug ID: 61447
Summary: _Alignof returns incorrect results for some
types/archs
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: bugdal at aerifal dot cx
_Alignof is defined per C11 as the "alignment requirement of its operand type".
This is different from GCC's result for __alignof__ (and sometimes for
_Alignof) where it returns the "preferred alignment for optimization" or the
"actual alignment applied".
On i386, _Alignof(long long) returns 8, despite the correct value being 4. With
recent enough gcc (tested on 4.9.0), -std=c11 fixes _Alignof when applied to
the type name, but not when applied to an object: long long x; _Alignof(x)
still gives 8. In order to be correct:
1. _Alignof(object) should always be the same as _Alignof(__typeof__(object))
2. _Alignof(x) should always be the same as (sizeof(struct{char __a;
__typeof__(x) __b;}) - sizeof(x))
Failure of condition 2 results in observably incorrect behavior: a program can
observe the existence of a structure containing members a and b of the same
type where (char*)&foo.a-(char*)&foo.b is not a multiple of _Alignof(foo.a).