Skip to content
This repository was archived by the owner on Nov 24, 2023. It is now read-only.

Weird fix in tuple-pattern #100

Closed
csmoe opened this issue May 13, 2018 · 6 comments
Closed

Weird fix in tuple-pattern #100

csmoe opened this issue May 13, 2018 · 6 comments

Comments

@csmoe
Copy link
Member

csmoe commented May 13, 2018

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.

@csmoe csmoe changed the title Werid fix in tuple-pattern Weird fix in tuple-pattern May 13, 2018
@killercup
Copy link
Member

killercup commented May 13, 2018

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
Copy link
Member Author

csmoe commented May 13, 2018

{"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
Copy link
Member Author

csmoe commented May 13, 2018

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

@killercup
Copy link
Member

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

@killercup
Copy link
Member

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.

@killercup
Copy link
Member

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.

@csmoe csmoe closed this as completed May 22, 2018
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants