Summary
A common pattern in Rust is forwarding the members of an enum to their inner implementation:
impl Display for FetchUrl {
fn fmt(&self, f: &mut Formatter) -> std::fmt::Result {
match self {
Self::Index(index) => Display::fmt(index, f),
Self::Realm(realm) => Display::fmt(realm, f),
}
}
}
impl Debug for OptionSet {
fn fmt(&self, f: &mut Formatter) -> std::fmt::Result {
Display::fmt(self, f)
}
}
We use the fully-qualified Display::fmt or Debug::fmt to avoid ambiguity over which trait's method we are calling.
When using the same pattern for Deref on nightly, explicit_deref_methods triggers:
impl Deref for SyncEnvironment {
type Target = PythonEnvironment;
fn deref(&self) -> &Self::Target {
match self {
Self::Project(environment) => Deref::deref(environment),
Self::Script(environment) => Deref::deref(environment),
}
}
}
The lint description says:
This lint excludes all of:
let _ = d.unwrap().deref();
let _ = Foo::deref(&foo);
let _ = <Foo as Deref>::deref(&foo);
Maybe this should be extended to Deref::deref, especially in Deref impls?
Lint Name
explicit_deref_methods
Reproducer
I tried this code:
impl Deref for SyncEnvironment {
type Target = PythonEnvironment;
fn deref(&self) -> &Self::Target {
match self {
Self::Project(environment) => Deref::deref(environment),
Self::Script(environment) => Deref::deref(environment),
}
}
}
I saw this happen:
warning: explicit `deref` method call
--> crates/uv/src/commands/project/sync.rs:549:42
|
549 | Self::Script(environment) => Deref::deref(environment),
| ^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&**environment`
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#explicit_deref_methods
= note: `-W clippy::explicit-deref-methods` implied by `-W clippy::pedantic`
= help: to override `-W clippy::pedantic` add `#[allow(clippy::explicit_deref_methods)]`
I expected to see this happen:
No error.
Version
rustc 1.90.0-nightly (4b55fe199 2025-08-01)
binary: rustc
commit-hash: 4b55fe199cfe9c710555a5af7f2a49491ad38254
commit-date: 2025-08-01
host: x86_64-unknown-linux-gnu
release: 1.90.0-nightly
LLVM version: 20.1.8
Additional Labels
No response
Summary
A common pattern in Rust is forwarding the members of an enum to their inner implementation:
We use the fully-qualified
Display::fmtorDebug::fmtto avoid ambiguity over which trait's method we are calling.When using the same pattern for
Derefon nightly,explicit_deref_methodstriggers:The lint description says:
Maybe this should be extended to
Deref::deref, especially inDerefimpls?Lint Name
explicit_deref_methods
Reproducer
I tried this code:
I saw this happen:
I expected to see this happen:
No error.
Version
Additional Labels
No response