Improve a TAIT error and add an error code plus documentation
This commit is contained in:
60
compiler/rustc_error_codes/src/error_codes/E0792.md
Normal file
60
compiler/rustc_error_codes/src/error_codes/E0792.md
Normal file
@@ -0,0 +1,60 @@
|
||||
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;
|
||||
|
||||
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;
|
||||
|
||||
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;
|
||||
|
||||
fn foo<U>() -> Foo<U> {
|
||||
5u32
|
||||
}
|
||||
```
|
||||
|
||||
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;
|
||||
|
||||
fn foo<U: Debug>() -> Foo<U> {
|
||||
Vec::<U>::new()
|
||||
}
|
||||
```
|
||||
Reference in New Issue
Block a user