[INFO] crate clargs 1.0.0 is already in cache [INFO] extracting crate clargs 1.0.0 into work/ex/clippy-test-run/sources/stable/reg/clargs/1.0.0 [INFO] extracting crate clargs 1.0.0 into work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/reg/clargs/1.0.0 [INFO] validating manifest of clargs-1.0.0 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 clargs-1.0.0 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 clargs-1.0.0 [INFO] finished frobbing clargs-1.0.0 [INFO] frobbed toml for clargs-1.0.0 written to work/ex/clippy-test-run/sources/stable/reg/clargs/1.0.0/Cargo.toml [INFO] started frobbing clargs-1.0.0 [INFO] finished frobbing clargs-1.0.0 [INFO] frobbed toml for clargs-1.0.0 written to work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/reg/clargs/1.0.0/Cargo.toml [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "generate-lockfile" "--manifest-path" "Cargo.toml" "-Zno-index-update"` [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "generate-lockfile" "--manifest-path" "Cargo.toml" "-Zno-index-update"` [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 clargs-1.0.0 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-1/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/reg/clargs/1.0.0:/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] 38e02a9c4793961702efbe15c51e770eae6ee86fd324f3393918134930760258 [INFO] running `"docker" "start" "-a" "38e02a9c4793961702efbe15c51e770eae6ee86fd324f3393918134930760258"` [INFO] [stderr] Checking clargs v1.0.0 (/opt/crater/workdir) [INFO] [stderr] warning: this `else { if .. }` block can be collapsed [INFO] [stderr] --> src/parse.rs:63:16 [INFO] [stderr] | [INFO] [stderr] 63 | } else { [INFO] [stderr] | ________________^ [INFO] [stderr] 64 | | if aliased { [INFO] [stderr] 65 | | Err(ParsingError::ParameterDuplicationAlias(target.to_string(), name.to_string())) [INFO] [stderr] 66 | | } else { [INFO] [stderr] 67 | | Err(ParsingError::ParameterDuplication(target.to_string())) [INFO] [stderr] 68 | | } [INFO] [stderr] 69 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::collapsible_if)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 63 | } else if aliased { [INFO] [stderr] 64 | Err(ParsingError::ParameterDuplicationAlias(target.to_string(), name.to_string())) [INFO] [stderr] 65 | } else { [INFO] [stderr] 66 | Err(ParsingError::ParameterDuplication(target.to_string())) [INFO] [stderr] 67 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: this `else { if .. }` block can be collapsed [INFO] [stderr] --> src/parse.rs:63:16 [INFO] [stderr] | [INFO] [stderr] 63 | } else { [INFO] [stderr] | ________________^ [INFO] [stderr] 64 | | if aliased { [INFO] [stderr] 65 | | Err(ParsingError::ParameterDuplicationAlias(target.to_string(), name.to_string())) [INFO] [stderr] 66 | | } else { [INFO] [stderr] 67 | | Err(ParsingError::ParameterDuplication(target.to_string())) [INFO] [stderr] 68 | | } [INFO] [stderr] 69 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::collapsible_if)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 63 | } else if aliased { [INFO] [stderr] 64 | Err(ParsingError::ParameterDuplicationAlias(target.to_string(), name.to_string())) [INFO] [stderr] 65 | } else { [INFO] [stderr] 66 | Err(ParsingError::ParameterDuplication(target.to_string())) [INFO] [stderr] 67 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you should consider deriving a `Default` implementation for `parsing_config::ParsingConfig` [INFO] [stderr] --> src/parsing_config.rs:177:5 [INFO] [stderr] | [INFO] [stderr] 177 | / pub fn new() -> Self { [INFO] [stderr] 178 | | Self { [INFO] [stderr] 179 | | dh_marker: true, [INFO] [stderr] 180 | | store_dh_marker: false, [INFO] [stderr] ... | [INFO] [stderr] 198 | | } [INFO] [stderr] 199 | | } [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] 153 | #[derive(Default)] [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/parsing_config.rs:369:28 [INFO] [stderr] | [INFO] [stderr] 369 | let target = match self.options.get(&target).unwrap() { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&self.options[&target]` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::get_unwrap)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/parse.rs:77:47 [INFO] [stderr] | [INFO] [stderr] 77 | ArgDesc::Alias(alias_target) => match config.options.get(alias_target).unwrap() { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&config.options[alias_target]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: the function has a cyclomatic complexity of 38 [INFO] [stderr] --> src/parse.rs:90:1 [INFO] [stderr] | [INFO] [stderr] 90 | / pub fn parse>(mut args: I, config: &ParsingConfig) -> Result { [INFO] [stderr] 91 | | let name = args.next().unwrap_or(String::new()); [INFO] [stderr] 92 | | let mut flags = HashSet::new(); [INFO] [stderr] 93 | | let mut params = HashMap::new(); [INFO] [stderr] ... | [INFO] [stderr] 397 | | }) [INFO] [stderr] 398 | | } [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: you should consider deriving a `Default` implementation for `parsing_config::ParsingConfig` [INFO] [stderr] --> src/parsing_config.rs:177:5 [INFO] [stderr] | [INFO] [stderr] 177 | / pub fn new() -> Self { [INFO] [stderr] 178 | | Self { [INFO] [stderr] 179 | | dh_marker: true, [INFO] [stderr] 180 | | store_dh_marker: false, [INFO] [stderr] ... | [INFO] [stderr] 198 | | } [INFO] [stderr] 199 | | } [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] 153 | #[derive(Default)] [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: use of `unwrap_or` followed by a call to `new` [INFO] [stderr] --> src/parse.rs:91:16 [INFO] [stderr] | [INFO] [stderr] 91 | let name = args.next().unwrap_or(String::new()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `args.next().unwrap_or_default()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::or_fun_call)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#or_fun_call [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/parse.rs:166:16 [INFO] [stderr] | [INFO] [stderr] 166 | if opts.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `opts.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: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/parsing_config.rs:369:28 [INFO] [stderr] | [INFO] [stderr] 369 | let target = match self.options.get(&target).unwrap() { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&self.options[&target]` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::get_unwrap)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: the loop variable `i` is only used to index `param_opts`. [INFO] [stderr] --> src/parse.rs:261:26 [INFO] [stderr] | [INFO] [stderr] 261 | for i in 0..param_opts.len() { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::needless_range_loop)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_range_loop [INFO] [stderr] help: consider using an iterator [INFO] [stderr] | [INFO] [stderr] 261 | for in ¶m_opts { [INFO] [stderr] | ^^^^^^ ^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: redundant pattern matching, consider using `is_some()` [INFO] [stderr] --> src/parse.rs:365:23 [INFO] [stderr] | [INFO] [stderr] 365 | } else if let Some(_) = config.subcmds.get(&arg) { [INFO] [stderr] | ________________- ^^^^^^^ [INFO] [stderr] 366 | | subcommand.push(arg); [INFO] [stderr] 367 | | while let Some(arg) = args.next() { [INFO] [stderr] 368 | | subcommand.push(arg); [INFO] [stderr] 369 | | } [INFO] [stderr] 370 | | break; [INFO] [stderr] 371 | | } [INFO] [stderr] | |_________- help: try this: `if config.subcmds.get(&arg).is_some()` [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: length comparison to zero [INFO] [stderr] --> src/parse.rs:376:34 [INFO] [stderr] | [INFO] [stderr] 376 | if config.subcmd_required && subcommand.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `subcommand.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: length comparison to zero [INFO] [stderr] --> src/parse.rs:387:8 [INFO] [stderr] | [INFO] [stderr] 387 | if required_params.len() != 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!required_params.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: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/parse.rs:77:47 [INFO] [stderr] | [INFO] [stderr] 77 | ArgDesc::Alias(alias_target) => match config.options.get(alias_target).unwrap() { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&config.options[alias_target]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: the function has a cyclomatic complexity of 38 [INFO] [stderr] --> src/parse.rs:90:1 [INFO] [stderr] | [INFO] [stderr] 90 | / pub fn parse>(mut args: I, config: &ParsingConfig) -> Result { [INFO] [stderr] 91 | | let name = args.next().unwrap_or(String::new()); [INFO] [stderr] 92 | | let mut flags = HashSet::new(); [INFO] [stderr] 93 | | let mut params = HashMap::new(); [INFO] [stderr] ... | [INFO] [stderr] 397 | | }) [INFO] [stderr] 398 | | } [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: use of `unwrap_or` followed by a call to `new` [INFO] [stderr] --> src/parse.rs:91:16 [INFO] [stderr] | [INFO] [stderr] 91 | let name = args.next().unwrap_or(String::new()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `args.next().unwrap_or_default()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::or_fun_call)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#or_fun_call [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/parse.rs:166:16 [INFO] [stderr] | [INFO] [stderr] 166 | if opts.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `opts.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: the loop variable `i` is only used to index `param_opts`. [INFO] [stderr] --> src/parse.rs:261:26 [INFO] [stderr] | [INFO] [stderr] 261 | for i in 0..param_opts.len() { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::needless_range_loop)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_range_loop [INFO] [stderr] help: consider using an iterator [INFO] [stderr] | [INFO] [stderr] 261 | for in ¶m_opts { [INFO] [stderr] | ^^^^^^ ^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: redundant pattern matching, consider using `is_some()` [INFO] [stderr] --> src/parse.rs:365:23 [INFO] [stderr] | [INFO] [stderr] 365 | } else if let Some(_) = config.subcmds.get(&arg) { [INFO] [stderr] | ________________- ^^^^^^^ [INFO] [stderr] 366 | | subcommand.push(arg); [INFO] [stderr] 367 | | while let Some(arg) = args.next() { [INFO] [stderr] 368 | | subcommand.push(arg); [INFO] [stderr] 369 | | } [INFO] [stderr] 370 | | break; [INFO] [stderr] 371 | | } [INFO] [stderr] | |_________- help: try this: `if config.subcmds.get(&arg).is_some()` [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: length comparison to zero [INFO] [stderr] --> src/parse.rs:376:34 [INFO] [stderr] | [INFO] [stderr] 376 | if config.subcmd_required && subcommand.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `subcommand.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: length comparison to zero [INFO] [stderr] --> src/parse.rs:387:8 [INFO] [stderr] | [INFO] [stderr] 387 | if required_params.len() != 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!required_params.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: the function has a cyclomatic complexity of 29 [INFO] [stderr] --> tests/sh_tests.rs:150:1 [INFO] [stderr] | [INFO] [stderr] 150 | / fn sh_test13() { [INFO] [stderr] 151 | | let mut config = clargs::ParsingConfig::new_all_disabled(); [INFO] [stderr] 152 | | config.set_single_hyphen_syntax(true); [INFO] [stderr] 153 | | config.set_parameter_duplication(true); [INFO] [stderr] ... | [INFO] [stderr] 224 | | assert_eq!(result.get_param("k"), Some("-g")); [INFO] [stderr] 225 | | } [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] Finished dev [unoptimized + debuginfo] target(s) in 2.46s [INFO] running `"docker" "inspect" "38e02a9c4793961702efbe15c51e770eae6ee86fd324f3393918134930760258"` [INFO] running `"docker" "rm" "-f" "38e02a9c4793961702efbe15c51e770eae6ee86fd324f3393918134930760258"` [INFO] [stdout] 38e02a9c4793961702efbe15c51e770eae6ee86fd324f3393918134930760258