https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102279
--- Comment #3 from Richard Earnshaw <rearnsha at gcc dot gnu.org> --- (In reply to Will from comment #2) > Thanks Richard! This is obviously a gap in my knowledge I need to fill in. The aliasing rules say (in essence) that a pointer to an object of type T1 cannot point to an object of type T2, unless one of the types is derived from char. It's defined so that the compiler can safely move loads and stores to different types around when optimizing in order to generate more efficient code.