On Wed, Apr 16, 2014 at 03:00:29PM -0700, zkamsler wrote:
> I meant that, since 'R' has been derefed by the time it gets to `RECONCILE`, `R` would be the same as `E`.
> 
> e.g.:
> ```
> struct Foo { ... }
> trait Bar {
>   fn consume(self) { ... }
> }
> impl Bar for Foo { ... }
> 
> // should be an error, unless Foo is Copy
> fn consume_foo(foo:&Foo) {
>   foo.consume();
> }
> ```
> 
> `METHOD-SEARCH` will deref `&Foo` to `Foo` (since that what `Bar` is defined on), and calls `RECONCILE(Foo, Bar, m)`. `E` will be `Foo`. `Foo <: Foo`, so case 1 applies.

Yes. This is all correct. However, what you are missing is that just
because method-search succeeds doesn't mean that all other type checks
succeed. The borrow checker would then later flag this as an error as
a move out of a borrowed location.