`--check` can overwrite files when `--config emit_mode=files` is used
#6,999 opened on Jul 30, 2026
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.rsunchanged. - 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
-
Create
file.rswith this unformatted source:fn main(){println!("hello");} -
Optionally record its checksum:
shasum -a 256 file.rs -
Run
rustfmtin check mode withemit_mode=filessupplied through inline configuration:rustfmt --check --config emit_mode=files file.rs -
Observe that
rustfmtexits with status code0, emits no diff, and rewritesfile.rs. -
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.