rust-lang/rustfix

Weird fix in tuple-pattern

Closed this issue · 6 comments

csmoe commented

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.

csmoe commented
{"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.

csmoe commented

@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.