http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58806
--- Comment #1 from Marc Glisse <glisse at gcc dot gnu.org> --- struct A { int i; double d; }; void g(double*); void f(){ A a; a.i=1; g(&a.d); if(a.i != 1) __builtin_abort(); } Here, I guess g is allowed to take its argument, cast it to char*, subtract offsetof(struct A, d), cast to A* and go modify ->i of that? It would be convenient to have a way to promise that g does no such thing, but that looks like a different type of promise than the one in comment #0. The example is derived from the use of a temporary object of a reference-counted type, where ideally all uses of the counter should disappear and the code be equivalent to: double d; g(&d);