| //@ run-pass |
| #![allow(unused_variables)] |
| #![allow(unused_imports)] |
| // Test that we don't trigger on the blanket impl for all `&'a T` but |
| // rather keep autoderefing and trigger on the underlying impl. To |
| // know not to stop at the blanket, we have to recursively evaluate |
| // the `T:Foo` bound. |
| |
| //@ pretty-expanded FIXME #23616 |
| |
| use std::marker::Sized; |
| |
| // Note: this must be generic for the problem to show up |
| trait Foo<A> { //~ WARN trait `Foo` is never used |
| fn foo(&self, a: A); |
| } |
| |
| impl Foo<u8> for [u8] { |
| fn foo(&self, a: u8) {} |
| } |
| |
| impl<'a, A, T> Foo<A> for &'a T where T: Foo<A> { |
| fn foo(&self, a: A) { |
| Foo::foo(*self, a) |
| } |
| } |
| |
| trait Bar { |
| fn foo(&self); |
| } |
| |
| struct MyType; |
| |
| impl Bar for MyType { |
| fn foo(&self) {} |
| } |
| |
| fn main() { |
| let mut m = MyType; |
| (&mut m).foo() |
| } |