On Fri, May 18, 2018 at 9:53 AM, Jakub Jelinek <ja...@redhat.com> wrote: > On Fri, May 18, 2018 at 09:02:08AM -0400, Nathan Sidwell wrote: >> On 05/18/2018 08:53 AM, Marc Glisse wrote: >> >> > As long as you do not dereference ptr in the constructor, that shouldn't >> > contradict 'restrict'. The PR gives this quote from the standard: >> > >> > "During the construction of an object, if the value of the object or any >> > of its subobjects is accessed through a glvalue that is not obtained, >> > directly or indirectly, from the constructor’s this pointer, the value >> > of the object or subobject thus obtained is unspecified." >> > >> > which reads quite close to saying that 'this' is restrict. >> Indeed it is, thanks. >> >> what about comparisons to this? I thought restrict implied such a >> comparison was 'never the same'? >> >> ie. if the ctor was: >> selfie (selfie *ptr) : me (ptr==this ? 0 : ptr) {} > > 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. Jason