Rust errors / Types and traits
Rust compiler error · checked with rustc 1.99.0
Rust error E0378: the trait `DispatchFromDyn` may only be implemented for structs containing the field being coerced, ZST fields with 1 byte alignment that don't mention type/const generics, and nothing else
What it meansThe DispatchFromDyn trait was implemented on something which is not a pointer or a newtype wrapper around a pointer.
What rustc prints
error[E0378]: the trait `DispatchFromDyn` may only be implemented for structs containing the field being coerced, ZST fields with 1 byte alignment that don't mention type/const generics, and nothing else --> main.rs:9:1 | 9 | / impl<T, U> DispatchFromDyn<WrapperExtraField<U>> for WrapperExtraField<T> 10 | | where 11 | | T: DispatchFromDyn<U>, | |__________________________^ | = note: extra field `extra_stuff` of type `i32` is not allowed
Real output of rustc 1.99.0 compiling the official example below (2021 edition). Your names and line numbers will differ; the first line is the part to match.
The compiler team's explanation
The DispatchFromDyn trait was implemented on something which is not a pointer or a newtype wrapper around a pointer.
Erroneous code example:
#![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.
#![feature(dispatch_from_dyn, unsize)]
use std::{
marker::Unsize,
ops::DispatchFromDyn,
};
struct Ptr<T: ?Sized>(*const T);
impl<T: ?Sized, U: ?Sized> DispatchFromDyn<Ptr<U>> for Ptr<T>
where
T: Unsize<U>,
{}
Another example:
#![feature(dispatch_from_dyn)]
use std::{
ops::DispatchFromDyn,
marker::PhantomData,
};
struct Wrapper<T> {
ptr: T,
_phantom: PhantomData<()>,
}
impl<T, U> DispatchFromDyn<Wrapper<U>> for Wrapper<T>
where
T: DispatchFromDyn<U>,
{}From rustc --explain E0378 (1.99.0), part of the Rust project, MIT or Apache-2.0. Official page.
Related errors
- E0308mismatched types
- E0277the trait bound is not satisfied
- E0599no method named X found in the current scope
- E0433failed to resolve
- E0375implementing `CoerceUnsized` does not allow multiple fields to be coerced
- E0377the trait `CoerceUnsized` may only be implemented for a coercion between structures
- E0379functions in traits cannot be declared const
- E0380auto traits cannot have associated items
Up next
Often hit nextE0308: mismatched typesA related error from the same family.Read it next →Did this answer your question?