Skip to content

clippy::explicit_auto_deref incorrectly removes deref in referenced deref #12969

@wr7

Description

@wr7

Summary

clippy::explicit_auto_deref falsely triggers in expressions like &*foo. Its suggestion does not compile.

In this specific case, clippy::explicit_auto_deref should not trigger because clippy::needless_borrow already triggers and provides the correct suggestion.

This issue seems to be related to #9841

Lint Name

clippy::explicit_auto_deref

Reproducer

use std::ops::Deref;

struct Wrapper<T>(T);

impl<T> Deref for Wrapper<T> {
    type Target = T;

    fn deref(&self) -> &T {
        &self.0
    }
}

fn foo(_bar: &str) {}

fn main() {
    let wrapped_bar = Wrapper("");

    foo(&*wrapped_bar);
}

cargo clippy --fix attempts to change foo(&*wrapped_bar) into foo(wrapped_bar) which does not compile. The following is the output given:

after fixes were automatically applied the compiler reported errors within these files:

  * src/main.rs

This likely indicates a bug in either rustc or cargo itself,
and we would appreciate a bug report! You're likely to see
a number of compiler warnings after this message which cargo
attempted to fix but failed. If you could open an issue at
https://github.com/rust-lang/rust-clippy/issues
quoting the full output of this command we'd be very appreciative!
Note that you may be able to make some more progress in the near-term
fixing code with the `--broken-code` flag

The following errors were reported:
error[E0308]: mismatched types
  --> src/main.rs:18:9
   |
18 |     foo(wrapped_bar);
   |     --- ^^^^^^^^^^^ expected `&str`, found `Wrapper<&str>`
   |     |
   |     arguments to this function are incorrect
   |
   = note: expected reference `&str`
                 found struct `Wrapper<&str>`
note: function defined here
  --> src/main.rs:13:4
   |
13 | fn foo(_bar: &str) {}
   |    ^^^ ----------
help: consider borrowing here
   |
18 |     foo(&wrapped_bar);
   |         +

error: aborting due to 1 previous error

For more information about this error, try `rustc --explain E0308`.
Original diagnostics will follow.

warning: this expression creates a reference which is immediately dereferenced by the compiler
  --> src/main.rs:18:9
   |
18 |     foo(&*wrapped_bar);
   |         ^^^^^^^^^^^^^ help: change this to: `*wrapped_bar`
   |
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow
   = note: `#[warn(clippy::needless_borrow)]` on by default

warning: deref which would be done by auto-deref
  --> src/main.rs:18:9
   |
18 |     foo(&*wrapped_bar);
   |         ^^^^^^^^^^^^^ help: try: `wrapped_bar`
   |
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#explicit_auto_deref
   = note: `#[warn(clippy::explicit_auto_deref)]` on by default

warning: `bug_test` (bin "bug_test") generated 2 warnings (run `cargo clippy --fix --bin "bug_test"` to apply 2 suggestions)
warning: failed to automatically apply fixes suggested by rustc to crate `bug_test`

It seems that clippy::needless_borrow provides the correct suggestion which is to change the code to foo(*wrapped_bar) which does not give any warnings.

Version

No response

Additional Labels

@rustbot label +I-suggestion-causes-error

Metadata

Metadata

Assignees

No one assigned

    Labels

    C-bugCategory: Clippy is not doing the correct thingI-false-positiveIssue: The lint was triggered on code it shouldn't haveI-suggestion-causes-errorIssue: The suggestions provided by this Lint cause an ICE/error when applied

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions