On Fri, May 18, 2018 at 09:57:42AM -0400, Jason Merrill wrote: > > But what is invalid on: > > struct S { int foo (S *); int a; } s { 2 }; > > int S::foo (S *x) > > { > > int b = this->a; > > x->a = 5; > > b += this->a; > > return b; > > } > > int main () > > { > > if (s.foo (&s) != 7) > > abort (); > > } > > > > I think if you make this a restrict pointer, this will be miscompiled. > > We're only talking about the 'this' pointer in a constructor, not a > normal member function like foo.
Oops, sorry, missed that. Make it then: struct S { S (S *); int a; } s (&s); S::S (S *s) { this->a = 2; s->a = 3; if (this->a != 3) abort (); } Or is it invalid to dereference s before it has been constructed? Jakub