------- Comment #11 from rguenther at suse dot de 2009-04-25 14:28 ------- Subject: Re: gcc-4.4 -Wstrict-aliasing and -Wstrict-aliasing=3 behaves like -Wstrict-aliasing=2 in gcc-4.3
On Sat, 25 Apr 2009, edwintorok at gmail dot com wrote: > ------- Comment #9 from edwintorok at gmail dot com 2009-04-25 14:22 ------- > (In reply to comment #6) > > No, not if it is inlined (and if not you can as well use memcpy). > > > > You can also do (GCC extension) > > > > union union_t { > > unsigned un; > > char c[4]; > > }; > > > > unsigned bar(char *x) > > { > > union union_t u; > > u.c[0] = x[0]; > > u.c[1] = x[1]; > > u.c[2] = x[2]; > > u.c[3] = x[3]; > > return u.un; > > } > > > > but that will even generate worse code with GCC than the > > memcpy (it's even horrible code). > > Hmm, looks like the only way out is for me to put #if defined(__GNUC__) && > (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) and use memcpy. > Either that or add a configure rule to add -fno-strict-aliasing. Another GCC extension is the following (this is what GCC 4.4 makes out of the memcpy very early during optimization) typedef unsigned __attribute__((may_alias,aligned(1))) my_unsigned; unsigned bar(char *x) { return *(my_unsigned *)x; } That should work with even ancient GCC (I checked 3.3) Richard. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39895