------- Comment #5 from rguenth at gcc dot gnu dot org 2009-11-21 17:29 ------- static inline void put_unaligned_uint64(void *p, uint64_t datum) { struct { uint64_t d; } __attribute__((packed)) *pp = p;
pp->d = datum; } int iax_ie_append_versioned_uint64(struct iax_ie_data *ied, unsigned char ie, unsigned char version, uint64_t value) { struct _local { unsigned char version; uint64_t value; } __attribute__((packed)) newval = { version, }; put_unaligned_uint64(&newval.value, htonll(value)); return iax_ie_append_raw(ied, ie, &newval, (int) sizeof(newval)); } This code accesses an object of type uint64_t via a pointer to a struct containing an uint64_t which is an alias violation. I don't see put_unaligned_uint32 being used, and only in the context of the use of put_unaligned_uint64 it is appearant to the compiler that you violate C aliasing rules. You probably instead want to use sth like typedef uint64_t __attribute__((aligned(1))) unaligned_uint64_t; static inline void put_unaligned_uint64(void *p, uint64_t datum) { unaligned_uint64_t *pp = p; *pp = datum; } -- rguenth at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- Status|WAITING |RESOLVED Resolution| |INVALID http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42103