[INFO] updating cached repository WilsonBerkow/scheme.rs [INFO] running `"git" "fetch" "--all"` [INFO] [stdout] Fetching origin [INFO] [stderr] From git://github.com/WilsonBerkow/scheme.rs [INFO] [stderr] * branch HEAD -> FETCH_HEAD [INFO] running `"git" "clone" "work/cache/sources/gh/WilsonBerkow/scheme.rs" "work/ex/clippy-test-run/sources/stable/gh/WilsonBerkow/scheme.rs"` [INFO] [stderr] Cloning into 'work/ex/clippy-test-run/sources/stable/gh/WilsonBerkow/scheme.rs'... [INFO] [stderr] done. [INFO] running `"git" "clone" "work/cache/sources/gh/WilsonBerkow/scheme.rs" "work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/WilsonBerkow/scheme.rs"` [INFO] [stderr] Cloning into 'work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/WilsonBerkow/scheme.rs'... [INFO] [stderr] done. [INFO] running `"git" "rev-parse" "HEAD"` [INFO] [stdout] 3fc7ee83008115edd0adced0bb42b035ce8e855d [INFO] sha for GitHub repo WilsonBerkow/scheme.rs: 3fc7ee83008115edd0adced0bb42b035ce8e855d [INFO] validating manifest of WilsonBerkow/scheme.rs 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 WilsonBerkow/scheme.rs 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 WilsonBerkow/scheme.rs [INFO] finished frobbing WilsonBerkow/scheme.rs [INFO] frobbed toml for WilsonBerkow/scheme.rs written to work/ex/clippy-test-run/sources/stable/gh/WilsonBerkow/scheme.rs/Cargo.toml [INFO] started frobbing WilsonBerkow/scheme.rs [INFO] finished frobbing WilsonBerkow/scheme.rs [INFO] frobbed toml for WilsonBerkow/scheme.rs written to work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/WilsonBerkow/scheme.rs/Cargo.toml [INFO] crate WilsonBerkow/scheme.rs 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 WilsonBerkow/scheme.rs against stable for clippy-test-run [INFO] running `"docker" "create" "-v" "/mnt/big/crater/work/local/target-dirs/clippy-test-run/worker-1/stable:/opt/crater/target:rw,Z" "-v" "/mnt/big/crater/work/ex/clippy-test-run/sources/stable/gh/WilsonBerkow/scheme.rs:/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] 75ccb1573b4dccc54837bd2b291ea35ab33e8633cf922dbfc3d160677bd33f42 [INFO] running `"docker" "start" "-a" "75ccb1573b4dccc54837bd2b291ea35ab33e8633cf922dbfc3d160677bd33f42"` [INFO] [stderr] Checking scheme v0.1.0 (/opt/crater/workdir) [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/util.rs:70:41 [INFO] [stderr] | [INFO] [stderr] 70 | let range = Range { start: start, end: i }; [INFO] [stderr] | ^^^^^^^^^^^^ help: replace it with: `start` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::redundant_field_names)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/util.rs:157:38 [INFO] [stderr] | [INFO] [stderr] 157 | let mut citer = ClingyIter { iter: iter, item: None }; [INFO] [stderr] | ^^^^^^^^^^ help: replace it with: `iter` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/eval.rs:68:20 [INFO] [stderr] | [INFO] [stderr] 68 | SymTable { items: items } [INFO] [stderr] | ^^^^^^^^^^^^ help: replace it with: `items` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/util.rs:70:41 [INFO] [stderr] | [INFO] [stderr] 70 | let range = Range { start: start, end: i }; [INFO] [stderr] | ^^^^^^^^^^^^ help: replace it with: `start` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::redundant_field_names)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/util.rs:157:38 [INFO] [stderr] | [INFO] [stderr] 157 | let mut citer = ClingyIter { iter: iter, item: None }; [INFO] [stderr] | ^^^^^^^^^^ help: replace it with: `iter` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/eval.rs:68:20 [INFO] [stderr] | [INFO] [stderr] 68 | SymTable { items: items } [INFO] [stderr] | ^^^^^^^^^^^^ help: replace it with: `items` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/parse.rs:54:5 [INFO] [stderr] | [INFO] [stderr] 54 | / return if let Some(&token) = citer.value() { [INFO] [stderr] 55 | | match token { [INFO] [stderr] 56 | | Token::Symbol(sym) => { [INFO] [stderr] 57 | | citer.advance(); [INFO] [stderr] ... | [INFO] [stderr] 96 | | Err(String::from("No tokens in input")) [INFO] [stderr] 97 | | } [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] 54 | if let Some(&token) = citer.value() { [INFO] [stderr] 55 | match token { [INFO] [stderr] 56 | Token::Symbol(sym) => { [INFO] [stderr] 57 | citer.advance(); [INFO] [stderr] 58 | Ok(Sexp::Symbol(String::from(sym))) [INFO] [stderr] 59 | }, [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: this `else { if .. }` block can be collapsed [INFO] [stderr] --> src/util.rs:85:36 [INFO] [stderr] | [INFO] [stderr] 85 | } else { [INFO] [stderr] | ____________________________________^ [INFO] [stderr] 86 | | if i64::from_str(&slice[..1]).is_ok() { [INFO] [stderr] 87 | | parsing = ParsingState::Error(LexError::IllegalNumber(slice)); [INFO] [stderr] 88 | | } else { [INFO] [stderr] ... | [INFO] [stderr] 91 | | } [INFO] [stderr] 92 | | } [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] 85 | } else if i64::from_str(&slice[..1]).is_ok() { [INFO] [stderr] 86 | parsing = ParsingState::Error(LexError::IllegalNumber(slice)); [INFO] [stderr] 87 | } else { [INFO] [stderr] 88 | tokens.push(Token::Symbol(slice)); [INFO] [stderr] 89 | parsing = ParsingState::Ready; [INFO] [stderr] 90 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/eval.rs:172:5 [INFO] [stderr] | [INFO] [stderr] 172 | return Ok(vals); [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: remove `return` as shown: `Ok(vals)` [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/parse.rs:54:5 [INFO] [stderr] | [INFO] [stderr] 54 | / return if let Some(&token) = citer.value() { [INFO] [stderr] 55 | | match token { [INFO] [stderr] 56 | | Token::Symbol(sym) => { [INFO] [stderr] 57 | | citer.advance(); [INFO] [stderr] ... | [INFO] [stderr] 96 | | Err(String::from("No tokens in input")) [INFO] [stderr] 97 | | } [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] 54 | if let Some(&token) = citer.value() { [INFO] [stderr] 55 | match token { [INFO] [stderr] 56 | Token::Symbol(sym) => { [INFO] [stderr] 57 | citer.advance(); [INFO] [stderr] 58 | Ok(Sexp::Symbol(String::from(sym))) [INFO] [stderr] 59 | }, [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: this `else { if .. }` block can be collapsed [INFO] [stderr] --> src/util.rs:85:36 [INFO] [stderr] | [INFO] [stderr] 85 | } else { [INFO] [stderr] | ____________________________________^ [INFO] [stderr] 86 | | if i64::from_str(&slice[..1]).is_ok() { [INFO] [stderr] 87 | | parsing = ParsingState::Error(LexError::IllegalNumber(slice)); [INFO] [stderr] 88 | | } else { [INFO] [stderr] ... | [INFO] [stderr] 91 | | } [INFO] [stderr] 92 | | } [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] 85 | } else if i64::from_str(&slice[..1]).is_ok() { [INFO] [stderr] 86 | parsing = ParsingState::Error(LexError::IllegalNumber(slice)); [INFO] [stderr] 87 | } else { [INFO] [stderr] 88 | tokens.push(Token::Symbol(slice)); [INFO] [stderr] 89 | parsing = ParsingState::Ready; [INFO] [stderr] 90 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/eval.rs:172:5 [INFO] [stderr] | [INFO] [stderr] 172 | return Ok(vals); [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: remove `return` as shown: `Ok(vals)` [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: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/util.rs:40:26 [INFO] [stderr] | [INFO] [stderr] 40 | pub fn tokenize<'a>(src: &'a String) -> Result>, LexError<'a>> { [INFO] [stderr] | ^^^^^^^^^^ help: change this to: `&str` [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 seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/util.rs:118:9 [INFO] [stderr] | [INFO] [stderr] 118 | / match parsing { [INFO] [stderr] 119 | | ParsingState::Ready => { [INFO] [stderr] 120 | | match c { [INFO] [stderr] 121 | | '(' => tokens.push(Token::LeftParen), [INFO] [stderr] ... | [INFO] [stderr] 141 | | _ => {}, [INFO] [stderr] 142 | | } [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] 118 | if let ParsingState::Ready = parsing { [INFO] [stderr] 119 | match c { [INFO] [stderr] 120 | '(' => tokens.push(Token::LeftParen), [INFO] [stderr] 121 | ')' => tokens.push(Token::RightParen), [INFO] [stderr] 122 | '#' => { [INFO] [stderr] 123 | parsing = ParsingState::Hash(i); [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: use as_ref() instead [INFO] [stderr] --> src/util.rs:169:9 [INFO] [stderr] | [INFO] [stderr] 169 | / match self.item { [INFO] [stderr] 170 | | Some(ref x) => Some(x), [INFO] [stderr] 171 | | None => None, [INFO] [stderr] 172 | | } [INFO] [stderr] | |_________^ help: try this: `self.item.as_ref()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::match_as_ref)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_as_ref [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/eval.rs:27:9 [INFO] [stderr] | [INFO] [stderr] 27 | / match self { [INFO] [stderr] 28 | | &SValue::List(ref ll) => { [INFO] [stderr] 29 | | let mut s = String::new(); [INFO] [stderr] 30 | | s.push('('); [INFO] [stderr] ... | [INFO] [stderr] 44 | | } [INFO] [stderr] 45 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::match_ref_pats)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 27 | match *self { [INFO] [stderr] 28 | SValue::List(ref ll) => { [INFO] [stderr] 29 | let mut s = String::new(); [INFO] [stderr] 30 | s.push('('); [INFO] [stderr] 31 | for x in ll { [INFO] [stderr] 32 | s.push_str(format!("{} ", x).as_ref()); [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/eval.rs:71:42 [INFO] [stderr] | [INFO] [stderr] 71 | pub fn lookup<'a, 'b>(&'a self, sym: &'b String) -> Option { [INFO] [stderr] | ^^^^^^^^^^ help: change this to: `&str` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [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/eval.rs:71:5 [INFO] [stderr] | [INFO] [stderr] 71 | / pub fn lookup<'a, 'b>(&'a self, sym: &'b String) -> Option { [INFO] [stderr] 72 | | for &(ref s, ref v) in self.items.iter() { [INFO] [stderr] 73 | | if s == sym { [INFO] [stderr] 74 | | return Some(v.clone()); [INFO] [stderr] ... | [INFO] [stderr] 77 | | None [INFO] [stderr] 78 | | } [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: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/eval.rs:80:46 [INFO] [stderr] | [INFO] [stderr] 80 | pub fn assign<'a, 'b>(&'a mut self, sym: &'b String, val: SValue) { [INFO] [stderr] | ^^^^^^^^^^ help: change this to: `&str` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [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/eval.rs:80:5 [INFO] [stderr] | [INFO] [stderr] 80 | / pub fn assign<'a, 'b>(&'a mut self, sym: &'b String, val: SValue) { [INFO] [stderr] 81 | | let mut loc = 0; [INFO] [stderr] 82 | | for &(ref s, _) in self.items.iter() { [INFO] [stderr] 83 | | if s == sym { [INFO] [stderr] ... | [INFO] [stderr] 91 | | } [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: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration) [INFO] [stderr] --> src/eval.rs:95:1 [INFO] [stderr] | [INFO] [stderr] 95 | / fn check_sym<'a>(sexp: &'a Sexp, s: &'static str) -> bool { [INFO] [stderr] 96 | | sexp == &Sexp::Symbol(String::from(s)) [INFO] [stderr] 97 | | } [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: you don't need to add `&` to all patterns [INFO] [stderr] --> src/eval.rs:100:5 [INFO] [stderr] | [INFO] [stderr] 100 | / match sexp { [INFO] [stderr] 101 | | &Sexp::List(ref ll) => [INFO] [stderr] 102 | | SValue::List( [INFO] [stderr] 103 | | ll.iter().map(|x| quote(&x.clone())).collect()), [INFO] [stderr] ... | [INFO] [stderr] 107 | | &Sexp::Bool(ref b) => SValue::Bool(b.clone()), [INFO] [stderr] 108 | | } [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] 100 | match *sexp { [INFO] [stderr] 101 | Sexp::List(ref ll) => [INFO] [stderr] 102 | SValue::List( [INFO] [stderr] 103 | ll.iter().map(|x| quote(&x.clone())).collect()), [INFO] [stderr] 104 | Sexp::Symbol(ref s) => SValue::Symbol(s.clone()), [INFO] [stderr] 105 | Sexp::String(ref s) => SValue::String(s.clone()), [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/eval.rs:106:48 [INFO] [stderr] | [INFO] [stderr] 106 | &Sexp::Number(ref f) => SValue::Number(f.clone()), [INFO] [stderr] | ^^^^^^^^^ help: try dereferencing it: `*f` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::clone_on_copy)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/eval.rs:107:44 [INFO] [stderr] | [INFO] [stderr] 107 | &Sexp::Bool(ref b) => SValue::Bool(b.clone()), [INFO] [stderr] | ^^^^^^^^^ help: try dereferencing it: `*b` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [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/eval.rs:154:1 [INFO] [stderr] | [INFO] [stderr] 154 | / fn check_binop<'a>(sexp: &'a Sexp) -> Option<(Box, SValue)> { [INFO] [stderr] 155 | | if let &Sexp::Symbol(ref s) = sexp { [INFO] [stderr] 156 | | let x: Option<(Box, SValue)> = get_binop(s.clone()); [INFO] [stderr] 157 | | return x; [INFO] [stderr] ... | [INFO] [stderr] 160 | | } [INFO] [stderr] 161 | | } [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: you don't need to add `&` to all patterns [INFO] [stderr] --> src/eval.rs:155:5 [INFO] [stderr] | [INFO] [stderr] 155 | / if let &Sexp::Symbol(ref s) = sexp { [INFO] [stderr] 156 | | let x: Option<(Box, SValue)> = get_binop(s.clone()); [INFO] [stderr] 157 | | return x; [INFO] [stderr] 158 | | } else { [INFO] [stderr] 159 | | return None; [INFO] [stderr] 160 | | } [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] 155 | if let Sexp::Symbol(ref s) = *sexp { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^ ^^^^^ [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/eval.rs:224:1 [INFO] [stderr] | [INFO] [stderr] 224 | / pub fn eval<'a>(table: &'a mut SymTable, sexp: Sexp) -> Result { [INFO] [stderr] 225 | | match sexp { [INFO] [stderr] 226 | | Sexp::Number(f) => Ok(SValue::Number(f)), [INFO] [stderr] 227 | | [INFO] [stderr] ... | [INFO] [stderr] 356 | | } [INFO] [stderr] 357 | | } [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: the function has a cyclomatic complexity of 28 [INFO] [stderr] --> src/eval.rs:224:1 [INFO] [stderr] | [INFO] [stderr] 224 | / pub fn eval<'a>(table: &'a mut SymTable, sexp: Sexp) -> Result { [INFO] [stderr] 225 | | match sexp { [INFO] [stderr] 226 | | Sexp::Number(f) => Ok(SValue::Number(f)), [INFO] [stderr] 227 | | [INFO] [stderr] ... | [INFO] [stderr] 356 | | } [INFO] [stderr] 357 | | } [INFO] [stderr] | |_^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::cyclomatic_complexity)] on by default [INFO] [stderr] = help: you could split it up into multiple smaller functions [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cyclomatic_complexity [INFO] [stderr] [INFO] [stderr] warning: The function/method `invoc_sub_scope` doesn't need a mutable reference [INFO] [stderr] --> src/eval.rs:342:73 [INFO] [stderr] | [INFO] [stderr] 342 | let mut new_table = invoc_sub_scope(&mut sub_table, params, args); [INFO] [stderr] | ^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::unnecessary_mut_passed)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_mut_passed [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/util.rs:40:26 [INFO] [stderr] | [INFO] [stderr] 40 | pub fn tokenize<'a>(src: &'a String) -> Result>, LexError<'a>> { [INFO] [stderr] | ^^^^^^^^^^ help: change this to: `&str` [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 seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/util.rs:118:9 [INFO] [stderr] | [INFO] [stderr] 118 | / match parsing { [INFO] [stderr] 119 | | ParsingState::Ready => { [INFO] [stderr] 120 | | match c { [INFO] [stderr] 121 | | '(' => tokens.push(Token::LeftParen), [INFO] [stderr] ... | [INFO] [stderr] 141 | | _ => {}, [INFO] [stderr] 142 | | } [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] 118 | if let ParsingState::Ready = parsing { [INFO] [stderr] 119 | match c { [INFO] [stderr] 120 | '(' => tokens.push(Token::LeftParen), [INFO] [stderr] 121 | ')' => tokens.push(Token::RightParen), [INFO] [stderr] 122 | '#' => { [INFO] [stderr] 123 | parsing = ParsingState::Hash(i); [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: use as_ref() instead [INFO] [stderr] --> src/util.rs:169:9 [INFO] [stderr] | [INFO] [stderr] 169 | / match self.item { [INFO] [stderr] 170 | | Some(ref x) => Some(x), [INFO] [stderr] 171 | | None => None, [INFO] [stderr] 172 | | } [INFO] [stderr] | |_________^ help: try this: `self.item.as_ref()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::match_as_ref)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_as_ref [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/eval.rs:27:9 [INFO] [stderr] | [INFO] [stderr] 27 | / match self { [INFO] [stderr] 28 | | &SValue::List(ref ll) => { [INFO] [stderr] 29 | | let mut s = String::new(); [INFO] [stderr] 30 | | s.push('('); [INFO] [stderr] ... | [INFO] [stderr] 44 | | } [INFO] [stderr] 45 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::match_ref_pats)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 27 | match *self { [INFO] [stderr] 28 | SValue::List(ref ll) => { [INFO] [stderr] 29 | let mut s = String::new(); [INFO] [stderr] 30 | s.push('('); [INFO] [stderr] 31 | for x in ll { [INFO] [stderr] 32 | s.push_str(format!("{} ", x).as_ref()); [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/eval.rs:71:42 [INFO] [stderr] | [INFO] [stderr] 71 | pub fn lookup<'a, 'b>(&'a self, sym: &'b String) -> Option { [INFO] [stderr] | ^^^^^^^^^^ help: change this to: `&str` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [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/eval.rs:71:5 [INFO] [stderr] | [INFO] [stderr] 71 | / pub fn lookup<'a, 'b>(&'a self, sym: &'b String) -> Option { [INFO] [stderr] 72 | | for &(ref s, ref v) in self.items.iter() { [INFO] [stderr] 73 | | if s == sym { [INFO] [stderr] 74 | | return Some(v.clone()); [INFO] [stderr] ... | [INFO] [stderr] 77 | | None [INFO] [stderr] 78 | | } [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: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/eval.rs:80:46 [INFO] [stderr] | [INFO] [stderr] 80 | pub fn assign<'a, 'b>(&'a mut self, sym: &'b String, val: SValue) { [INFO] [stderr] | ^^^^^^^^^^ help: change this to: `&str` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [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/eval.rs:80:5 [INFO] [stderr] | [INFO] [stderr] 80 | / pub fn assign<'a, 'b>(&'a mut self, sym: &'b String, val: SValue) { [INFO] [stderr] 81 | | let mut loc = 0; [INFO] [stderr] 82 | | for &(ref s, _) in self.items.iter() { [INFO] [stderr] 83 | | if s == sym { [INFO] [stderr] ... | [INFO] [stderr] 91 | | } [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: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration) [INFO] [stderr] --> src/eval.rs:95:1 [INFO] [stderr] | [INFO] [stderr] 95 | / fn check_sym<'a>(sexp: &'a Sexp, s: &'static str) -> bool { [INFO] [stderr] 96 | | sexp == &Sexp::Symbol(String::from(s)) [INFO] [stderr] 97 | | } [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: you don't need to add `&` to all patterns [INFO] [stderr] --> src/eval.rs:100:5 [INFO] [stderr] | [INFO] [stderr] 100 | / match sexp { [INFO] [stderr] 101 | | &Sexp::List(ref ll) => [INFO] [stderr] 102 | | SValue::List( [INFO] [stderr] 103 | | ll.iter().map(|x| quote(&x.clone())).collect()), [INFO] [stderr] ... | [INFO] [stderr] 107 | | &Sexp::Bool(ref b) => SValue::Bool(b.clone()), [INFO] [stderr] 108 | | } [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] 100 | match *sexp { [INFO] [stderr] 101 | Sexp::List(ref ll) => [INFO] [stderr] 102 | SValue::List( [INFO] [stderr] 103 | ll.iter().map(|x| quote(&x.clone())).collect()), [INFO] [stderr] 104 | Sexp::Symbol(ref s) => SValue::Symbol(s.clone()), [INFO] [stderr] 105 | Sexp::String(ref s) => SValue::String(s.clone()), [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/eval.rs:106:48 [INFO] [stderr] | [INFO] [stderr] 106 | &Sexp::Number(ref f) => SValue::Number(f.clone()), [INFO] [stderr] | ^^^^^^^^^ help: try dereferencing it: `*f` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::clone_on_copy)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/eval.rs:107:44 [INFO] [stderr] | [INFO] [stderr] 107 | &Sexp::Bool(ref b) => SValue::Bool(b.clone()), [INFO] [stderr] | ^^^^^^^^^ help: try dereferencing it: `*b` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [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/eval.rs:154:1 [INFO] [stderr] | [INFO] [stderr] 154 | / fn check_binop<'a>(sexp: &'a Sexp) -> Option<(Box, SValue)> { [INFO] [stderr] 155 | | if let &Sexp::Symbol(ref s) = sexp { [INFO] [stderr] 156 | | let x: Option<(Box, SValue)> = get_binop(s.clone()); [INFO] [stderr] 157 | | return x; [INFO] [stderr] ... | [INFO] [stderr] 160 | | } [INFO] [stderr] 161 | | } [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: you don't need to add `&` to all patterns [INFO] [stderr] --> src/eval.rs:155:5 [INFO] [stderr] | [INFO] [stderr] 155 | / if let &Sexp::Symbol(ref s) = sexp { [INFO] [stderr] 156 | | let x: Option<(Box, SValue)> = get_binop(s.clone()); [INFO] [stderr] 157 | | return x; [INFO] [stderr] 158 | | } else { [INFO] [stderr] 159 | | return None; [INFO] [stderr] 160 | | } [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] 155 | if let Sexp::Symbol(ref s) = *sexp { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^ ^^^^^ [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/eval.rs:224:1 [INFO] [stderr] | [INFO] [stderr] 224 | / pub fn eval<'a>(table: &'a mut SymTable, sexp: Sexp) -> Result { [INFO] [stderr] 225 | | match sexp { [INFO] [stderr] 226 | | Sexp::Number(f) => Ok(SValue::Number(f)), [INFO] [stderr] 227 | | [INFO] [stderr] ... | [INFO] [stderr] 356 | | } [INFO] [stderr] 357 | | } [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: the function has a cyclomatic complexity of 28 [INFO] [stderr] --> src/eval.rs:224:1 [INFO] [stderr] | [INFO] [stderr] 224 | / pub fn eval<'a>(table: &'a mut SymTable, sexp: Sexp) -> Result { [INFO] [stderr] 225 | | match sexp { [INFO] [stderr] 226 | | Sexp::Number(f) => Ok(SValue::Number(f)), [INFO] [stderr] 227 | | [INFO] [stderr] ... | [INFO] [stderr] 356 | | } [INFO] [stderr] 357 | | } [INFO] [stderr] | |_^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::cyclomatic_complexity)] on by default [INFO] [stderr] = help: you could split it up into multiple smaller functions [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cyclomatic_complexity [INFO] [stderr] [INFO] [stderr] warning: The function/method `invoc_sub_scope` doesn't need a mutable reference [INFO] [stderr] --> src/eval.rs:342:73 [INFO] [stderr] | [INFO] [stderr] 342 | let mut new_table = invoc_sub_scope(&mut sub_table, params, args); [INFO] [stderr] | ^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::unnecessary_mut_passed)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_mut_passed [INFO] [stderr] [INFO] [stderr] Finished dev [unoptimized + debuginfo] target(s) in 1.26s [INFO] running `"docker" "inspect" "75ccb1573b4dccc54837bd2b291ea35ab33e8633cf922dbfc3d160677bd33f42"` [INFO] running `"docker" "rm" "-f" "75ccb1573b4dccc54837bd2b291ea35ab33e8633cf922dbfc3d160677bd33f42"` [INFO] [stdout] 75ccb1573b4dccc54837bd2b291ea35ab33e8633cf922dbfc3d160677bd33f42