| A type alias impl trait can only have its hidden type assigned | |
| when used fully generically (and within their defining scope). | |
| This means | |
| ```compile_fail,E0792 | |
| #![feature(type_alias_impl_trait)] | |
| type Foo<T> = impl std::fmt::Debug; | |
| #[define_opaque(Foo)] | |
| fn foo() -> Foo<u32> { | |
| 5u32 | |
| } | |
| ``` | |
| is not accepted. If it were accepted, one could create unsound situations like | |
| ```compile_fail,E0792 | |
| #![feature(type_alias_impl_trait)] | |
| type Foo<T> = impl Default; | |
| #[define_opaque(Foo)] | |
| fn foo() -> Foo<u32> { | |
| 5u32 | |
| } | |
| fn main() { | |
| let x = Foo::<&'static mut String>::default(); | |
| } | |
| ``` | |
| Instead you need to make the function generic: | |
| ``` | |
| #![feature(type_alias_impl_trait)] | |
| type Foo<T> = impl std::fmt::Debug; | |
| #[define_opaque(Foo)] | |
| fn foo<U>() -> Foo<U> { | |
| 5u32 | |
| } | |
| fn main() {} | |
| ``` | |
| This means that no matter the generic parameter to `foo`, | |
| the hidden type will always be `u32`. | |
| If you want to link the generic parameter to the hidden type, | |
| you can do that, too: | |
| ``` | |
| #![feature(type_alias_impl_trait)] | |
| use std::fmt::Debug; | |
| type Foo<T: Debug> = impl Debug; | |
| #[define_opaque(Foo)] | |
| fn foo<U: Debug>() -> Foo<U> { | |
| Vec::<U>::new() | |
| } | |
| fn main() {} | |
| ``` |