[INFO] crate nodes 0.1.0 is already in cache [INFO] extracting crate nodes 0.1.0 into work/ex/clippy-test-run/sources/stable/reg/nodes/0.1.0 [INFO] extracting crate nodes 0.1.0 into work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/reg/nodes/0.1.0 [INFO] validating manifest of nodes-0.1.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 nodes-0.1.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 nodes-0.1.0 [INFO] finished frobbing nodes-0.1.0 [INFO] frobbed toml for nodes-0.1.0 written to work/ex/clippy-test-run/sources/stable/reg/nodes/0.1.0/Cargo.toml [INFO] started frobbing nodes-0.1.0 [INFO] finished frobbing nodes-0.1.0 [INFO] frobbed toml for nodes-0.1.0 written to work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/reg/nodes/0.1.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 nodes-0.1.0 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/reg/nodes/0.1.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" "-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] d1512ccf029e8708b77a3f197624e2b961072ad77967fb0befc8e703320c75b2 [INFO] running `"docker" "start" "-a" "d1512ccf029e8708b77a3f197624e2b961072ad77967fb0befc8e703320c75b2"` [INFO] [stderr] Checking nodes v0.1.0 (/opt/crater/workdir) [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/config.rs:235:9 [INFO] [stderr] | [INFO] [stderr] 235 | env::home_dir().expect("Could not retrieve home directory") [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/config.rs:235:9 [INFO] [stderr] | [INFO] [stderr] 235 | env::home_dir().expect("Could not retrieve home directory") [INFO] [stderr] | ^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(deprecated)] on by default [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to both the expression and the patterns [INFO] [stderr] --> src/config.rs:67:24 [INFO] [stderr] | [INFO] [stderr] 67 | Some(a) => match &a.clone().try_into::() { [INFO] [stderr] | ________________________^ [INFO] [stderr] 68 | | &Ok(ref a) => Config::parse_storage_config(a)?, [INFO] [stderr] 69 | | _ => return Err(ConfigError::InvalidStorage), [INFO] [stderr] 70 | | }, [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: try [INFO] [stderr] | [INFO] [stderr] 67 | Some(a) => match a.clone().try_into::() { [INFO] [stderr] 68 | Ok(ref a) => Config::parse_storage_config(a)?, [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: unused label `'outer` [INFO] [stderr] --> src/config.rs:105:9 [INFO] [stderr] | [INFO] [stderr] 105 | / 'outer: loop { [INFO] [stderr] 106 | | let mut npath = PathBuf::from(cwd.clone()); [INFO] [stderr] 107 | | for spath in &self.storage.local_search_paths { [INFO] [stderr] 108 | | npath.push(spath); [INFO] [stderr] ... | [INFO] [stderr] 129 | | } [INFO] [stderr] 130 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::unused_label)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unused_label [INFO] [stderr] [INFO] [stderr] warning: identical conversion [INFO] [stderr] --> src/config.rs:106:29 [INFO] [stderr] | [INFO] [stderr] 106 | let mut npath = PathBuf::from(cwd.clone()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider removing `PathBuf::from()`: `cwd.clone()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::identity_conversion)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#identity_conversion [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to both the expression and the patterns [INFO] [stderr] --> src/config.rs:196:25 [INFO] [stderr] | [INFO] [stderr] 196 | let cstorages = match &config.storages { [INFO] [stderr] | _________________________^ [INFO] [stderr] 197 | | &Some(ref a) => a, [INFO] [stderr] 198 | | &None => return Err(ConfigError::NoStorages), [INFO] [stderr] 199 | | }; [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 196 | let cstorages = match config.storages { [INFO] [stderr] 197 | Some(ref a) => a, [INFO] [stderr] 198 | None => return Err(ConfigError::NoStorages), [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: use of `unwrap_or` followed by a function call [INFO] [stderr] --> src/config.rs:223:14 [INFO] [stderr] | [INFO] [stderr] 223 | .unwrap_or(cstorages.first().unwrap().name.clone()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|| cstorages.first().unwrap().name.clone())` [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: use of `or_insert` followed by a function call [INFO] [stderr] --> src/toml.rs:121:26 [INFO] [stderr] | [INFO] [stderr] 121 | next = e.or_insert(Value::new()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `or_insert_with(Value::new)` [INFO] [stderr] | [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: you don't need to add `&` to all patterns [INFO] [stderr] --> src/pattern.rs:42:5 [INFO] [stderr] | [INFO] [stderr] 42 | / match a { [INFO] [stderr] 43 | | &toml::Value::String(ref s) => s == b, [INFO] [stderr] 44 | | &toml::Value::Integer(ref i) => { [INFO] [stderr] 45 | | if let Ok(b) = i64::from_str(b) { *i == b } else { false } [INFO] [stderr] ... | [INFO] [stderr] 58 | | }, _ => false [INFO] [stderr] 59 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [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] 42 | match *a { [INFO] [stderr] 43 | toml::Value::String(ref s) => s == b, [INFO] [stderr] 44 | toml::Value::Integer(ref i) => { [INFO] [stderr] 45 | if let Ok(b) = i64::from_str(b) { *i == b } else { false } [INFO] [stderr] 46 | } toml::Value::Float(ref f) => { [INFO] [stderr] 47 | if let Ok(b) = f64::from_str(b) { *f == b } else { false } [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] error: strict comparison of f32 or f64 [INFO] [stderr] --> src/pattern.rs:47:47 [INFO] [stderr] | [INFO] [stderr] 47 | if let Ok(b) = f64::from_str(b) { *f == b } else { false } [INFO] [stderr] | ^^^^^^^ help: consider comparing them within some error: `(*f - b).abs() < error` [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/pattern.rs:47:47 [INFO] [stderr] | [INFO] [stderr] 47 | if let Ok(b) = f64::from_str(b) { *f == b } else { false } [INFO] [stderr] | ^^^^^^^ [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#float_cmp [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/pattern.rs:62:36 [INFO] [stderr] | [INFO] [stderr] 62 | pub fn matches(a: &toml::Value, b: &Vec) -> bool { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^ help: change this to: `&[MatchString]` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::ptr_arg)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/pattern.rs:63:5 [INFO] [stderr] | [INFO] [stderr] 63 | / match a { [INFO] [stderr] 64 | | &toml::Value::String(ref s) => { [INFO] [stderr] 65 | | b.iter().map(|given| { [INFO] [stderr] 66 | | match given { [INFO] [stderr] ... | [INFO] [stderr] 91 | | }, _ => false [INFO] [stderr] 92 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [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] 63 | match *a { [INFO] [stderr] 64 | toml::Value::String(ref s) => { [INFO] [stderr] 65 | b.iter().map(|given| { [INFO] [stderr] 66 | match given { [INFO] [stderr] 67 | &MatchString::Match(ref a) => a.is_match(&s), [INFO] [stderr] 68 | &MatchString::String(ref a) => s.contains(a), [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/pattern.rs:66:17 [INFO] [stderr] | [INFO] [stderr] 66 | / match given { [INFO] [stderr] 67 | | &MatchString::Match(ref a) => a.is_match(&s), [INFO] [stderr] 68 | | &MatchString::String(ref a) => s.contains(a), [INFO] [stderr] 69 | | } [INFO] [stderr] | |_________________^ [INFO] [stderr] | [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] 66 | match *given { [INFO] [stderr] 67 | MatchString::Match(ref a) => a.is_match(&s), [INFO] [stderr] 68 | MatchString::String(ref a) => s.contains(a), [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/pattern.rs:74:31 [INFO] [stderr] | [INFO] [stderr] 74 | let val = match val { [INFO] [stderr] | _______________________________^ [INFO] [stderr] 75 | | &toml::Value::String(ref a) => a, [INFO] [stderr] 76 | | _ => return false, [INFO] [stderr] 77 | | }; [INFO] [stderr] | |_____________________^ [INFO] [stderr] | [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] 74 | let val = match *val { [INFO] [stderr] 75 | toml::Value::String(ref a) => a, [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/pattern.rs:79:21 [INFO] [stderr] | [INFO] [stderr] 79 | / match given { [INFO] [stderr] 80 | | &MatchString::Match(ref a) => [INFO] [stderr] 81 | | if a.is_match(&val) { continue 'outer; }, [INFO] [stderr] 82 | | &MatchString::String(ref a) => [INFO] [stderr] 83 | | if val == a { continue 'outer; }, [INFO] [stderr] 84 | | } [INFO] [stderr] | |_____________________^ [INFO] [stderr] | [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] 79 | match *given { [INFO] [stderr] 80 | MatchString::Match(ref a) => [INFO] [stderr] 81 | if a.is_match(&val) { continue 'outer; }, [INFO] [stderr] 82 | MatchString::String(ref a) => [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to both the expression and the patterns [INFO] [stderr] --> src/pattern.rs:102:5 [INFO] [stderr] | [INFO] [stderr] 102 | / match &cond.cond_type { [INFO] [stderr] 103 | | &CondType::Exists => true, [INFO] [stderr] 104 | | &CondType::Equals(ref value) => equals(&v, &value), [INFO] [stderr] 105 | | &CondType::Matches(ref value) => matches(&v, &value), [INFO] [stderr] ... | [INFO] [stderr] 110 | | } [INFO] [stderr] 111 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 102 | match cond.cond_type { [INFO] [stderr] 103 | CondType::Exists => true, [INFO] [stderr] 104 | CondType::Equals(ref value) => equals(&v, &value), [INFO] [stderr] 105 | CondType::Matches(ref value) => matches(&v, &value), [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to both the expression and the patterns [INFO] [stderr] --> src/pattern.rs:115:5 [INFO] [stderr] | [INFO] [stderr] 115 | / match &cond.data { [INFO] [stderr] 116 | | &CondNodeType::Not => { [INFO] [stderr] 117 | | !node_matches(&val, cond.children.first() [INFO] [stderr] 118 | | .expect("Invalid CondNode: 'not' needs a child")) [INFO] [stderr] ... | [INFO] [stderr] 137 | | } [INFO] [stderr] 138 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 115 | match cond.data { [INFO] [stderr] 116 | CondNodeType::Not => { [INFO] [stderr] 117 | !node_matches(&val, cond.children.first() [INFO] [stderr] 118 | .expect("Invalid CondNode: 'not' needs a child")) [INFO] [stderr] 119 | }, CondNodeType::And => { [INFO] [stderr] 120 | for child in &cond.children { [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to both the expression and the patterns [INFO] [stderr] --> src/pattern.rs:142:5 [INFO] [stderr] | [INFO] [stderr] 142 | / match &cond.data { [INFO] [stderr] 143 | | &CondNodeType::Not => { [INFO] [stderr] 144 | | print!("!("); [INFO] [stderr] 145 | | print_cond(cond.children.first() [INFO] [stderr] ... | [INFO] [stderr] 198 | | } [INFO] [stderr] 199 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 142 | match cond.data { [INFO] [stderr] 143 | CondNodeType::Not => { [INFO] [stderr] 144 | print!("!("); [INFO] [stderr] 145 | print_cond(cond.children.first() [INFO] [stderr] 146 | .expect("Invalid CondNode: 'not' needs a child")); [INFO] [stderr] 147 | print!(")"); [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to both the expression and the patterns [INFO] [stderr] --> src/pattern.rs:173:13 [INFO] [stderr] | [INFO] [stderr] 173 | / match &cond.cond_type { [INFO] [stderr] 174 | | &CondType::Exists => [INFO] [stderr] 175 | | print!("exists({})", &cond.entry), [INFO] [stderr] 176 | | &CondType::Equals(ref value) => [INFO] [stderr] ... | [INFO] [stderr] 196 | | } _ => print!(""), [INFO] [stderr] 197 | | } [INFO] [stderr] | |_____________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 173 | match cond.cond_type { [INFO] [stderr] 174 | CondType::Exists => [INFO] [stderr] 175 | print!("exists({})", &cond.entry), [INFO] [stderr] 176 | CondType::Equals(ref value) => [INFO] [stderr] 177 | print!("({} == {})", &cond.entry, value), [INFO] [stderr] 178 | CondType::Matches(ref vals) => { [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/pattern.rs:188:25 [INFO] [stderr] | [INFO] [stderr] 188 | / match v { [INFO] [stderr] 189 | | &MatchString::String(ref a) => print!("{}", a), [INFO] [stderr] 190 | | &MatchString::Match(ref a) => [INFO] [stderr] 191 | | print!("<{}>", a.as_str()), [INFO] [stderr] 192 | | } [INFO] [stderr] | |_________________________^ [INFO] [stderr] | [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] 188 | match *v { [INFO] [stderr] 189 | MatchString::String(ref a) => print!("{}", a), [INFO] [stderr] 190 | MatchString::Match(ref a) => [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: redundant closure found [INFO] [stderr] --> src/pattern.rs:220:1 [INFO] [stderr] | [INFO] [stderr] 220 | / named!(cond_value, switch!( [INFO] [stderr] 221 | | opt!(alt_complete!( [INFO] [stderr] 222 | | tag!(":") | [INFO] [stderr] 223 | | tag!("=") | [INFO] [stderr] ... | [INFO] [stderr] 242 | | */ [INFO] [stderr] 243 | | )); [INFO] [stderr] | |___^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::redundant_closure)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [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] warning: length comparison to zero [INFO] [stderr] --> src/pattern.rs:294:16 [INFO] [stderr] | [INFO] [stderr] 294 | if rest.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!rest.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] error: aborting due to previous error [INFO] [stderr] [INFO] [stderr] error: Could not compile `nodes`. [INFO] [stderr] warning: build failed, waiting for other jobs to finish... [INFO] [stderr] warning: you don't need to add `&` to both the expression and the patterns [INFO] [stderr] --> src/config.rs:67:24 [INFO] [stderr] | [INFO] [stderr] 67 | Some(a) => match &a.clone().try_into::() { [INFO] [stderr] | ________________________^ [INFO] [stderr] 68 | | &Ok(ref a) => Config::parse_storage_config(a)?, [INFO] [stderr] 69 | | _ => return Err(ConfigError::InvalidStorage), [INFO] [stderr] 70 | | }, [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: try [INFO] [stderr] | [INFO] [stderr] 67 | Some(a) => match a.clone().try_into::() { [INFO] [stderr] 68 | Ok(ref a) => Config::parse_storage_config(a)?, [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: unused label `'outer` [INFO] [stderr] --> src/config.rs:105:9 [INFO] [stderr] | [INFO] [stderr] 105 | / 'outer: loop { [INFO] [stderr] 106 | | let mut npath = PathBuf::from(cwd.clone()); [INFO] [stderr] 107 | | for spath in &self.storage.local_search_paths { [INFO] [stderr] 108 | | npath.push(spath); [INFO] [stderr] ... | [INFO] [stderr] 129 | | } [INFO] [stderr] 130 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::unused_label)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unused_label [INFO] [stderr] [INFO] [stderr] warning: identical conversion [INFO] [stderr] --> src/config.rs:106:29 [INFO] [stderr] | [INFO] [stderr] 106 | let mut npath = PathBuf::from(cwd.clone()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider removing `PathBuf::from()`: `cwd.clone()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::identity_conversion)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#identity_conversion [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to both the expression and the patterns [INFO] [stderr] --> src/config.rs:196:25 [INFO] [stderr] | [INFO] [stderr] 196 | let cstorages = match &config.storages { [INFO] [stderr] | _________________________^ [INFO] [stderr] 197 | | &Some(ref a) => a, [INFO] [stderr] 198 | | &None => return Err(ConfigError::NoStorages), [INFO] [stderr] 199 | | }; [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 196 | let cstorages = match config.storages { [INFO] [stderr] 197 | Some(ref a) => a, [INFO] [stderr] 198 | None => return Err(ConfigError::NoStorages), [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: use of `unwrap_or` followed by a function call [INFO] [stderr] --> src/config.rs:223:14 [INFO] [stderr] | [INFO] [stderr] 223 | .unwrap_or(cstorages.first().unwrap().name.clone()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|| cstorages.first().unwrap().name.clone())` [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: use of `or_insert` followed by a function call [INFO] [stderr] --> src/toml.rs:121:26 [INFO] [stderr] | [INFO] [stderr] 121 | next = e.or_insert(Value::new()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `or_insert_with(Value::new)` [INFO] [stderr] | [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: you don't need to add `&` to all patterns [INFO] [stderr] --> src/pattern.rs:42:5 [INFO] [stderr] | [INFO] [stderr] 42 | / match a { [INFO] [stderr] 43 | | &toml::Value::String(ref s) => s == b, [INFO] [stderr] 44 | | &toml::Value::Integer(ref i) => { [INFO] [stderr] 45 | | if let Ok(b) = i64::from_str(b) { *i == b } else { false } [INFO] [stderr] ... | [INFO] [stderr] 58 | | }, _ => false [INFO] [stderr] 59 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [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] 42 | match *a { [INFO] [stderr] 43 | toml::Value::String(ref s) => s == b, [INFO] [stderr] 44 | toml::Value::Integer(ref i) => { [INFO] [stderr] 45 | if let Ok(b) = i64::from_str(b) { *i == b } else { false } [INFO] [stderr] 46 | } toml::Value::Float(ref f) => { [INFO] [stderr] 47 | if let Ok(b) = f64::from_str(b) { *f == b } else { false } [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] error: strict comparison of f32 or f64 [INFO] [stderr] --> src/pattern.rs:47:47 [INFO] [stderr] | [INFO] [stderr] 47 | if let Ok(b) = f64::from_str(b) { *f == b } else { false } [INFO] [stderr] | ^^^^^^^ help: consider comparing them within some error: `(*f - b).abs() < error` [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/pattern.rs:47:47 [INFO] [stderr] | [INFO] [stderr] 47 | if let Ok(b) = f64::from_str(b) { *f == b } else { false } [INFO] [stderr] | ^^^^^^^ [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#float_cmp [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/pattern.rs:62:36 [INFO] [stderr] | [INFO] [stderr] 62 | pub fn matches(a: &toml::Value, b: &Vec) -> bool { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^ help: change this to: `&[MatchString]` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::ptr_arg)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/pattern.rs:63:5 [INFO] [stderr] | [INFO] [stderr] 63 | / match a { [INFO] [stderr] 64 | | &toml::Value::String(ref s) => { [INFO] [stderr] 65 | | b.iter().map(|given| { [INFO] [stderr] 66 | | match given { [INFO] [stderr] ... | [INFO] [stderr] 91 | | }, _ => false [INFO] [stderr] 92 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [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] 63 | match *a { [INFO] [stderr] 64 | toml::Value::String(ref s) => { [INFO] [stderr] 65 | b.iter().map(|given| { [INFO] [stderr] 66 | match given { [INFO] [stderr] 67 | &MatchString::Match(ref a) => a.is_match(&s), [INFO] [stderr] 68 | &MatchString::String(ref a) => s.contains(a), [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/pattern.rs:66:17 [INFO] [stderr] | [INFO] [stderr] 66 | / match given { [INFO] [stderr] 67 | | &MatchString::Match(ref a) => a.is_match(&s), [INFO] [stderr] 68 | | &MatchString::String(ref a) => s.contains(a), [INFO] [stderr] 69 | | } [INFO] [stderr] | |_________________^ [INFO] [stderr] | [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] 66 | match *given { [INFO] [stderr] 67 | MatchString::Match(ref a) => a.is_match(&s), [INFO] [stderr] 68 | MatchString::String(ref a) => s.contains(a), [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/pattern.rs:74:31 [INFO] [stderr] | [INFO] [stderr] 74 | let val = match val { [INFO] [stderr] | _______________________________^ [INFO] [stderr] 75 | | &toml::Value::String(ref a) => a, [INFO] [stderr] 76 | | _ => return false, [INFO] [stderr] 77 | | }; [INFO] [stderr] | |_____________________^ [INFO] [stderr] | [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] 74 | let val = match *val { [INFO] [stderr] 75 | toml::Value::String(ref a) => a, [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/pattern.rs:79:21 [INFO] [stderr] | [INFO] [stderr] 79 | / match given { [INFO] [stderr] 80 | | &MatchString::Match(ref a) => [INFO] [stderr] 81 | | if a.is_match(&val) { continue 'outer; }, [INFO] [stderr] 82 | | &MatchString::String(ref a) => [INFO] [stderr] 83 | | if val == a { continue 'outer; }, [INFO] [stderr] 84 | | } [INFO] [stderr] | |_____________________^ [INFO] [stderr] | [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] 79 | match *given { [INFO] [stderr] 80 | MatchString::Match(ref a) => [INFO] [stderr] 81 | if a.is_match(&val) { continue 'outer; }, [INFO] [stderr] 82 | MatchString::String(ref a) => [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to both the expression and the patterns [INFO] [stderr] --> src/pattern.rs:102:5 [INFO] [stderr] | [INFO] [stderr] 102 | / match &cond.cond_type { [INFO] [stderr] 103 | | &CondType::Exists => true, [INFO] [stderr] 104 | | &CondType::Equals(ref value) => equals(&v, &value), [INFO] [stderr] 105 | | &CondType::Matches(ref value) => matches(&v, &value), [INFO] [stderr] ... | [INFO] [stderr] 110 | | } [INFO] [stderr] 111 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 102 | match cond.cond_type { [INFO] [stderr] 103 | CondType::Exists => true, [INFO] [stderr] 104 | CondType::Equals(ref value) => equals(&v, &value), [INFO] [stderr] 105 | CondType::Matches(ref value) => matches(&v, &value), [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to both the expression and the patterns [INFO] [stderr] --> src/pattern.rs:115:5 [INFO] [stderr] | [INFO] [stderr] 115 | / match &cond.data { [INFO] [stderr] 116 | | &CondNodeType::Not => { [INFO] [stderr] 117 | | !node_matches(&val, cond.children.first() [INFO] [stderr] 118 | | .expect("Invalid CondNode: 'not' needs a child")) [INFO] [stderr] ... | [INFO] [stderr] 137 | | } [INFO] [stderr] 138 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 115 | match cond.data { [INFO] [stderr] 116 | CondNodeType::Not => { [INFO] [stderr] 117 | !node_matches(&val, cond.children.first() [INFO] [stderr] 118 | .expect("Invalid CondNode: 'not' needs a child")) [INFO] [stderr] 119 | }, CondNodeType::And => { [INFO] [stderr] 120 | for child in &cond.children { [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to both the expression and the patterns [INFO] [stderr] --> src/pattern.rs:142:5 [INFO] [stderr] | [INFO] [stderr] 142 | / match &cond.data { [INFO] [stderr] 143 | | &CondNodeType::Not => { [INFO] [stderr] 144 | | print!("!("); [INFO] [stderr] 145 | | print_cond(cond.children.first() [INFO] [stderr] ... | [INFO] [stderr] 198 | | } [INFO] [stderr] 199 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 142 | match cond.data { [INFO] [stderr] 143 | CondNodeType::Not => { [INFO] [stderr] 144 | print!("!("); [INFO] [stderr] 145 | print_cond(cond.children.first() [INFO] [stderr] 146 | .expect("Invalid CondNode: 'not' needs a child")); [INFO] [stderr] 147 | print!(")"); [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to both the expression and the patterns [INFO] [stderr] --> src/pattern.rs:173:13 [INFO] [stderr] | [INFO] [stderr] 173 | / match &cond.cond_type { [INFO] [stderr] 174 | | &CondType::Exists => [INFO] [stderr] 175 | | print!("exists({})", &cond.entry), [INFO] [stderr] 176 | | &CondType::Equals(ref value) => [INFO] [stderr] ... | [INFO] [stderr] 196 | | } _ => print!(""), [INFO] [stderr] 197 | | } [INFO] [stderr] | |_____________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 173 | match cond.cond_type { [INFO] [stderr] 174 | CondType::Exists => [INFO] [stderr] 175 | print!("exists({})", &cond.entry), [INFO] [stderr] 176 | CondType::Equals(ref value) => [INFO] [stderr] 177 | print!("({} == {})", &cond.entry, value), [INFO] [stderr] 178 | CondType::Matches(ref vals) => { [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/pattern.rs:188:25 [INFO] [stderr] | [INFO] [stderr] 188 | / match v { [INFO] [stderr] 189 | | &MatchString::String(ref a) => print!("{}", a), [INFO] [stderr] 190 | | &MatchString::Match(ref a) => [INFO] [stderr] 191 | | print!("<{}>", a.as_str()), [INFO] [stderr] 192 | | } [INFO] [stderr] | |_________________________^ [INFO] [stderr] | [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] 188 | match *v { [INFO] [stderr] 189 | MatchString::String(ref a) => print!("{}", a), [INFO] [stderr] 190 | MatchString::Match(ref a) => [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: redundant closure found [INFO] [stderr] --> src/pattern.rs:220:1 [INFO] [stderr] | [INFO] [stderr] 220 | / named!(cond_value, switch!( [INFO] [stderr] 221 | | opt!(alt_complete!( [INFO] [stderr] 222 | | tag!(":") | [INFO] [stderr] 223 | | tag!("=") | [INFO] [stderr] ... | [INFO] [stderr] 242 | | */ [INFO] [stderr] 243 | | )); [INFO] [stderr] | |___^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::redundant_closure)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure [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] warning: length comparison to zero [INFO] [stderr] --> src/pattern.rs:294:16 [INFO] [stderr] | [INFO] [stderr] 294 | if rest.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!rest.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] error: aborting due to previous error [INFO] [stderr] [INFO] [stderr] error: Could not compile `nodes`. [INFO] [stderr] [INFO] [stderr] To learn more, run the command again with --verbose. [INFO] running `"docker" "inspect" "d1512ccf029e8708b77a3f197624e2b961072ad77967fb0befc8e703320c75b2"` [INFO] running `"docker" "rm" "-f" "d1512ccf029e8708b77a3f197624e2b961072ad77967fb0befc8e703320c75b2"` [INFO] [stdout] d1512ccf029e8708b77a3f197624e2b961072ad77967fb0befc8e703320c75b2