Rust errors / Types and traits
Rust compiler error · checked with rustc 1.99.0
Rust error E0520: `fly` specializes an item from a parent `impl`, but that item is not marked `default`
What it meansA non-default implementation was already made on this type so it cannot be specialized further.
What rustc prints
error[E0520]: `fly` specializes an item from a parent `impl`, but that item is not marked `default` --> main.rs:20:5 | 14 | impl<T: Clone> SpaceLlama for T { | ------------------------------- parent `impl` is here ... 20 | default fn fly(&self) {} | ^^^^^^^^^^^^^^^^^^^^^ cannot specialize default item `fly` | = note: to specialize, `fly` in the parent `impl` must be marked `default`
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
A non-default implementation was already made on this type so it cannot be specialized further.
Erroneous code example:
#![feature(specialization)]
trait SpaceLlama {
fn fly(&self);
}
// applies to all T
impl<T> SpaceLlama for T {
default fn fly(&self) {}
}
// non-default impl
// applies to all `Clone` T and overrides the previous impl
impl<T: Clone> SpaceLlama for T {
fn fly(&self) {}
}
// since `i32` is clone, this conflicts with the previous implementation
impl SpaceLlama for i32 {
default fn fly(&self) {}
// error: item `fly` is provided by an `impl` that specializes
// another, but the item in the parent `impl` is not marked
// `default` and so it cannot be specialized.
}
Specialization only allows you to override default functions in implementations.
To fix this error, you need to mark all the parent implementations as default. Example:
#![feature(specialization)]
trait SpaceLlama {
fn fly(&self);
}
// applies to all T
impl<T> SpaceLlama for T {
default fn fly(&self) {} // This is a parent implementation.
}
// applies to all `Clone` T; overrides the previous impl
impl<T: Clone> SpaceLlama for T {
default fn fly(&self) {} // This is a parent implementation but was
// previously not a default one, causing the error
}
// applies to i32, overrides the previous two impls
impl SpaceLlama for i32 {
fn fly(&self) {} // And now that's ok!
}From rustc --explain E0520 (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
- E0449visibility qualifiers are not permitted here
- E0512cannot transmute between types of different sizes, or dependently-sized types
- E0525expected a closure that implements the `Fn` trait, but this closure only implements `FnOnce`
- E0529expected an array or slice, found `f32`
Up next
Often hit nextE0308: mismatched typesA related error from the same family.Read it next →Did this answer your question?