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 }

Reply via email to