Improve a TAIT error and add an error code plus documentation
This commit is contained in:
parent
41edaac716
commit
6b69b5e460
21 changed files with 147 additions and 84 deletions
|
@ -508,6 +508,7 @@ E0787: include_str!("./error_codes/E0787.md"),
|
|||
E0788: include_str!("./error_codes/E0788.md"),
|
||||
E0790: include_str!("./error_codes/E0790.md"),
|
||||
E0791: include_str!("./error_codes/E0791.md"),
|
||||
E0792: include_str!("./error_codes/E0792.md"),
|
||||
;
|
||||
// E0006, // merged with E0005
|
||||
// E0008, // cannot bind by-move into a pattern guard
|
||||
|
|
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()
|
||||
}
|
||||
```
|
Loading…
Add table
Add a link
Reference in a new issue