https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109443

--- Comment #13 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
(In reply to Richard Biener from comment #12)
> Note maybe the restrict qualification isn't the best representation since
> it doesn't capture the value will die upon function return (does it?  I
> gues the DTOR if any will run in caller context and thus stores to it
> are not necessarily "dead").

Yes, the dtors will be invoked by the caller and those can inspect the values
and do all kinds of things with them.
In fact, the restrict isn't probably right either, the constructor of the
object in the caller could legally save the address of the object somewhere
else (say global pointer,
or inside of the object, or wherever else) and as long as say the destructor
undoes that, it could be valid.

Something like:

struct S {
  static bool enabled;
  static S *p;
  S () : s (0) {}
  ~S () { if (enabled) p = nullptr; }
  S (const S &x) : s (x.s) { if (enabled) p = this; }
  int s;
};

[[gnu::noipa]] void
bar (S s)
{
  s.s++;
  S::p->s = 0;
  s.s++;
}

void
foo ()
{
  S s;
  S::enabled = true;
  bar (s);
}

Reply via email to