https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79216
--- Comment #7 from Eric Botcazou <ebotcazou at gcc dot gnu.org> --- > As in, I would expect that: > > struct foo __attribute__((scalar_storage_order("big-endian"))) > { > uint32_t bar; > } foo; > > uint32_t *baz = &foo.bar; > > ... would give an error on a littleendian architecture and a warning on a > bigendian architecture, however, at this point it seems to be completely > quiet about it. Well, the above code doesn't even compile, so please post compilable stuff. For example: struct __attribute__((scalar_storage_order("big-endian"))) S1 { int i; }; struct __attribute__((scalar_storage_order("little-endian"))) S2 { int i; }; int *addr1 (int which, struct S1 *s1, struct S2 *s2) { return (which == 1 ? &s1->i : &s2->i); } eric@polaris:~/build/gcc/native> gcc/xgcc -Bgcc -S sso-2.c sso-2.c: In function 'addr1': sso-2.c:13:24: error: cannot take address of scalar with reverse storage order return (which == 1 ? &s1->i : &s2->i); ^ > Finally, the section in the manual about type-punning in the presence of > this attribute is very opaque to me. I am not sure what it means is allowed > or disallowed, or how things would work in the presence of casts. Everything works if you don't try to toggle the storage order.