| //@ pretty-compare-only | |
| //@ pretty-mode:hir | |
| //@ pp-exact:generics.pp | |
| #![allow(incomplete_features)] | |
| #![attr = Feature([fn_delegation#0])] | |
| extern crate std; | |
| #[attr = PreludeImport] | |
| use ::std::prelude::rust_2015::*; | |
| mod free_to_trait { | |
| trait Trait<'a, XX, Y, T = (), const N: usize = 2> { | |
| fn method<A, B>(&self, t: (T, A, B), slice: &'_ [usize; N]) { } | |
| fn r#static<A, B>(t: (T, A, B), slice: &'_ [usize; N]) { } | |
| } | |
| struct X; | |
| impl <XX, Y, T, const N: usize> Trait<'_, XX, Y, T, N> for X { } | |
| // When infer is specified for default parameter the generic param is generated. | |
| #[attr = Inline(Hint)] | |
| fn foo<'a, Self, XX, Y, T, const N: _, A, B>(self: _, arg1: _, arg2: _) | |
| -> _ where | |
| 'a:'a { | |
| <Self as Trait::<'a, XX, Y, T, N>>::method::<A, B>(self, arg1, arg2) | |
| } | |
| #[attr = Inline(Hint)] | |
| fn static_foo<'a, Self, XX, Y, T, const N: _, A, B>(arg0: _, arg1: _) -> _ | |
| where | |
| 'a:'a { | |
| <Self as Trait::<'a, XX, Y, T, N>>::r#static::<A, B>(arg0, arg1) | |
| } | |
| // When default params are omitted they are not generated but used in signature inheritance. | |
| #[attr = Inline(Hint)] | |
| fn bar<'a, Self, XX, Y, A, B>(self: _, arg1: _, arg2: _) -> _ where | |
| 'a:'a { | |
| <Self as Trait::<'a, XX, Y>>::method::<A, B>(self, arg1, arg2) | |
| } | |
| #[attr = Inline(Hint)] | |
| fn static_bar<'a, Self, XX, Y, A, B>(arg0: _, arg1: _) -> _ where | |
| 'a:'a { <Self as Trait::<'a, XX, Y>>::r#static::<A, B>(arg0, arg1) } | |
| // Check with user specified args in child: | |
| // When infer is specified for default parameter the generic param is generated. | |
| #[attr = Inline(Hint)] | |
| fn foo1<'a, Self, XX, Y, T, const N: _, B>(self: _, arg1: _, arg2: _) -> _ | |
| where | |
| 'a:'a { | |
| <Self as Trait::<'a, XX, Y, T, N>>::method::<(), B>(self, arg1, arg2) | |
| } | |
| #[attr = Inline(Hint)] | |
| fn static_foo1<'a, Self, XX, Y, T, const N: _, B>(arg0: _, arg1: _) -> _ | |
| where | |
| 'a:'a { | |
| <Self as Trait::<'a, XX, Y, T, N>>::r#static::<(), B>(arg0, arg1) | |
| } | |
| // When default params are omitted they are not generated but used in signature inheritance. | |
| #[attr = Inline(Hint)] | |
| fn bar1<'a, Self, XX, Y, A>(self: _, arg1: _, arg2: _) -> _ where | |
| 'a:'a { | |
| <Self as Trait::<'a, XX, Y>>::method::<A, ()>(self, arg1, arg2) | |
| } | |
| #[attr = Inline(Hint)] | |
| fn static_bar1<'a, Self, XX, Y, A>(arg0: _, arg1: _) -> _ where | |
| 'a:'a { <Self as Trait::<'a, XX, Y>>::r#static::<A, ()>(arg0, arg1) } | |
| // Check with explicit self type. | |
| #[attr = Inline(Hint)] | |
| fn foo2<'a, XX, Y, T, const N: _, A, B>(self: _, arg1: _, arg2: _) -> _ | |
| where | |
| 'a:'a { | |
| <X as Trait::<'a, XX, Y, T, N>>::method::<A, B>(self, arg1, arg2) | |
| } | |
| #[attr = Inline(Hint)] | |
| fn static_foo2<'a, XX, Y, T, const N: _, A, B>(arg0: _, arg1: _) -> _ | |
| where | |
| 'a:'a { | |
| <X as Trait::<'a, XX, Y, T, N>>::r#static::<A, B>(arg0, arg1) | |
| } | |
| #[attr = Inline(Hint)] | |
| fn bar2<'a, XX, Y, A, B>(self: _, arg1: _, arg2: _) -> _ where | |
| 'a:'a { <X as Trait::<'a, XX, Y>>::method::<A, B>(self, arg1, arg2) } | |
| #[attr = Inline(Hint)] | |
| fn static_bar2<'a, XX, Y, A, B>(arg0: _, arg1: _) -> _ where | |
| 'a:'a { <X as Trait::<'a, XX, Y>>::r#static::<A, B>(arg0, arg1) } | |
| #[attr = Inline(Hint)] | |
| fn foo3<'a, XX, Y, T, const N: _, B>(self: _, arg1: _, arg2: _) -> _ where | |
| 'a:'a { | |
| <X as Trait::<'a, XX, Y, T, N>>::method::<(), B>(self, arg1, arg2) | |
| } | |
| #[attr = Inline(Hint)] | |
| fn static_foo3<'a, XX, Y, T, const N: _, B>(arg0: _, arg1: _) -> _ where | |
| 'a:'a { | |
| <X as Trait::<'a, XX, Y, T, N>>::r#static::<(), B>(arg0, arg1) | |
| } | |
| #[attr = Inline(Hint)] | |
| fn bar3<'a, XX, Y, A>(self: _, arg1: _, arg2: _) -> _ where | |
| 'a:'a { <X as Trait::<'a, XX, Y>>::method::<A, ()>(self, arg1, arg2) } | |
| #[attr = Inline(Hint)] | |
| fn static_bar3<'a, XX, Y, A>(arg0: _, arg1: _) -> _ where | |
| 'a:'a { <X as Trait::<'a, XX, Y>>::r#static::<A, ()>(arg0, arg1) } | |
| } | |
| mod trait_impl_to_trait { | |
| trait Trait<'a, X, Y, T = (), const N: usize = 2> { | |
| fn foo(&self, t: (T, T, T), slice: &'_ [usize; N]) { } | |
| fn bar(&self, t: (T, T, T), slice: &'_ [usize; N]) { } | |
| } | |
| struct S; | |
| impl <X, Y> Trait<'_, X, Y> for S { } | |
| struct W(S); | |
| impl <X, Y> Trait<'_, X, Y> for W { | |
| // Generics of both methods match generics of their signature | |
| // functions in `Trait` declaration, no matter specified infers. | |
| #[attr = Inline(Hint)] | |
| fn foo(self: _, arg1: _, arg2: _) | |
| -> _ { Trait::<'static, X, Y>::foo(self.0, arg1, arg2) } | |
| #[attr = Inline(Hint)] | |
| fn bar(self: _, arg1: _, arg2: _) | |
| -> _ { Trait::<'static, X, Y, _, _>::foo(self.0, arg1, arg2) } | |
| } | |
| } | |
| fn main() { } |