rust-lang/rustfmt

`--check` can overwrite files when `--config emit_mode=files` is used

Closed

#6,999 opened on Jul 30, 2026

 (3 comments) (1 reaction) (0 assignees)Rust (760 forks)batch import
A-cliA-ioC-buggood first issue

Repository metrics

Stars
 (4,893 stars)
PR merge metrics
 (Avg merge 67d) (5 merged PRs in 30d)

Description

Summary

--check can overwrite a source file when emit_mode=files is supplied through --config.

rustfmt --check --emit files <file> is correctly rejected as incompatible. However, the equivalent --config emit_mode=files bypasses that validation and causes rustfmt to format the file in place.

I tried to format this code:

fn main(){println!("hello");}

Expected behavior

I expected --check to be non-mutating regardless of the supplied configuration:

  • Leave file.rs unchanged.
  • Print a diff showing the required formatting.
  • Exit with status code 1.

Alternatively, rustfmt could reject the conflicting --check --config emit_mode=files combination, as it already rejects --check --emit files.

The help message from the cli:


Options:
        --check         Run in 'check' mode. Exits with 0 if input is
                        formatted correctly. Exits with 1 and prints a diff if
                        formatting is required.

Actual behaviour

Instead, rustfmt rewrote file.rs in place:

fn main() {
    println!("hello");
}

It printed nothing to stdout or stderr and exited with status code 0.

Configuration

rustfmt cli options used:

$ rustfmt --check --config emit_mode=files file.rs

rustfmt configuration file:

No rustfmt.toml or .rustfmt.toml file was present.

Reproduction Steps

  1. Create file.rs with this unformatted source:

    fn main(){println!("hello");}
    
  2. Optionally record its checksum:

    shasum -a 256 file.rs
    
  3. Run rustfmt in check mode with emit_mode=files supplied through inline configuration:

    rustfmt --check --config emit_mode=files file.rs
    
  4. Observe that rustfmt exits with status code 0, emits no diff, and rewrites file.rs.

  5. Compare its checksum or contents with the original file.

For comparison, this direct flag combination is rejected:

$ rustfmt --check --emit files file.rs
Invalid to use `--emit` and `--check`

Meta

rustfmt --version:

rustfmt 1.9.0-stable (ac68faa20c 2026-05-25)

I have not yet tested beta or nightly.

Contributor guide