| //@ run-pass |
| |
| #![feature(fn_delegation)] |
| #![allow(incomplete_features)] |
| |
| trait Trait { |
| fn bar(&self, x: i32) -> i32 { x } |
| fn description(&self) -> &str { |
| "hello world!" |
| } |
| fn static_method(x: i32) -> i32 { x } |
| fn static_method2(x: i32, y: i32) -> i32 { x + y } |
| } |
| |
| struct F; |
| impl Trait for F {} |
| |
| mod to_reuse { |
| pub fn foo(x: i32) -> i32 { x + 1 } |
| pub fn zero_args() -> i32 { 15 } |
| } |
| |
| reuse to_reuse::zero_args { self } |
| |
| struct S(F); |
| impl Trait for S { |
| reuse Trait::bar { self.0 } |
| reuse Trait::description { self.0 } |
| reuse <F as Trait>::static_method; |
| reuse <F as Trait>::static_method2 { S::static_method(self) } |
| } |
| |
| impl S { |
| reuse <F as Trait>::static_method { to_reuse::foo(self) } |
| } |
| |
| impl std::fmt::Display for S { |
| reuse <str as std::fmt::Display>::fmt { self.description() } |
| } |
| |
| fn main() { |
| let s = S(F); |
| assert_eq!(42, s.bar(42)); |
| assert_eq!("hello world!", format!("{s}")); |
| assert_eq!(43, S::static_method(42)); |
| assert_eq!(42, <S as Trait>::static_method(42)); |
| assert_eq!(21, S::static_method2(10, 10)); |
| |
| #[inline] |
| reuse to_reuse::foo; |
| assert_eq!(43, foo(42)); |
| assert_eq!(15, zero_args()); |
| } |