Weird fix in tuple-pattern
Closed this issue · 6 comments
When dealing with Reduce unused variable span, the fix keeps failing.
src:
let (mut var, unused_var) = (1, 2);
suggestion:
warning: unused variable: `var`
--> src/lib.rs:2:10
|
2 | let (mut var, unused_var) = (1, 2);
| ^^^^^^^ help: consider using `_var` instead
|
= note: #[warn(unused_variables)] on by default
warning: unused variable: `unused_var`
--> src/lib.rs:2:19
|
2 | let (mut var, unused_var) = (1, 2);
| ^^^^^^^^^^ help: consider using `_unused_var` instead
warning: variable does not need to be mutable
--> src/lib.rs:2:10
|
2 | let (mut var, unused_var) = (1, 2);
| ----^^^
| |
| help: remove this `mut`
|
= note: #[warn(unused_mut)] on by default
warning: function is never used: `main`
--> src/lib.rs:1:1
|
1 | fn main() {
| ^^^^^^^^^
|
= note: #[warn(dead_code)] on by default
fixed:
let (_varus_unused_var(1, 2);
NOTE: the failed fix occurs both in current unreduce_var_span
and reduced_var_span
after the PR.
Oh, wow, that is… horrible. Rustfix seems to mess up the byte indices for some reason. Can you quote the json output from rustc? Oh, no need, I saw the log contains it. I'll also build your PR branch locally to try and debug this.
{"message":{"children":[{"children":[],"code":null,"level":"note","message":"#[warn(unused_variables)] on by default","rendered":null,"spans":[]},{"children":[],"code":null,"level":"help","message":"consider using `_var` instead","rendered":null,"spans":[{"byte_end":28,"byte_start":21,"column_end":17,"column_start":10,"expansion":null,"file_name":"src/lib.rs","is_primary":true,"label":null,"line_end":2,"line_start":2,"suggested_replacement":"_var","text":[{"highlight_end":17,"highlight_start":10,"text":" let (mut var, unused_var) = (1, 2);"}]}]}],"code":{"code":"unused_variables","explanation":null},"level":"warning","message":"unused variable: `var`","rendered":"warning: unused variable: `var`\n --> src/lib.rs:2:10\n |\n2 | let (mut var, unused_var) = (1, 2);\n | ^^^^^^^ help: consider using `_var` instead\n |\n = note: #[warn(unused_variables)] on by default\n\n","spans":[{"byte_end":28,"byte_start":21,"column_end":17,"column_start":10,"expansion":null,"file_name":"src/lib.rs","is_primary":true,"label":null,"line_end":2,"line_start":2,"suggested_replacement":null,"text":[{"highlight_end":17,"highlight_start":10,"text":" let (mut var, unused_var) = (1, 2);"}]}]},"package_id":"tt 0.1.0 (path+file:///home/linux/tt)","reason":"compiler-message","target":{"crate_types":["lib"],"kind":["lib"],"name":"tt","src_path":"/home/linux/tt/src/lib.rs"}}
{"message":{"children":[{"children":[],"code":null,"level":"help","message":"consider using `_unused_var` instead","rendered":null,"spans":[{"byte_end":40,"byte_start":30,"column_end":29,"column_start":19,"expansion":null,"file_name":"src/lib.rs","is_primary":true,"label":null,"line_end":2,"line_start":2,"suggested_replacement":"_unused_var","text":[{"highlight_end":29,"highlight_start":19,"text":" let (mut var, unused_var) = (1, 2);"}]}]}],"code":{"code":"unused_variables","explanation":null},"level":"warning","message":"unused variable: `unused_var`","rendered":"warning: unused variable: `unused_var`\n --> src/lib.rs:2:19\n |\n2 | let (mut var, unused_var) = (1, 2);\n | ^^^^^^^^^^ help: consider using `_unused_var` instead\n\n","spans":[{"byte_end":40,"byte_start":30,"column_end":29,"column_start":19,"expansion":null,"file_name":"src/lib.rs","is_primary":true,"label":null,"line_end":2,"line_start":2,"suggested_replacement":null,"text":[{"highlight_end":29,"highlight_start":19,"text":" let (mut var, unused_var) = (1, 2);"}]}]},"package_id":"tt 0.1.0 (path+file:///home/arch/tt)","reason":"compiler-message","target":{"crate_types":["lib"],"kind":["lib"],"name":"tt","src_path":"/home/arch/tt/src/lib.rs"}}
{"message":{"children":[{"children":[],"code":null,"level":"note","message":"#[warn(unused_mut)] on by default","rendered":null,"spans":[]},{"children":[],"code":null,"level":"help","message":"remove this `mut`","rendered":null,"spans":[{"byte_end":25,"byte_start":21,"column_end":14,"column_start":10,"expansion":null,"file_name":"src/lib.rs","is_primary":true,"label":null,"line_end":2,"line_start":2,"suggested_replacement":"","text":[{"highlight_end":14,"highlight_start":10,"text":" let (mut var, unused_var) = (1, 2);"}]}]}],"code":{"code":"unused_mut","explanation":null},"level":"warning","message":"variable does not need to be mutable","rendered":"warning: variable does not need to be mutable\n --> src/lib.rs:2:10\n |\n2 | let (mut var, unused_var) = (1, 2);\n | ----^^^\n | |\n | help: remove this `mut`\n |\n = note: #[warn(unused_mut)] on by default\n\n","spans":[{"byte_end":28,"byte_start":21,"column_end":17,"column_start":10,"expansion":null,"file_name":"src/lib.rs","is_primary":true,"label":null,"line_end":2,"line_start":2,"suggested_replacement":null,"text":[{"highlight_end":17,"highlight_start":10,"text":" let (mut var, unused_var) = (1, 2);"}]}]},"package_id":"tt 0.1.0 (path+file:///home/arch/tt)","reason":"compiler-message","target":{"crate_types":["lib"],"kind":["lib"],"name":"tt","src_path":"/home/arch/tt/src/lib.rs"}}
{"message":{"children":[{"children":[],"code":null,"level":"note","message":"#[warn(dead_code)] on by default","rendered":null,"spans":[]}],"code":{"code":"dead_code","explanation":null},"level":"warning","message":"function is never used: `main`","rendered":"warning: function is never used: `main`\n --> src/lib.rs:1:1\n |\n1 | fn main() {\n | ^^^^^^^^^\n |\n = note: #[warn(dead_code)] on by default\n\n","spans":[{"byte_end":9,"byte_start":0,"column_end":10,"column_start":1,"expansion":null,"file_name":"src/lib.rs","is_primary":true,"label":null,"line_end":1,"line_start":1,"suggested_replacement":null,"text":[{"highlight_end":10,"highlight_start":1,"text":"fn main() {"}]}]},"package_id":"tt 0.1.0 (path+file:///home/arch/tt)","reason":"compiler-message","target":{"crate_types":["lib"],"kind":["lib"],"name":"tt","src_path":"/home/arch/tt/src/lib.rs"}}
{"features":[],"filenames":["/home/arch/tt/target/debug/libtt.rlib"],"fresh":false,"package_id":"tt 0.1.0 (path+file:///home/arch/tt)","profile":{"debug_assertions":true,"debuginfo":2,"opt_level":"0","overflow_checks":true,"test":false},"reason":"compiler-artifact","target":{"crate_types":["lib"],"kind":["lib"],"name":"tt","src_path":"/home/arch/tt/src/lib.rs"}}
@killercup
To save your time, you don't need to build my branch, just cargo new
a local crate with the src
above in src/lib.rs
, then build and fix it, the error will be reproduced.
@killercup
Another crazy fix with the tuple-pattern is in the same line of fn main()
.
source:
fn main() {let (mut var, unused_var) = (1, 2);}
fix:
_var
_unused_var
fn main() {let (var, unused_var) = (1, 2);}
meta:
cargo 1.27.0-nightly (9e53ac6e6 2018-05-07)
rustc 1.27.0-nightly (acd3871ba 2018-05-10)
@csmoe are you using rustfix master? Or the released version that's used in rustc's compiletest?
I just built rust-lang/rust#50675 locally, linked it with rustup as s1
and inside the rustfix repo added a small example to apply fixes from json (see #101).
$ cd ~/Projekte/rustfix
$ git status
On branch json-tool
Your branch is up to date with 'killercup/json-tool'.
…
$ cd examples
$ echo "fn main() {let (mut var, unused_var) = (1, 2);}" > foo.rs
$ rustc +s1 foo.rs --error-format=pretty-json -Zunstable-options --emit=metadata 2> foo.json
$ code foo.json # looks okay
$ cargo run --example fix-json foo.json foo.rs
Finished dev [unoptimized + debuginfo] target(s) in 0.14s
Running `/Users/pascal/Projekte/rustfix/target/debug/examples/fix-json foo.json foo.rs`
fn main() {let (_var, _unused_var) = (1, 2);}
It works! :O Same for this:
fn main() {
let (mut var, unused_var) = (1, 2);
}
which becomes
fn main() {
let (_var, _unused_var) = (1, 2);
}
Feel free to ping me on gitter or irc or discord, too!
Oh, and using rustc nightly from 2018-05-09 fails with Error: ErrorMessage { msg: "Could not replace range 21...27 in file -- maybe parts of it were already replaced?" }
-- which is correct because the (broken) fixes for unused mut and unused var overlap.
This should be fixed in rustfix master. Let's close this issue in a follow-up PR to rust-lang/rust#50675 that adds the appropriate rustfix tests to rustc.