shuaiwang added a comment.

In https://reviews.llvm.org/D50883#1229297, @JonasToth wrote:

> >   Different from std::vector::operator[] which has two overloads for const 
> > and non-const access, std::unique_ptr only has one const version of 
> > `operator->`.
> > 
> > So for SmartPtr x; x->mf(); we only see a const operator being invoked on 
> > x. mf is not a member of SmartPtr and the member call to mf is not on x 
> > directly, we never followed that far.
>
> I think the `operator->` is transitively called, isn't it? (see andrei 
> alexandrescu talk here: https://youtu.be/ozOgzlxIsdg?t=15m55s where he gives 
> a nice class for generic locking)
>  Maybe there is something more general at work? I think @aaron.ballman knows 
> more about deeper language questions :)


Right, for `x->mf()` (where `x` is some kind of smart pointer), `operator->` is 
invoked on the smart pointer itself, and then that yields a (real) pointer, in 
which case the `operator->` magically reappears and is applied on the real 
pointer.
For now we're basically treating `SmartPtr::operator->()` the same as "taking 
the address of `Exp`", which is treated as immediately mutating `Exp`. The 
benefit of this approach is: when we're able to do `findPointeeMutation`, we'll 
be able to further follow the pointer and see whether the pointee is mutated, 
and we'll be able to distinguish between these two cases:

  struct Foo {
  void mf();
  void cmf() const;
  };
  std::unique_ptr<Foo> p;
  p->mf(); // mutates Foo
  p->cmf(); // doesn't mutate Foo, but is treated as mutation for now. Can be 
improved when we're able to do findPointeeMutation( <pointer returned by 
operator->() call on p> )


Repository:
  rCTE Clang Tools Extra

https://reviews.llvm.org/D50883



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to