From 21df9c805f6e0101cff7a04391c6c5fcff8056df Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Mon, 22 Sep 2014 17:38:49 -0700 Subject: librustc: Give trait methods accessible via fewer autoderefs priority over inherent methods accessible via more autoderefs. This simplifies the trait matching algorithm. It breaks code like: impl Foo { fn foo(self) { // before this change, this will be called } } impl<'a,'b,'c> Trait for &'a &'b &'c Foo { fn foo(self) { // after this change, this will be called } } fn main() { let x = &(&(&Foo)); x.foo(); } To explicitly indicate that you wish to call the inherent method, perform explicit dereferences. For example: fn main() { let x = &(&(&Foo)); (***x).foo(); } Part of #17282. [breaking-change] --- src/libstd/io/mod.rs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) (limited to 'src/libstd') diff --git a/src/libstd/io/mod.rs b/src/libstd/io/mod.rs index ff508c802d8..81e05648567 100644 --- a/src/libstd/io/mod.rs +++ b/src/libstd/io/mod.rs @@ -946,11 +946,14 @@ pub trait Reader { } impl<'a> Reader for Box { - fn read(&mut self, buf: &mut [u8]) -> IoResult { self.read(buf) } + fn read(&mut self, buf: &mut [u8]) -> IoResult { + let reader: &mut Reader = &mut **self; + reader.read(buf) + } } impl<'a> Reader for &'a mut Reader+'a { - fn read(&mut self, buf: &mut [u8]) -> IoResult { self.read(buf) } + fn read(&mut self, buf: &mut [u8]) -> IoResult { (*self).read(buf) } } /// Returns a slice of `v` between `start` and `end`. @@ -1281,10 +1284,14 @@ pub trait Writer { impl<'a> Writer for Box { #[inline] - fn write(&mut self, buf: &[u8]) -> IoResult<()> { self.write(buf) } + fn write(&mut self, buf: &[u8]) -> IoResult<()> { + (&mut **self).write(buf) + } #[inline] - fn flush(&mut self) -> IoResult<()> { self.flush() } + fn flush(&mut self) -> IoResult<()> { + (&mut **self).flush() + } } impl<'a> Writer for &'a mut Writer+'a { -- cgit 1.4.1-3-g733a5