| //! Test that opaque types only pick up methods from traits in their bounds | |
| //! if the trait is imported. | |
| //! | |
| //! FIXME: always look through the bounds of an opaque type to see if there are | |
| //! methods that could be called on any of the bound traits, irrespective of | |
| //! imported traits. | |
| //@ revisions: import no_import | |
| //@[import] check-pass | |
| #[cfg(import)] | |
| use std::fmt::Debug as _; | |
| fn foo(f: &mut std::fmt::Formatter<'_>) -> impl std::fmt::Debug { | |
| if false { | |
| let x = foo(f); | |
| x.fmt(f); | |
| //[no_import]~^ ERROR: no method named `fmt` found | |
| } | |
| () | |
| } | |
| fn foo1(f: &mut std::fmt::Formatter<'_>) -> impl std::fmt::Debug { | |
| if false { | |
| let x = &mut foo(f); | |
| x.fmt(f); | |
| //[no_import]~^ ERROR: no method named `fmt` found | |
| } | |
| () | |
| } | |
| // inconsistent with this | |
| fn bar<T>(t: impl std::fmt::Debug, f: &mut std::fmt::Formatter<'_>) { | |
| t.fmt(f); | |
| } | |
| // and the desugared version, of course | |
| fn baz<T: std::fmt::Debug>(t: T, f: &mut std::fmt::Formatter<'_>) { | |
| t.fmt(f); | |
| } | |
| fn main() {} |