pub static DEREF_INTO_DYN_SUPERTRAIT: &Lint
Expand description
The deref_into_dyn_supertrait
lint is emitted whenever there is a Deref
implementation
for dyn SubTrait
with a dyn SuperTrait
type as the Output
type.
These implementations are “shadowed” by trait upcasting (stabilized since
1.86.0). The deref
functions is no longer called implicitly, which might
change behavior compared to previous rustc versions.
§Example
ⓘ
#![deny(deref_into_dyn_supertrait)]
#![allow(dead_code)]
use core::ops::Deref;
trait A {}
trait B: A {}
impl<'a> Deref for dyn 'a + B {
type Target = dyn A;
fn deref(&self) -> &Self::Target {
todo!()
}
}
fn take_a(_: &dyn A) { }
fn take_b(b: &dyn B) {
take_a(b);
}
{{produces}}
§Explanation
The trait upcasting coercion added a new coercion rule, taking priority over certain other
coercion rules, which causes some behavior change compared to older rustc
versions.
deref
can be still called explicitly, it just isn’t called as part of a deref coercion
(since trait upcasting coercion takes priority).