Skip to content

disallowed-methods auto-fixes are unreliable #15067

Open
@TomFryersMidsummer

Description

@TomFryersMidsummer

Summary

It seems that disallowed-methods' replacement is pasted in as an opaque string, which stops it working for different method call syntaxes.

Reproducer

I tried this code:

// src/main.rs
fn main() {
    let x: f64 = 5.0;
    _ = x.round();
}
# clippy.toml
disallowed-methods = [{ path = "f64::round", replacement = "f64::round_ties_even" }]
# Cargo.toml
[package]
name = "foo"
edition = "2024"
cargo clippy --fix --allow-no-vcs

I expected to see this happen:

.round replaced with .round_ties_even.

Instead, this happened:

Clippy tries to produce _ = x.f64::round_ties_even(); and then gets upset. Click for full error message.
    Checking foo v0.0.0 (/home/tom.fryers/clippytest)
warning: failed to automatically apply fixes suggested by rustc to crate `foo`

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: expected one of `(`, `.`, `;`, `?`, `else`, `}`, or an operator, found `::`
 --> src/main.rs:3:14
  |
3 |     _ = x.f64::round_ties_even();
  |              ^^ expected one of 7 possible tokens

error: aborting due to 1 previous error

Original diagnostics will follow.

warning: use of a disallowed method `f64::round`
 --> src/main.rs:3:11
  |
3 |     _ = x.round();
  |           ^^^^^ help: use: `f64::round_ties_even`
  |
  = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#disallowed_methods
  = note: `#[warn(clippy::disallowed_methods)]` on by default

warning: `foo` (bin "foo") generated 1 warning (run `cargo clippy --fix --bin "foo"` to apply 1 suggestion)
warning: failed to automatically apply fixes suggested by rustc to crate `foo`

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: expected one of `(`, `.`, `;`, `?`, `else`, `}`, or an operator, found `::`
 --> src/main.rs:3:14
  |
3 |     _ = x.f64::round_ties_even();
  |              ^^ expected one of 7 possible tokens

error: aborting due to 1 previous error

Original diagnostics will follow.

warning: `foo` (bin "foo" test) generated 1 warning (1 duplicate)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.12s

The replacement works fine if I qualify the method call:

    _ = f64::round(x);

It also works if I change replacement in clippy.toml to round_ties_even. But that breaks the qualified call.

Version

rustc 1.87.0 (17067e9ac 2025-05-09)
binary: rustc
commit-hash: 17067e9ac6d7ecb70e50f92c1944e545188d2359
commit-date: 2025-05-09
host: x86_64-unknown-linux-gnu
release: 1.87.0
LLVM version: 20.1.1

Additional Labels

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    C-bugCategory: Clippy is not doing the correct thingI-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