[INFO] updating cached repository joaodelgado/tictacrust [INFO] running `"git" "fetch" "--all"` [INFO] [stdout] Fetching origin [INFO] [stderr] From git://github.com/joaodelgado/tictacrust [INFO] [stderr] * branch HEAD -> FETCH_HEAD [INFO] running `"git" "clone" "work/cache/sources/gh/joaodelgado/tictacrust" "work/ex/clippy-test-run/sources/stable/gh/joaodelgado/tictacrust"` [INFO] [stderr] Cloning into 'work/ex/clippy-test-run/sources/stable/gh/joaodelgado/tictacrust'... [INFO] [stderr] done. [INFO] running `"git" "clone" "work/cache/sources/gh/joaodelgado/tictacrust" "work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/joaodelgado/tictacrust"` [INFO] [stderr] Cloning into 'work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/joaodelgado/tictacrust'... [INFO] [stderr] done. [INFO] running `"git" "rev-parse" "HEAD"` [INFO] [stdout] 1a160294ca83d0f8bb408de9d6f2426050884a0f [INFO] sha for GitHub repo joaodelgado/tictacrust: 1a160294ca83d0f8bb408de9d6f2426050884a0f [INFO] validating manifest of joaodelgado/tictacrust 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 joaodelgado/tictacrust 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 joaodelgado/tictacrust [INFO] finished frobbing joaodelgado/tictacrust [INFO] frobbed toml for joaodelgado/tictacrust written to work/ex/clippy-test-run/sources/stable/gh/joaodelgado/tictacrust/Cargo.toml [INFO] started frobbing joaodelgado/tictacrust [INFO] finished frobbing joaodelgado/tictacrust [INFO] frobbed toml for joaodelgado/tictacrust written to work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/joaodelgado/tictacrust/Cargo.toml [INFO] crate joaodelgado/tictacrust 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 joaodelgado/tictacrust against stable+rustflags=-Dclippy::into_iter_on_array for clippy-test-run [INFO] running `"docker" "create" "-v" "/mnt/big/crater/work/local/target-dirs/clippy-test-run/worker-5/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array:/opt/crater/target:rw,Z" "-v" "/mnt/big/crater/work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/joaodelgado/tictacrust:/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 -Dclippy::into_iter_on_array" "-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] cfcbf3f6f30b9d39e6546dfa204759486b5c3f3c7c9c9b07ceb8a04850464a25 [INFO] running `"docker" "start" "-a" "cfcbf3f6f30b9d39e6546dfa204759486b5c3f3c7c9c9b07ceb8a04850464a25"` [INFO] [stderr] Checking tictacrust v0.1.0 (/opt/crater/workdir) [INFO] [stderr] warning: `cfg_attr` is deprecated for rustfmt and got replaced by tool_attributes [INFO] [stderr] --> src/game.rs:226:5 [INFO] [stderr] | [INFO] [stderr] 226 | #[cfg_attr(rustfmt, rustfmt_skip)] [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `#[rustfmt::skip]` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::deprecated_cfg_attr)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#deprecated_cfg_attr [INFO] [stderr] [INFO] [stderr] warning: `cfg_attr` is deprecated for rustfmt and got replaced by tool_attributes [INFO] [stderr] --> src/game.rs:272:5 [INFO] [stderr] | [INFO] [stderr] 272 | #[cfg_attr(rustfmt, rustfmt_skip)] [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `#[rustfmt::skip]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#deprecated_cfg_attr [INFO] [stderr] [INFO] [stderr] warning: `cfg_attr` is deprecated for rustfmt and got replaced by tool_attributes [INFO] [stderr] --> src/game.rs:226:5 [INFO] [stderr] | [INFO] [stderr] 226 | #[cfg_attr(rustfmt, rustfmt_skip)] [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `#[rustfmt::skip]` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::deprecated_cfg_attr)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#deprecated_cfg_attr [INFO] [stderr] [INFO] [stderr] warning: `cfg_attr` is deprecated for rustfmt and got replaced by tool_attributes [INFO] [stderr] --> src/game.rs:272:5 [INFO] [stderr] | [INFO] [stderr] 272 | #[cfg_attr(rustfmt, rustfmt_skip)] [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `#[rustfmt::skip]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#deprecated_cfg_attr [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/ai.rs:23:9 [INFO] [stderr] | [INFO] [stderr] 23 | / return moves [INFO] [stderr] 24 | | .pop() [INFO] [stderr] 25 | | .expect("No available moves, but no game over was detected") [INFO] [stderr] 26 | | .0; [INFO] [stderr] | |_______________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::needless_return)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] help: remove `return` as shown [INFO] [stderr] | [INFO] [stderr] 23 | moves [INFO] [stderr] 24 | .pop() [INFO] [stderr] 25 | .expect("No available moves, but no game over was detected") [INFO] [stderr] 26 | .0 [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/game.rs:154:23 [INFO] [stderr] | [INFO] [stderr] 154 | result => return result, [INFO] [stderr] | ^^^^^^^^^^^^^ help: remove `return` as shown: `result` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/ai.rs:23:9 [INFO] [stderr] | [INFO] [stderr] 23 | / return moves [INFO] [stderr] 24 | | .pop() [INFO] [stderr] 25 | | .expect("No available moves, but no game over was detected") [INFO] [stderr] 26 | | .0; [INFO] [stderr] | |_______________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::needless_return)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] help: remove `return` as shown [INFO] [stderr] | [INFO] [stderr] 23 | moves [INFO] [stderr] 24 | .pop() [INFO] [stderr] 25 | .expect("No available moves, but no game over was detected") [INFO] [stderr] 26 | .0 [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/game.rs:154:23 [INFO] [stderr] | [INFO] [stderr] 154 | result => return result, [INFO] [stderr] | ^^^^^^^^^^^^^ help: remove `return` as shown: `result` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] [INFO] [stderr] warning: `if _ { .. } else { .. }` is an expression [INFO] [stderr] --> src/ai.rs:35:9 [INFO] [stderr] | [INFO] [stderr] 35 | / let best_score: isize; [INFO] [stderr] 36 | | if board.is_over() { [INFO] [stderr] 37 | | best_score = match board.winner() { [INFO] [stderr] 38 | | Some(player) if self.player == player => 1, [INFO] [stderr] ... | [INFO] [stderr] 47 | | .expect("No available moves, but no game over was detected"); [INFO] [stderr] 48 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::useless_let_if_seq)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_let_if_seq [INFO] [stderr] help: it is more idiomatic to write [INFO] [stderr] | [INFO] [stderr] 35 | let best_score = if board.is_over() { match board.winner() { [INFO] [stderr] 36 | Some(player) if self.player == player => 1, [INFO] [stderr] 37 | None => 0, [INFO] [stderr] 38 | _ => -1, [INFO] [stderr] 39 | } } else { self.available_moves(board) [INFO] [stderr] 40 | .iter() [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: `if _ { .. } else { .. }` is an expression [INFO] [stderr] --> src/ai.rs:62:9 [INFO] [stderr] | [INFO] [stderr] 62 | / let best_score: isize; [INFO] [stderr] 63 | | [INFO] [stderr] 64 | | if board.is_over() { [INFO] [stderr] 65 | | best_score = match board.winner() { [INFO] [stderr] ... | [INFO] [stderr] 76 | | .expect("No available moves, but no game over was detected"); [INFO] [stderr] 77 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_let_if_seq [INFO] [stderr] help: it is more idiomatic to write [INFO] [stderr] | [INFO] [stderr] 62 | let best_score = if board.is_over() { match board.winner() { [INFO] [stderr] 63 | Some(player) if self.player == player => 1, [INFO] [stderr] 64 | None => 0, [INFO] [stderr] 65 | _ => -1, [INFO] [stderr] 66 | } } else { self.available_moves(board) [INFO] [stderr] 67 | .iter() [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: this argument is passed by reference, but would be more efficient if passed by value [INFO] [stderr] --> src/game.rs:13:17 [INFO] [stderr] | [INFO] [stderr] 13 | pub fn swap(&self) -> Player { [INFO] [stderr] | ^^^^^ help: consider passing by value instead: `self` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::trivially_copy_pass_by_ref)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#trivially_copy_pass_by_ref [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/game.rs:76:9 [INFO] [stderr] | [INFO] [stderr] 76 | / match self.play(position) { [INFO] [stderr] 77 | | Err(_) => { [INFO] [stderr] 78 | | println!("Cell already occupied!"); [INFO] [stderr] 79 | | return; [INFO] [stderr] 80 | | } [INFO] [stderr] 81 | | Ok(_) => {} [INFO] [stderr] 82 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::single_match)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 76 | if let Err(_) = self.play(position) { [INFO] [stderr] 77 | println!("Cell already occupied!"); [INFO] [stderr] 78 | return; [INFO] [stderr] 79 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/game.rs:163:13 [INFO] [stderr] | [INFO] [stderr] 163 | / format!( [INFO] [stderr] 164 | | "{}", [INFO] [stderr] 165 | | match i { [INFO] [stderr] 166 | | i if i == self.last_play => self.cells[i].to_string(), [INFO] [stderr] 167 | | _ => self.cells[i].to_string().to_lowercase(), [INFO] [stderr] 168 | | } [INFO] [stderr] 169 | | ) [INFO] [stderr] | |_____________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::useless_format)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] help: consider using .to_string() [INFO] [stderr] | [INFO] [stderr] 2 | $ crate :: fmt :: format ( match i { [INFO] [stderr] 3 | i if i == self.last_play => self.cells[i].to_string(), [INFO] [stderr] 4 | _ => self.cells[i].to_string().to_lowercase(), [INFO] [stderr] 5 | }.to_string() ) ) [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: `if _ { .. } else { .. }` is an expression [INFO] [stderr] --> src/ai.rs:35:9 [INFO] [stderr] | [INFO] [stderr] 35 | / let best_score: isize; [INFO] [stderr] 36 | | if board.is_over() { [INFO] [stderr] 37 | | best_score = match board.winner() { [INFO] [stderr] 38 | | Some(player) if self.player == player => 1, [INFO] [stderr] ... | [INFO] [stderr] 47 | | .expect("No available moves, but no game over was detected"); [INFO] [stderr] 48 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::useless_let_if_seq)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_let_if_seq [INFO] [stderr] help: it is more idiomatic to write [INFO] [stderr] | [INFO] [stderr] 35 | let best_score = if board.is_over() { match board.winner() { [INFO] [stderr] 36 | Some(player) if self.player == player => 1, [INFO] [stderr] 37 | None => 0, [INFO] [stderr] 38 | _ => -1, [INFO] [stderr] 39 | } } else { self.available_moves(board) [INFO] [stderr] 40 | .iter() [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: `if _ { .. } else { .. }` is an expression [INFO] [stderr] --> src/ai.rs:62:9 [INFO] [stderr] | [INFO] [stderr] 62 | / let best_score: isize; [INFO] [stderr] 63 | | [INFO] [stderr] 64 | | if board.is_over() { [INFO] [stderr] 65 | | best_score = match board.winner() { [INFO] [stderr] ... | [INFO] [stderr] 76 | | .expect("No available moves, but no game over was detected"); [INFO] [stderr] 77 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_let_if_seq [INFO] [stderr] help: it is more idiomatic to write [INFO] [stderr] | [INFO] [stderr] 62 | let best_score = if board.is_over() { match board.winner() { [INFO] [stderr] 63 | Some(player) if self.player == player => 1, [INFO] [stderr] 64 | None => 0, [INFO] [stderr] 65 | _ => -1, [INFO] [stderr] 66 | } } else { self.available_moves(board) [INFO] [stderr] 67 | .iter() [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: this argument is passed by reference, but would be more efficient if passed by value [INFO] [stderr] --> src/game.rs:13:17 [INFO] [stderr] | [INFO] [stderr] 13 | pub fn swap(&self) -> Player { [INFO] [stderr] | ^^^^^ help: consider passing by value instead: `self` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::trivially_copy_pass_by_ref)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#trivially_copy_pass_by_ref [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/game.rs:76:9 [INFO] [stderr] | [INFO] [stderr] 76 | / match self.play(position) { [INFO] [stderr] 77 | | Err(_) => { [INFO] [stderr] 78 | | println!("Cell already occupied!"); [INFO] [stderr] 79 | | return; [INFO] [stderr] 80 | | } [INFO] [stderr] 81 | | Ok(_) => {} [INFO] [stderr] 82 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::single_match)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 76 | if let Err(_) = self.play(position) { [INFO] [stderr] 77 | println!("Cell already occupied!"); [INFO] [stderr] 78 | return; [INFO] [stderr] 79 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/game.rs:163:13 [INFO] [stderr] | [INFO] [stderr] 163 | / format!( [INFO] [stderr] 164 | | "{}", [INFO] [stderr] 165 | | match i { [INFO] [stderr] 166 | | i if i == self.last_play => self.cells[i].to_string(), [INFO] [stderr] 167 | | _ => self.cells[i].to_string().to_lowercase(), [INFO] [stderr] 168 | | } [INFO] [stderr] 169 | | ) [INFO] [stderr] | |_____________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::useless_format)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] help: consider using .to_string() [INFO] [stderr] | [INFO] [stderr] 2 | $ crate :: fmt :: format ( match i { [INFO] [stderr] 3 | i if i == self.last_play => self.cells[i].to_string(), [INFO] [stderr] 4 | _ => self.cells[i].to_string().to_lowercase(), [INFO] [stderr] 5 | }.to_string() ) ) [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] Finished dev [unoptimized + debuginfo] target(s) in 0.96s [INFO] running `"docker" "inspect" "cfcbf3f6f30b9d39e6546dfa204759486b5c3f3c7c9c9b07ceb8a04850464a25"` [INFO] running `"docker" "rm" "-f" "cfcbf3f6f30b9d39e6546dfa204759486b5c3f3c7c9c9b07ceb8a04850464a25"` [INFO] [stdout] cfcbf3f6f30b9d39e6546dfa204759486b5c3f3c7c9c9b07ceb8a04850464a25