mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-23 07:14:28 +00:00
clean up E0378 explanation
This commit is contained in:
parent
01a8b5f26e
commit
ba49ed01f0
@ -1,10 +1,28 @@
|
||||
The `DispatchFromDyn` trait was implemented on something which is not a pointer
|
||||
or a newtype wrapper around a pointer.
|
||||
|
||||
Erroneous code example:
|
||||
|
||||
```compile-fail,E0378
|
||||
#![feature(dispatch_from_dyn)]
|
||||
use std::ops::DispatchFromDyn;
|
||||
|
||||
struct WrapperExtraField<T> {
|
||||
ptr: T,
|
||||
extra_stuff: i32,
|
||||
}
|
||||
|
||||
impl<T, U> DispatchFromDyn<WrapperExtraField<U>> for WrapperExtraField<T>
|
||||
where
|
||||
T: DispatchFromDyn<U>,
|
||||
{}
|
||||
```
|
||||
|
||||
The `DispatchFromDyn` trait currently can only be implemented for
|
||||
builtin pointer types and structs that are newtype wrappers around them
|
||||
— that is, the struct must have only one field (except for`PhantomData`),
|
||||
and that field must itself implement `DispatchFromDyn`.
|
||||
|
||||
Examples:
|
||||
|
||||
```
|
||||
#![feature(dispatch_from_dyn, unsize)]
|
||||
use std::{
|
||||
@ -20,6 +38,8 @@ where
|
||||
{}
|
||||
```
|
||||
|
||||
Another example:
|
||||
|
||||
```
|
||||
#![feature(dispatch_from_dyn)]
|
||||
use std::{
|
||||
@ -37,21 +57,3 @@ where
|
||||
T: DispatchFromDyn<U>,
|
||||
{}
|
||||
```
|
||||
|
||||
Example of illegal `DispatchFromDyn` implementation
|
||||
(illegal because of extra field)
|
||||
|
||||
```compile-fail,E0378
|
||||
#![feature(dispatch_from_dyn)]
|
||||
use std::ops::DispatchFromDyn;
|
||||
|
||||
struct WrapperExtraField<T> {
|
||||
ptr: T,
|
||||
extra_stuff: i32,
|
||||
}
|
||||
|
||||
impl<T, U> DispatchFromDyn<WrapperExtraField<U>> for WrapperExtraField<T>
|
||||
where
|
||||
T: DispatchFromDyn<U>,
|
||||
{}
|
||||
```
|
||||
|
Loading…
Reference in New Issue
Block a user