[INFO] updating cached repository LPGhatguy/shunting-rust [INFO] running `"git" "fetch" "--all"` [INFO] [stdout] Fetching origin [INFO] [stderr] From git://github.com/LPGhatguy/shunting-rust [INFO] [stderr] * branch HEAD -> FETCH_HEAD [INFO] running `"git" "clone" "work/cache/sources/gh/LPGhatguy/shunting-rust" "work/ex/clippy-test-run/sources/stable/gh/LPGhatguy/shunting-rust"` [INFO] [stderr] Cloning into 'work/ex/clippy-test-run/sources/stable/gh/LPGhatguy/shunting-rust'... [INFO] [stderr] done. [INFO] running `"git" "clone" "work/cache/sources/gh/LPGhatguy/shunting-rust" "work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/LPGhatguy/shunting-rust"` [INFO] [stderr] Cloning into 'work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/LPGhatguy/shunting-rust'... [INFO] [stderr] done. [INFO] running `"git" "rev-parse" "HEAD"` [INFO] [stdout] 698a33d8cc6d8649ae7424106edbd6262d6c1d48 [INFO] sha for GitHub repo LPGhatguy/shunting-rust: 698a33d8cc6d8649ae7424106edbd6262d6c1d48 [INFO] validating manifest of LPGhatguy/shunting-rust 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 LPGhatguy/shunting-rust 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 LPGhatguy/shunting-rust [INFO] finished frobbing LPGhatguy/shunting-rust [INFO] frobbed toml for LPGhatguy/shunting-rust written to work/ex/clippy-test-run/sources/stable/gh/LPGhatguy/shunting-rust/Cargo.toml [INFO] started frobbing LPGhatguy/shunting-rust [INFO] finished frobbing LPGhatguy/shunting-rust [INFO] frobbed toml for LPGhatguy/shunting-rust written to work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/LPGhatguy/shunting-rust/Cargo.toml [INFO] crate LPGhatguy/shunting-rust 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 LPGhatguy/shunting-rust 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-7/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/LPGhatguy/shunting-rust:/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] 3807f478d438175622b7a9e00605b7082f55b2714522e65762b190969fc01719 [INFO] running `"docker" "start" "-a" "3807f478d438175622b7a9e00605b7082f55b2714522e65762b190969fc01719"` [INFO] [stderr] Checking memchr v2.0.1 [INFO] [stderr] Checking aho-corasick v0.6.4 [INFO] [stderr] Checking regex v0.2.3 [INFO] [stderr] Checking shunting-rust v0.1.0 (/opt/crater/workdir) [INFO] [stderr] warning: trivial regex [INFO] [stderr] --> src/lexer.rs:35:55 [INFO] [stderr] | [INFO] [stderr] 35 | static ref PATTERN_OPEN_PAREN: Regex = Regex::new(r"^\(").unwrap(); [INFO] [stderr] | ^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::trivial_regex)] on by default [INFO] [stderr] = help: consider using `str::starts_with` [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#trivial_regex [INFO] [stderr] [INFO] [stderr] warning: trivial regex [INFO] [stderr] --> src/lexer.rs:36:56 [INFO] [stderr] | [INFO] [stderr] 36 | static ref PATTERN_CLOSE_PAREN: Regex = Regex::new(r"^\)").unwrap(); [INFO] [stderr] | ^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: consider using `str::starts_with` [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#trivial_regex [INFO] [stderr] [INFO] [stderr] warning: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration) [INFO] [stderr] --> src/lexer.rs:43:1 [INFO] [stderr] | [INFO] [stderr] 43 | / fn eat_whitespace<'a>(source: &'a str) -> &'a str { [INFO] [stderr] 44 | | if let Some(range) = PATTERN_WHITESPACE.find(source) { [INFO] [stderr] 45 | | &source[range.end()..] [INFO] [stderr] 46 | | } else { [INFO] [stderr] 47 | | source [INFO] [stderr] 48 | | } [INFO] [stderr] 49 | | } [INFO] [stderr] | |_^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::needless_lifetimes)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_lifetimes [INFO] [stderr] [INFO] [stderr] warning: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration) [INFO] [stderr] --> src/lexer.rs:67:1 [INFO] [stderr] | [INFO] [stderr] 67 | / fn match_constant<'a>(source: &'a str) -> Option<(&'a str, Token)> { [INFO] [stderr] 68 | | // Our numeric pattern shouldn't ever fail to parse as an f64 [INFO] [stderr] 69 | | match_simple(source, &PATTERN_CONSTANT, |v| Token::Constant(v.parse::().unwrap())) [INFO] [stderr] 70 | | } [INFO] [stderr] | |_^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_lifetimes [INFO] [stderr] [INFO] [stderr] warning: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration) [INFO] [stderr] --> src/lexer.rs:72:1 [INFO] [stderr] | [INFO] [stderr] 72 | / fn match_operator<'a>(source: &'a str) -> Option<(&'a str, Token)> { [INFO] [stderr] 73 | | // Our operator pattern is fairly generic, but we can disambiguate by matching [INFO] [stderr] 74 | | // on the capture string! [INFO] [stderr] 75 | | match_simple(source, &PATTERN_OPERATOR, |v| { [INFO] [stderr] ... | [INFO] [stderr] 86 | | }) [INFO] [stderr] 87 | | } [INFO] [stderr] | |_^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_lifetimes [INFO] [stderr] [INFO] [stderr] warning: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration) [INFO] [stderr] --> src/lexer.rs:89:1 [INFO] [stderr] | [INFO] [stderr] 89 | / fn match_paren<'a>(source: &'a str) -> Option<(&'a str, Token)> { [INFO] [stderr] 90 | | match_simple(source, &PATTERN_OPEN_PAREN, |_| Token::OpenParen) [INFO] [stderr] 91 | | .or_else(|| match_simple(source, &PATTERN_CLOSE_PAREN, |_| Token::CloseParen)) [INFO] [stderr] 92 | | } [INFO] [stderr] | |_^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_lifetimes [INFO] [stderr] [INFO] [stderr] warning: this argument is passed by reference, but would be more efficient if passed by value [INFO] [stderr] --> src/parser.rs:39:40 [INFO] [stderr] | [INFO] [stderr] 39 | pub fn from_lex_operator(operator: &Operator) -> ShuntOperator { [INFO] [stderr] | ^^^^^^^^^ help: consider passing by value instead: `Operator` [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: this loop could be written as a `while let` loop [INFO] [stderr] --> src/parser.rs:189:5 [INFO] [stderr] | [INFO] [stderr] 189 | / loop { [INFO] [stderr] 190 | | // Advance one token further into the stream [INFO] [stderr] 191 | | let token = match tokens.first() { [INFO] [stderr] 192 | | Some(token) => token, [INFO] [stderr] ... | [INFO] [stderr] 281 | | } [INFO] [stderr] 282 | | } [INFO] [stderr] | |_____^ help: try: `while let Some(token) = tokens.first() { .. }` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::while_let_loop)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#while_let_loop [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/parser.rs:211:25 [INFO] [stderr] | [INFO] [stderr] 211 | / match state.last_was_operator { [INFO] [stderr] 212 | | true => ShuntOperator::UnaryPlus, [INFO] [stderr] 213 | | false => ShuntOperator::Plus, [INFO] [stderr] 214 | | } [INFO] [stderr] | |_________________________^ help: consider using an if/else expression: `if state.last_was_operator { ShuntOperator::UnaryPlus } else { ShuntOperator::Plus }` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::match_bool)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_bool [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/parser.rs:217:25 [INFO] [stderr] | [INFO] [stderr] 217 | / match state.last_was_operator { [INFO] [stderr] 218 | | true => ShuntOperator::UnaryMinus, [INFO] [stderr] 219 | | false => ShuntOperator::Minus, [INFO] [stderr] 220 | | } [INFO] [stderr] | |_________________________^ help: consider using an if/else expression: `if state.last_was_operator { ShuntOperator::UnaryMinus } else { ShuntOperator::Minus }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_bool [INFO] [stderr] [INFO] [stderr] warning: this loop could be written as a `while let` loop [INFO] [stderr] --> src/parser.rs:228:21 [INFO] [stderr] | [INFO] [stderr] 228 | / loop { [INFO] [stderr] 229 | | match state.operator_stack.last() { [INFO] [stderr] 230 | | Some(top_operator) => { [INFO] [stderr] 231 | | // For left-associative operators, we clear all [INFO] [stderr] ... | [INFO] [stderr] 250 | | state.clear_one_operator(); [INFO] [stderr] 251 | | } [INFO] [stderr] | |_____________________^ help: try: `while let Some(top_operator) = state.operator_stack.last() { .. }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#while_let_loop [INFO] [stderr] [INFO] [stderr] warning: trivial regex [INFO] [stderr] --> src/lexer.rs:35:55 [INFO] [stderr] | [INFO] [stderr] 35 | static ref PATTERN_OPEN_PAREN: Regex = Regex::new(r"^\(").unwrap(); [INFO] [stderr] | ^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::trivial_regex)] on by default [INFO] [stderr] = help: consider using `str::starts_with` [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#trivial_regex [INFO] [stderr] [INFO] [stderr] warning: trivial regex [INFO] [stderr] --> src/lexer.rs:36:56 [INFO] [stderr] | [INFO] [stderr] 36 | static ref PATTERN_CLOSE_PAREN: Regex = Regex::new(r"^\)").unwrap(); [INFO] [stderr] | ^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: consider using `str::starts_with` [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#trivial_regex [INFO] [stderr] [INFO] [stderr] warning: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration) [INFO] [stderr] --> src/lexer.rs:43:1 [INFO] [stderr] | [INFO] [stderr] 43 | / fn eat_whitespace<'a>(source: &'a str) -> &'a str { [INFO] [stderr] 44 | | if let Some(range) = PATTERN_WHITESPACE.find(source) { [INFO] [stderr] 45 | | &source[range.end()..] [INFO] [stderr] 46 | | } else { [INFO] [stderr] 47 | | source [INFO] [stderr] 48 | | } [INFO] [stderr] 49 | | } [INFO] [stderr] | |_^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::needless_lifetimes)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_lifetimes [INFO] [stderr] [INFO] [stderr] warning: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration) [INFO] [stderr] --> src/lexer.rs:67:1 [INFO] [stderr] | [INFO] [stderr] 67 | / fn match_constant<'a>(source: &'a str) -> Option<(&'a str, Token)> { [INFO] [stderr] 68 | | // Our numeric pattern shouldn't ever fail to parse as an f64 [INFO] [stderr] 69 | | match_simple(source, &PATTERN_CONSTANT, |v| Token::Constant(v.parse::().unwrap())) [INFO] [stderr] 70 | | } [INFO] [stderr] | |_^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_lifetimes [INFO] [stderr] [INFO] [stderr] warning: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration) [INFO] [stderr] --> src/lexer.rs:72:1 [INFO] [stderr] | [INFO] [stderr] 72 | / fn match_operator<'a>(source: &'a str) -> Option<(&'a str, Token)> { [INFO] [stderr] 73 | | // Our operator pattern is fairly generic, but we can disambiguate by matching [INFO] [stderr] 74 | | // on the capture string! [INFO] [stderr] 75 | | match_simple(source, &PATTERN_OPERATOR, |v| { [INFO] [stderr] ... | [INFO] [stderr] 86 | | }) [INFO] [stderr] 87 | | } [INFO] [stderr] | |_^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_lifetimes [INFO] [stderr] [INFO] [stderr] warning: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration) [INFO] [stderr] --> src/lexer.rs:89:1 [INFO] [stderr] | [INFO] [stderr] 89 | / fn match_paren<'a>(source: &'a str) -> Option<(&'a str, Token)> { [INFO] [stderr] 90 | | match_simple(source, &PATTERN_OPEN_PAREN, |_| Token::OpenParen) [INFO] [stderr] 91 | | .or_else(|| match_simple(source, &PATTERN_CLOSE_PAREN, |_| Token::CloseParen)) [INFO] [stderr] 92 | | } [INFO] [stderr] | |_^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_lifetimes [INFO] [stderr] [INFO] [stderr] warning: this argument is passed by reference, but would be more efficient if passed by value [INFO] [stderr] --> src/parser.rs:39:40 [INFO] [stderr] | [INFO] [stderr] 39 | pub fn from_lex_operator(operator: &Operator) -> ShuntOperator { [INFO] [stderr] | ^^^^^^^^^ help: consider passing by value instead: `Operator` [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: this loop could be written as a `while let` loop [INFO] [stderr] --> src/parser.rs:189:5 [INFO] [stderr] | [INFO] [stderr] 189 | / loop { [INFO] [stderr] 190 | | // Advance one token further into the stream [INFO] [stderr] 191 | | let token = match tokens.first() { [INFO] [stderr] 192 | | Some(token) => token, [INFO] [stderr] ... | [INFO] [stderr] 281 | | } [INFO] [stderr] 282 | | } [INFO] [stderr] | |_____^ help: try: `while let Some(token) = tokens.first() { .. }` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::while_let_loop)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#while_let_loop [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/parser.rs:211:25 [INFO] [stderr] | [INFO] [stderr] 211 | / match state.last_was_operator { [INFO] [stderr] 212 | | true => ShuntOperator::UnaryPlus, [INFO] [stderr] 213 | | false => ShuntOperator::Plus, [INFO] [stderr] 214 | | } [INFO] [stderr] | |_________________________^ help: consider using an if/else expression: `if state.last_was_operator { ShuntOperator::UnaryPlus } else { ShuntOperator::Plus }` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::match_bool)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_bool [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/parser.rs:217:25 [INFO] [stderr] | [INFO] [stderr] 217 | / match state.last_was_operator { [INFO] [stderr] 218 | | true => ShuntOperator::UnaryMinus, [INFO] [stderr] 219 | | false => ShuntOperator::Minus, [INFO] [stderr] 220 | | } [INFO] [stderr] | |_________________________^ help: consider using an if/else expression: `if state.last_was_operator { ShuntOperator::UnaryMinus } else { ShuntOperator::Minus }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_bool [INFO] [stderr] [INFO] [stderr] warning: this loop could be written as a `while let` loop [INFO] [stderr] --> src/parser.rs:228:21 [INFO] [stderr] | [INFO] [stderr] 228 | / loop { [INFO] [stderr] 229 | | match state.operator_stack.last() { [INFO] [stderr] 230 | | Some(top_operator) => { [INFO] [stderr] 231 | | // For left-associative operators, we clear all [INFO] [stderr] ... | [INFO] [stderr] 250 | | state.clear_one_operator(); [INFO] [stderr] 251 | | } [INFO] [stderr] | |_____________________^ help: try: `while let Some(top_operator) = state.operator_stack.last() { .. }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#while_let_loop [INFO] [stderr] [INFO] [stderr] error: strict comparison of f32 or f64 [INFO] [stderr] --> src/evaluate.rs:35:9 [INFO] [stderr] | [INFO] [stderr] 35 | assert_eq!(result, expected); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[deny(clippy::float_cmp)] on by default [INFO] [stderr] note: std::f32::EPSILON and std::f64::EPSILON are available. [INFO] [stderr] --> src/evaluate.rs:35:9 [INFO] [stderr] | [INFO] [stderr] 35 | assert_eq!(result, expected); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#float_cmp [INFO] [stderr] = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) [INFO] [stderr] [INFO] [stderr] error: aborting due to previous error [INFO] [stderr] [INFO] [stderr] error: Could not compile `shunting-rust`. [INFO] [stderr] [INFO] [stderr] To learn more, run the command again with --verbose. [INFO] running `"docker" "inspect" "3807f478d438175622b7a9e00605b7082f55b2714522e65762b190969fc01719"` [INFO] running `"docker" "rm" "-f" "3807f478d438175622b7a9e00605b7082f55b2714522e65762b190969fc01719"` [INFO] [stdout] 3807f478d438175622b7a9e00605b7082f55b2714522e65762b190969fc01719