------- Comment #72 from rguenth at gcc dot gnu dot org 2007-05-16 14:49 ------- inline void* operator new(unsigned long, void* __p) throw() { return __p; }
extern void bar(); float foo(double *p) { long *l = (long *)p; *l = 1; float *f = new (p) float; *f = 0.0; bar (); return *f; } with -O2 I see <bb 2>: l_2 = (long int *) p_1(D); # SMT.4_12 = VDEF <SMT.4_11(D)> *l_2 = 1; <<<change_dynamic_type (float *) p_1(D))>>> __p_8 = p_1(D); f_5 = (float *) __p_8; # SMT.5_14 = VDEF <SMT.5_13(D)> *f_5 = 0.0; # SMT.4_15 = VDEF <SMT.4_12> # SMT.5_16 = VDEF <SMT.5_14> bar (); # VUSE <SMT.5_16> D.2462_6 = *f_5; return D.2462_6; which looks wrong - the store to f_5 needs to alias *l_2? -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29286