https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103040
--- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Yeah, I've tried that through: struct S { S () : x (0) { impl = this; } int x; S *impl; ~S () {} }; S foo () { S ret; return ret; } S bar () { return S (); } int main () { S a = foo (); S b = bar (); if (a.impl != &a || b.impl != &b) __builtin_abort (); } but for C++ we don't miscompile that, though indeed starting with the above mentioned commit at -O1 ealias info changes: -ESCAPED = &a -ESCAPED = &b -ESCAPED = { ESCAPED NONLOCAL a b } +ESCAPED = { } -a = { ESCAPED NONLOCAL a } same as _1 -b = { ESCAPED NONLOCAL b } same as _2 +a = { NONLOCAL a } same as _1 +b = { NONLOCAL b } same as _2 -_1 = { ESCAPED NONLOCAL a } -_2 = { ESCAPED NONLOCAL b } +_1 = { NONLOCAL a } +_2 = { NONLOCAL b } -ESCAPED, points-to non-local, points-to vars: { D.2419 D.2421 } (escaped) +ESCAPED, points-to vars: { } -_1, points-to non-local, points-to escaped, points-to NULL, points-to vars: { D.2419 } (escaped) -_2, points-to non-local, points-to escaped, points-to NULL, points-to vars: { D.2421 } (escaped) +_1, points-to non-local, points-to NULL, points-to vars: { D.2419 } +_2, points-to non-local, points-to NULL, points-to vars: { D.2421 }