43 lines
1.0 KiB
Rust
43 lines
1.0 KiB
Rust
|
//! 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() {}
|