62 lines
1008 B
Rust
62 lines
1008 B
Rust
// run-pass
|
|
// Test that we can use method notation to call methods based on a
|
|
// projection bound from a trait. Issue #20469.
|
|
|
|
trait MakeString {
|
|
fn make_string(&self) -> String;
|
|
}
|
|
|
|
impl MakeString for isize {
|
|
fn make_string(&self) -> String {
|
|
format!("{}", *self)
|
|
}
|
|
}
|
|
|
|
impl MakeString for usize {
|
|
fn make_string(&self) -> String {
|
|
format!("{}", *self)
|
|
}
|
|
}
|
|
|
|
trait Foo {
|
|
type F: MakeString;
|
|
|
|
fn get(&self) -> &Self::F;
|
|
}
|
|
|
|
fn foo<F:Foo>(f: &F) -> String {
|
|
f.get().make_string()
|
|
}
|
|
|
|
struct SomeStruct {
|
|
field: isize,
|
|
}
|
|
|
|
impl Foo for SomeStruct {
|
|
type F = isize;
|
|
|
|
fn get(&self) -> &isize {
|
|
&self.field
|
|
}
|
|
}
|
|
|
|
struct SomeOtherStruct {
|
|
field: usize,
|
|
}
|
|
|
|
impl Foo for SomeOtherStruct {
|
|
type F = usize;
|
|
|
|
fn get(&self) -> &usize {
|
|
&self.field
|
|
}
|
|
}
|
|
|
|
fn main() {
|
|
let x = SomeStruct { field: 22 };
|
|
assert_eq!(foo(&x), format!("22"));
|
|
|
|
let x = SomeOtherStruct { field: 44 };
|
|
assert_eq!(foo(&x), format!("44"));
|
|
}
|