[INFO] updating cached repository AndrewRadev/rust-hangman [INFO] running `"git" "fetch" "--all"` [INFO] [stdout] Fetching origin [INFO] [stderr] From git://github.com/AndrewRadev/rust-hangman [INFO] [stderr] * branch HEAD -> FETCH_HEAD [INFO] running `"git" "clone" "work/cache/sources/gh/AndrewRadev/rust-hangman" "work/ex/clippy-test-run/sources/stable/gh/AndrewRadev/rust-hangman"` [INFO] [stderr] Cloning into 'work/ex/clippy-test-run/sources/stable/gh/AndrewRadev/rust-hangman'... [INFO] [stderr] done. [INFO] running `"git" "clone" "work/cache/sources/gh/AndrewRadev/rust-hangman" "work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/AndrewRadev/rust-hangman"` [INFO] [stderr] Cloning into 'work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/AndrewRadev/rust-hangman'... [INFO] [stderr] done. [INFO] running `"git" "rev-parse" "HEAD"` [INFO] [stdout] dced4e0066a24af9c94e26cb36a8e493e2500248 [INFO] sha for GitHub repo AndrewRadev/rust-hangman: dced4e0066a24af9c94e26cb36a8e493e2500248 [INFO] validating manifest of AndrewRadev/rust-hangman on toolchain stable [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "read-manifest" "--manifest-path" "Cargo.toml"` [INFO] validating manifest of AndrewRadev/rust-hangman on toolchain stable+rustflags=-Dclippy::into_iter_on_array [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "read-manifest" "--manifest-path" "Cargo.toml"` [INFO] started frobbing AndrewRadev/rust-hangman [INFO] finished frobbing AndrewRadev/rust-hangman [INFO] frobbed toml for AndrewRadev/rust-hangman written to work/ex/clippy-test-run/sources/stable/gh/AndrewRadev/rust-hangman/Cargo.toml [INFO] started frobbing AndrewRadev/rust-hangman [INFO] finished frobbing AndrewRadev/rust-hangman [INFO] frobbed toml for AndrewRadev/rust-hangman written to work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/AndrewRadev/rust-hangman/Cargo.toml [INFO] crate AndrewRadev/rust-hangman has a lockfile. skipping [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "fetch" "--locked" "--manifest-path" "Cargo.toml"` [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "fetch" "--locked" "--manifest-path" "Cargo.toml"` [INFO] linting AndrewRadev/rust-hangman against stable for clippy-test-run [INFO] running `"docker" "create" "-v" "/mnt/big/crater/work/local/target-dirs/clippy-test-run/worker-3/stable:/opt/crater/target:rw,Z" "-v" "/mnt/big/crater/work/ex/clippy-test-run/sources/stable/gh/AndrewRadev/rust-hangman:/opt/crater/workdir:ro,Z" "-v" "/mnt/big/crater/work/local/cargo-home:/opt/crater/cargo-home:ro,Z" "-v" "/mnt/big/crater/work/local/rustup-home:/opt/crater/rustup-home:ro,Z" "-e" "USER_ID=1000" "-e" "SOURCE_DIR=/opt/crater/workdir" "-e" "MAP_USER_ID=1000" "-e" "CARGO_TARGET_DIR=/opt/crater/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/crater/cargo-home" "-e" "RUSTUP_HOME=/opt/crater/rustup-home" "-w" "/opt/crater/workdir" "-m" "1536M" "--network" "none" "rustops/crates-build-env" "/opt/crater/cargo-home/bin/cargo" "+stable" "clippy" "--frozen" "--all" "--all-targets"` [INFO] [stdout] f4a0c92f9f4acd26a0f8f4e752dad54d52915014e8da5028ada0962dfb7d59d3 [INFO] running `"docker" "start" "-a" "f4a0c92f9f4acd26a0f8f4e752dad54d52915014e8da5028ada0962dfb7d59d3"` [INFO] [stderr] Checking structopt v0.1.6 [INFO] [stderr] Checking hangman v0.1.0 (/opt/crater/workdir) [INFO] [stderr] warning: using `println!("")` [INFO] [stderr] --> src/tui.rs:78:5 [INFO] [stderr] | [INFO] [stderr] 78 | println!(""); [INFO] [stderr] | ^^^^^^^^^^^^ help: replace it with: `println!()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::println_empty_string)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#println_empty_string [INFO] [stderr] [INFO] [stderr] warning: using `println!("")` [INFO] [stderr] --> src/tui.rs:78:5 [INFO] [stderr] | [INFO] [stderr] 78 | println!(""); [INFO] [stderr] | ^^^^^^^^^^^^ help: replace it with: `println!()` [INFO] [stderr] warning: using `println!("")` [INFO] [stderr] --> src/tui.rs:85:5 [INFO] [stderr] | [INFO] [stderr] 85 | println!(""); [INFO] [stderr] | ^^^^^^^^^^^^ help: replace it with: `println!()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#println_empty_string [INFO] [stderr] [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::println_empty_string)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#println_empty_string [INFO] [stderr] [INFO] [stderr] warning: using `println!("")` [INFO] [stderr] --> src/tui.rs:85:5 [INFO] [stderr] | [INFO] [stderr] 85 | println!(""); [INFO] [stderr] | ^^^^^^^^^^^^ help: replace it with: `println!()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#println_empty_string [INFO] [stderr] [INFO] [stderr] warning: use of deprecated item 'std::env::home_dir': This function's behavior is unexpected and probably not what you want. Consider using the home_dir function from https://crates.io/crates/dirs instead. [INFO] [stderr] --> src/input.rs:89:39 [INFO] [stderr] | [INFO] [stderr] 89 | if let Some(mut home_file_path) = env::home_dir() { [INFO] [stderr] | ^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(deprecated)] on by default [INFO] [stderr] [INFO] [stderr] warning: use of deprecated item 'std::env::home_dir': This function's behavior is unexpected and probably not what you want. Consider using the home_dir function from https://crates.io/crates/dirs instead. [INFO] [stderr] --> src/input.rs:89:39 [INFO] [stderr] | [INFO] [stderr] 89 | if let Some(mut home_file_path) = env::home_dir() { [INFO] [stderr] | ^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(deprecated)] on by default [INFO] [stderr] [INFO] [stderr] warning: you should consider deriving a `Default` implementation for `wordlist::Wordlist` [INFO] [stderr] --> src/wordlist.rs:11:5 [INFO] [stderr] | [INFO] [stderr] 11 | / pub fn new() -> Self { [INFO] [stderr] 12 | | Wordlist { words: Vec::new() } [INFO] [stderr] 13 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::new_without_default_derive)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#new_without_default_derive [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 6 | #[derive(Default)] [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/wordlist.rs:34:24 [INFO] [stderr] | [INFO] [stderr] 34 | filter(|l| l.len() > 0). [INFO] [stderr] | ^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!l.is_empty()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::len_zero)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/wordlist.rs:45:12 [INFO] [stderr] | [INFO] [stderr] 45 | if self.words.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `self.words.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: calling `as_bytes()` on `include_str!(..)` [INFO] [stderr] --> src/input.rs:102:37 [INFO] [stderr] | [INFO] [stderr] 102 | let reader = BufReader::new(include_str!("../words.txt").as_bytes()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `include_bytes!(..)` instead: `include_bytes!("../words.txt")` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::string_lit_as_bytes)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#string_lit_as_bytes [INFO] [stderr] [INFO] [stderr] warning: called `is_some()` after searching an `Iterator` with find. This is more succinctly expressed by calling `any()`. [INFO] [stderr] --> src/game.rs:59:19 [INFO] [stderr] | [INFO] [stderr] 59 | } else if self.solution.chars().find(|c| *c == guess).is_some() { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::search_is_some)] on by default [INFO] [stderr] = note: replace `find(|c| *c == guess).is_some()` with `any(|c| *c == guess)` [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#search_is_some [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/tui.rs:8:9 [INFO] [stderr] | [INFO] [stderr] 8 | / match self { [INFO] [stderr] 9 | | &GameError::IoError(ref e) => { [INFO] [stderr] 10 | | f.write_fmt(format_args!("{}", e)) [INFO] [stderr] 11 | | } [INFO] [stderr] ... | [INFO] [stderr] 35 | | }, [INFO] [stderr] 36 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::match_ref_pats)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 8 | match *self { [INFO] [stderr] 9 | GameError::IoError(ref e) => { [INFO] [stderr] 10 | f.write_fmt(format_args!("{}", e)) [INFO] [stderr] 11 | } [INFO] [stderr] 12 | GameError::ParseError(ref input) => { [INFO] [stderr] 13 | f.write_fmt(format_args!("Invalid command: {:?}. ", &input))?; [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: this loop could be written as a `for` loop [INFO] [stderr] --> src/tui.rs:57:38 [INFO] [stderr] | [INFO] [stderr] 57 | while let Some(letter) = chars.next() { [INFO] [stderr] | ^^^^^^^^^^^^ help: try: `for letter in chars { .. }` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::while_let_on_iterator)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#while_let_on_iterator [INFO] [stderr] [INFO] [stderr] warning: you should consider deriving a `Default` implementation for `wordlist::Wordlist` [INFO] [stderr] --> src/wordlist.rs:11:5 [INFO] [stderr] | [INFO] [stderr] 11 | / pub fn new() -> Self { [INFO] [stderr] 12 | | Wordlist { words: Vec::new() } [INFO] [stderr] 13 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::new_without_default_derive)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#new_without_default_derive [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 6 | #[derive(Default)] [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/wordlist.rs:34:24 [INFO] [stderr] | [INFO] [stderr] 34 | filter(|l| l.len() > 0). [INFO] [stderr] | ^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!l.is_empty()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::len_zero)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/wordlist.rs:45:12 [INFO] [stderr] | [INFO] [stderr] 45 | if self.words.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `self.words.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: calling `as_bytes()` on `include_str!(..)` [INFO] [stderr] --> src/input.rs:102:37 [INFO] [stderr] | [INFO] [stderr] 102 | let reader = BufReader::new(include_str!("../words.txt").as_bytes()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `include_bytes!(..)` instead: `include_bytes!("../words.txt")` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::string_lit_as_bytes)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#string_lit_as_bytes [INFO] [stderr] [INFO] [stderr] warning: called `is_some()` after searching an `Iterator` with find. This is more succinctly expressed by calling `any()`. [INFO] [stderr] --> src/game.rs:59:19 [INFO] [stderr] | [INFO] [stderr] 59 | } else if self.solution.chars().find(|c| *c == guess).is_some() { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::search_is_some)] on by default [INFO] [stderr] = note: replace `find(|c| *c == guess).is_some()` with `any(|c| *c == guess)` [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#search_is_some [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/tui.rs:8:9 [INFO] [stderr] | [INFO] [stderr] 8 | / match self { [INFO] [stderr] 9 | | &GameError::IoError(ref e) => { [INFO] [stderr] 10 | | f.write_fmt(format_args!("{}", e)) [INFO] [stderr] 11 | | } [INFO] [stderr] ... | [INFO] [stderr] 35 | | }, [INFO] [stderr] 36 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::match_ref_pats)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 8 | match *self { [INFO] [stderr] 9 | GameError::IoError(ref e) => { [INFO] [stderr] 10 | f.write_fmt(format_args!("{}", e)) [INFO] [stderr] 11 | } [INFO] [stderr] 12 | GameError::ParseError(ref input) => { [INFO] [stderr] 13 | f.write_fmt(format_args!("Invalid command: {:?}. ", &input))?; [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: this loop could be written as a `for` loop [INFO] [stderr] --> src/tui.rs:57:38 [INFO] [stderr] | [INFO] [stderr] 57 | while let Some(letter) = chars.next() { [INFO] [stderr] | ^^^^^^^^^^^^ help: try: `for letter in chars { .. }` [INFO] [stderr] warning: using `println!("")` [INFO] [stderr] --> src/main.rs:61:9 [INFO] [stderr] | [INFO] [stderr] 61 | println!(""); [INFO] [stderr] | ^^^^^^^^^^^^ help: replace it with: `println!()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::println_empty_string)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#println_empty_string [INFO] [stderr] [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::while_let_on_iterator)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#while_let_on_iterator [INFO] [stderr] [INFO] [stderr] warning: using `println!("")` [INFO] [stderr] --> src/main.rs:61:9 [INFO] [stderr] | [INFO] [stderr] 61 | println!(""); [INFO] [stderr] | ^^^^^^^^^^^^ help: replace it with: `println!()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::println_empty_string)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#println_empty_string [INFO] [stderr] [INFO] [stderr] warning: redundant pattern matching, consider using `is_err()` [INFO] [stderr] --> src/main.rs:38:16 [INFO] [stderr] | [INFO] [stderr] 38 | if let Err(_) = stdin.read_line(&mut input) { [INFO] [stderr] | _________- ^^^^^^ [INFO] [stderr] 39 | | println!("\nInvalid input!"); [INFO] [stderr] 40 | | continue; [INFO] [stderr] 41 | | }; [INFO] [stderr] | |_________- help: try this: `if stdin.read_line(&mut input).is_err()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::redundant_pattern_matching)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_pattern_matching [INFO] [stderr] [INFO] [stderr] warning: redundant pattern matching, consider using `is_err()` [INFO] [stderr] --> src/main.rs:38:16 [INFO] [stderr] | [INFO] [stderr] 38 | if let Err(_) = stdin.read_line(&mut input) { [INFO] [stderr] | _________- ^^^^^^ [INFO] [stderr] 39 | | println!("\nInvalid input!"); [INFO] [stderr] 40 | | continue; [INFO] [stderr] 41 | | }; [INFO] [stderr] | |_________- help: try this: `if stdin.read_line(&mut input).is_err()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::redundant_pattern_matching)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_pattern_matching [INFO] [stderr] [INFO] [stderr] warning: the function has a cyclomatic complexity of 61 [INFO] [stderr] --> tests/test_hangman.rs:167:1 [INFO] [stderr] | [INFO] [stderr] 167 | / fn test_command_parsing_full_words() { [INFO] [stderr] 168 | | assert_match!(Ok(Command::Quit), "quit".parse::()); [INFO] [stderr] 169 | | assert_match!(Ok(Command::Quit), "Quit".parse::()); [INFO] [stderr] 170 | | assert_match!(Ok(Command::Quit), "QUIT".parse::()); [INFO] [stderr] ... | [INFO] [stderr] 192 | | assert_match!(Err(GameError::ParseError(_)), "try word".parse::()); [INFO] [stderr] 193 | | } [INFO] [stderr] | |_^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::cyclomatic_complexity)] on by default [INFO] [stderr] = help: you could split it up into multiple smaller functions [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cyclomatic_complexity [INFO] [stderr] [INFO] [stderr] warning: the function has a cyclomatic complexity of 67 [INFO] [stderr] --> tests/test_hangman.rs:207:1 [INFO] [stderr] | [INFO] [stderr] 207 | / fn test_command_parsing_partial_words() { [INFO] [stderr] 208 | | assert_match!(Ok(Command::Quit), "qwit".parse::()); [INFO] [stderr] 209 | | assert_match!(Ok(Command::Quit), "q".parse::()); [INFO] [stderr] 210 | | assert_match!(Ok(Command::Quit), "Q".parse::()); [INFO] [stderr] ... | [INFO] [stderr] 238 | | assert_match!(Err(GameError::ParseError(_)), "w t w".parse::()); [INFO] [stderr] 239 | | } [INFO] [stderr] | |_^ [INFO] [stderr] | [INFO] [stderr] = help: you could split it up into multiple smaller functions [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cyclomatic_complexity [INFO] [stderr] [INFO] [stderr] Finished dev [unoptimized + debuginfo] target(s) in 4.62s [INFO] running `"docker" "inspect" "f4a0c92f9f4acd26a0f8f4e752dad54d52915014e8da5028ada0962dfb7d59d3"` [INFO] running `"docker" "rm" "-f" "f4a0c92f9f4acd26a0f8f4e752dad54d52915014e8da5028ada0962dfb7d59d3"` [INFO] [stdout] f4a0c92f9f4acd26a0f8f4e752dad54d52915014e8da5028ada0962dfb7d59d3