[INFO] crate bart_derive 0.1.4 is already in cache [INFO] extracting crate bart_derive 0.1.4 into work/ex/clippy-test-run/sources/stable/reg/bart_derive/0.1.4 [INFO] extracting crate bart_derive 0.1.4 into work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/reg/bart_derive/0.1.4 [INFO] validating manifest of bart_derive-0.1.4 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 bart_derive-0.1.4 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 bart_derive-0.1.4 [INFO] finished frobbing bart_derive-0.1.4 [INFO] frobbed toml for bart_derive-0.1.4 written to work/ex/clippy-test-run/sources/stable/reg/bart_derive/0.1.4/Cargo.toml [INFO] started frobbing bart_derive-0.1.4 [INFO] finished frobbing bart_derive-0.1.4 [INFO] frobbed toml for bart_derive-0.1.4 written to work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/reg/bart_derive/0.1.4/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 bart_derive-0.1.4 against stable for clippy-test-run [INFO] running `"docker" "create" "-v" "/mnt/big/crater/work/local/target-dirs/clippy-test-run/worker-0/stable:/opt/crater/target:rw,Z" "-v" "/mnt/big/crater/work/ex/clippy-test-run/sources/stable/reg/bart_derive/0.1.4:/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] 7112d1ab42ee68f2e7b363793f83921aff5bc92bbbe817ec9634caf504d7c4ee [INFO] running `"docker" "start" "-a" "7112d1ab42ee68f2e7b363793f83921aff5bc92bbbe817ec9634caf504d7c4ee"` [INFO] [stderr] Checking bart_derive v0.1.4 (/opt/crater/workdir) [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/parser.rs:28:30 [INFO] [stderr] | [INFO] [stderr] 28 | Ast::Iteration { name: name, nested: nested }, [INFO] [stderr] | ^^^^^^^^^^ help: replace it with: `name` [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/parser.rs:28:42 [INFO] [stderr] | [INFO] [stderr] 28 | Ast::Iteration { name: name, nested: nested }, [INFO] [stderr] | ^^^^^^^^^^^^^^ help: replace it with: `nested` [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/parser.rs:30:38 [INFO] [stderr] | [INFO] [stderr] 30 | Ast::NegativeIteration { name: name, nested: nested }, [INFO] [stderr] | ^^^^^^^^^^ help: replace it with: `name` [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/parser.rs:30:50 [INFO] [stderr] | [INFO] [stderr] 30 | Ast::NegativeIteration { name: name, nested: nested }, [INFO] [stderr] | ^^^^^^^^^^^^^^ help: replace it with: `nested` [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/parser.rs:32:32 [INFO] [stderr] | [INFO] [stderr] 32 | Ast::Conditional { name: name, nested: nested }, [INFO] [stderr] | ^^^^^^^^^^ help: replace it with: `name` [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/parser.rs:32:44 [INFO] [stderr] | [INFO] [stderr] 32 | Ast::Conditional { name: name, nested: nested }, [INFO] [stderr] | ^^^^^^^^^^^^^^ help: replace it with: `nested` [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/parser.rs:34:40 [INFO] [stderr] | [INFO] [stderr] 34 | Ast::NegativeConditional { name: name, nested: nested }, [INFO] [stderr] | ^^^^^^^^^^ help: replace it with: `name` [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/parser.rs:34:52 [INFO] [stderr] | [INFO] [stderr] 34 | Ast::NegativeConditional { name: name, nested: nested }, [INFO] [stderr] | ^^^^^^^^^^^^^^ help: replace it with: `nested` [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/parser.rs:36:26 [INFO] [stderr] | [INFO] [stderr] 36 | Ast::Scope { name: name, nested: nested }, [INFO] [stderr] | ^^^^^^^^^^ help: replace it with: `name` [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/parser.rs:36:38 [INFO] [stderr] | [INFO] [stderr] 36 | Ast::Scope { name: name, nested: nested }, [INFO] [stderr] | ^^^^^^^^^^^^^^ help: replace it with: `nested` [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/scanner.rs:64:9 [INFO] [stderr] | [INFO] [stderr] 64 | segments: segments, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^ help: replace it with: `segments` [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/parser.rs:28:30 [INFO] [stderr] | [INFO] [stderr] 28 | Ast::Iteration { name: name, nested: nested }, [INFO] [stderr] | ^^^^^^^^^^ help: replace it with: `name` [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/parser.rs:28:42 [INFO] [stderr] | [INFO] [stderr] 28 | Ast::Iteration { name: name, nested: nested }, [INFO] [stderr] | ^^^^^^^^^^^^^^ help: replace it with: `nested` [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/parser.rs:30:38 [INFO] [stderr] | [INFO] [stderr] 30 | Ast::NegativeIteration { name: name, nested: nested }, [INFO] [stderr] | ^^^^^^^^^^ help: replace it with: `name` [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/parser.rs:30:50 [INFO] [stderr] | [INFO] [stderr] 30 | Ast::NegativeIteration { name: name, nested: nested }, [INFO] [stderr] | ^^^^^^^^^^^^^^ help: replace it with: `nested` [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/parser.rs:32:32 [INFO] [stderr] | [INFO] [stderr] 32 | Ast::Conditional { name: name, nested: nested }, [INFO] [stderr] | ^^^^^^^^^^ help: replace it with: `name` [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/parser.rs:32:44 [INFO] [stderr] | [INFO] [stderr] 32 | Ast::Conditional { name: name, nested: nested }, [INFO] [stderr] | ^^^^^^^^^^^^^^ help: replace it with: `nested` [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/parser.rs:34:40 [INFO] [stderr] | [INFO] [stderr] 34 | Ast::NegativeConditional { name: name, nested: nested }, [INFO] [stderr] | ^^^^^^^^^^ help: replace it with: `name` [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/parser.rs:34:52 [INFO] [stderr] | [INFO] [stderr] 34 | Ast::NegativeConditional { name: name, nested: nested }, [INFO] [stderr] | ^^^^^^^^^^^^^^ help: replace it with: `nested` [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/parser.rs:36:26 [INFO] [stderr] | [INFO] [stderr] 36 | Ast::Scope { name: name, nested: nested }, [INFO] [stderr] | ^^^^^^^^^^ help: replace it with: `name` [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/parser.rs:36:38 [INFO] [stderr] | [INFO] [stderr] 36 | Ast::Scope { name: name, nested: nested }, [INFO] [stderr] | ^^^^^^^^^^^^^^ help: replace it with: `nested` [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/scanner.rs:64:9 [INFO] [stderr] | [INFO] [stderr] 64 | segments: segments, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^ help: replace it with: `segments` [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: Constants have by default a `'static` lifetime [INFO] [stderr] --> src/scanner.rs:6:20 [INFO] [stderr] | [INFO] [stderr] 6 | const TAG_OPENER: &'static str = "{{"; [INFO] [stderr] | -^^^^^^^---- help: consider removing `'static`: `&str` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::const_static_lifetime)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#const_static_lifetime [INFO] [stderr] [INFO] [stderr] warning: Constants have by default a `'static` lifetime [INFO] [stderr] --> src/scanner.rs:7:20 [INFO] [stderr] | [INFO] [stderr] 7 | const TAG_CLOSER: &'static str = "}}"; [INFO] [stderr] | -^^^^^^^---- help: consider removing `'static`: `&str` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#const_static_lifetime [INFO] [stderr] [INFO] [stderr] warning: Constants have by default a `'static` lifetime [INFO] [stderr] --> src/scanner.rs:8:30 [INFO] [stderr] | [INFO] [stderr] 8 | const UNESCAPED_TAG_CLOSER: &'static str = "}}}"; [INFO] [stderr] | -^^^^^^^---- help: consider removing `'static`: `&str` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#const_static_lifetime [INFO] [stderr] [INFO] [stderr] warning: Constants have by default a `'static` lifetime [INFO] [stderr] --> src/scanner.rs:6:20 [INFO] [stderr] | [INFO] [stderr] 6 | const TAG_OPENER: &'static str = "{{"; [INFO] [stderr] | -^^^^^^^---- help: consider removing `'static`: `&str` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::const_static_lifetime)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#const_static_lifetime [INFO] [stderr] [INFO] [stderr] warning: Constants have by default a `'static` lifetime [INFO] [stderr] --> src/scanner.rs:7:20 [INFO] [stderr] | [INFO] [stderr] 7 | const TAG_CLOSER: &'static str = "}}"; [INFO] [stderr] | -^^^^^^^---- help: consider removing `'static`: `&str` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#const_static_lifetime [INFO] [stderr] [INFO] [stderr] warning: Constants have by default a `'static` lifetime [INFO] [stderr] --> src/scanner.rs:8:30 [INFO] [stderr] | [INFO] [stderr] 8 | const UNESCAPED_TAG_CLOSER: &'static str = "}}}"; [INFO] [stderr] | -^^^^^^^---- help: consider removing `'static`: `&str` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#const_static_lifetime [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/scanner.rs:16:5 [INFO] [stderr] | [INFO] [stderr] 16 | / match input.starts_with(expected) { [INFO] [stderr] 17 | | true => Ok(&input[expected.len()..]), [INFO] [stderr] 18 | | false => Err(Error::Mismatch), [INFO] [stderr] 19 | | } [INFO] [stderr] | |_____^ help: consider using an if/else expression: `if input.starts_with(expected) { Ok(&input[expected.len()..]) } else { Err(Error::Mismatch) }` [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: length comparison to zero [INFO] [stderr] --> src/scanner.rs:27:8 [INFO] [stderr] | [INFO] [stderr] 27 | if input.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!input.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: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration) [INFO] [stderr] --> src/scanner.rs:45:1 [INFO] [stderr] | [INFO] [stderr] 45 | / pub fn name<'a>(input: &'a str) -> Result<(&'a str, Name<'a>), Error> { [INFO] [stderr] 46 | | let input = input.trim(); [INFO] [stderr] 47 | | [INFO] [stderr] 48 | | let leading_dots = input.find(not_dot).unwrap_or(input.len()); [INFO] [stderr] ... | [INFO] [stderr] 66 | | })) [INFO] [stderr] 67 | | } [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: use of `unwrap_or` followed by a function call [INFO] [stderr] --> src/scanner.rs:48:44 [INFO] [stderr] | [INFO] [stderr] 48 | let leading_dots = input.find(not_dot).unwrap_or(input.len()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|| input.len())` [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: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/scanner.rs:51:34 [INFO] [stderr] | [INFO] [stderr] 51 | let (function_call, input) = match input.ends_with("()") { [INFO] [stderr] | __________________________________^ [INFO] [stderr] 52 | | true => (true, input[..input.len() - 2].trim_right()), [INFO] [stderr] 53 | | false => (false, input), [INFO] [stderr] 54 | | }; [INFO] [stderr] | |_____^ help: consider using an if/else expression: `if input.ends_with("()") { (true, input[..input.len() - 2].trim_right()) } else { (false, input) }` [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: length comparison to zero [INFO] [stderr] --> src/scanner.rs:56:29 [INFO] [stderr] | [INFO] [stderr] 56 | if leading_dots == 0 && input.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `input.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: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration) [INFO] [stderr] --> src/scanner.rs:76:1 [INFO] [stderr] | [INFO] [stderr] 76 | / fn interpolation<'a>(input: &'a str) -> Result, Error> { [INFO] [stderr] 77 | | let (rest, name) = name(input)?; [INFO] [stderr] 78 | | at_end(rest)?; [INFO] [stderr] 79 | | Ok(Token::Interpolation(name)) [INFO] [stderr] 80 | | } [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/scanner.rs:82:1 [INFO] [stderr] | [INFO] [stderr] 82 | / fn unescaped_interpolation<'a>(input: &'a str) -> Result, Error> { [INFO] [stderr] 83 | | let input = consume(input, "{")?; [INFO] [stderr] 84 | | let (rest, name) = name(input)?; [INFO] [stderr] 85 | | at_end(rest)?; [INFO] [stderr] 86 | | Ok(Token::UnescapedInterpolation(name)) [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/scanner.rs:89:1 [INFO] [stderr] | [INFO] [stderr] 89 | / fn section_opener<'a>(input: &'a str) -> Result, Error> { [INFO] [stderr] 90 | | enum Head { Positive, Negative }; [INFO] [stderr] 91 | | enum Tail { Conditional, Scope, None }; [INFO] [stderr] 92 | | [INFO] [stderr] ... | [INFO] [stderr] 123 | | Ok(Token::SectionOpener(section_type, name)) [INFO] [stderr] 124 | | } [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/scanner.rs:126:1 [INFO] [stderr] | [INFO] [stderr] 126 | / fn section_closer<'a>(input: &'a str) -> Result, Error> { [INFO] [stderr] 127 | | let input = consume(input, "/")?; [INFO] [stderr] 128 | | let (rest, name) = name(input)?; [INFO] [stderr] 129 | | at_end(rest)?; [INFO] [stderr] 130 | | Ok(Token::SectionCloser(name)) [INFO] [stderr] 131 | | } [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/scanner.rs:133:1 [INFO] [stderr] | [INFO] [stderr] 133 | / fn partial_include<'a>(input: &'a str) -> Result, Error> { [INFO] [stderr] 134 | | let inner = consume(input, ">")?.trim().splitn(2, ' ').collect::>(); [INFO] [stderr] 135 | | let partial_name = inner[0]; [INFO] [stderr] 136 | | let segments = match inner.get(1) { [INFO] [stderr] ... | [INFO] [stderr] 141 | | Ok(Token::PartialInclude(partial_name, segments)) [INFO] [stderr] 142 | | } [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/scanner.rs:144:1 [INFO] [stderr] | [INFO] [stderr] 144 | / fn bart_tag<'a>(input: &'a str) -> Result<(&'a str, Token<'a>), Error> { [INFO] [stderr] 145 | | let input = consume(input, TAG_OPENER)?; [INFO] [stderr] 146 | | [INFO] [stderr] 147 | | let peek = input.chars().next(); [INFO] [stderr] ... | [INFO] [stderr] 167 | | Ok((rest, tag)) [INFO] [stderr] 168 | | } [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/scanner.rs:170:1 [INFO] [stderr] | [INFO] [stderr] 170 | / fn literal_text<'a>(input: &'a str) -> Result<(&'a str, Option>), Error> { [INFO] [stderr] 171 | | match input.find(TAG_OPENER) { [INFO] [stderr] 172 | | Some(0) => Ok((input, None)), [INFO] [stderr] 173 | | Some(index) => Ok(( [INFO] [stderr] ... | [INFO] [stderr] 184 | | } [INFO] [stderr] 185 | | } [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: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/lib.rs:23:25 [INFO] [stderr] | [INFO] [stderr] 23 | fn find_attr<'a>(attrs: &'a Vec, name: &str) -> Option<&'a str> { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^ help: change this to: `&[syn::Attribute]` [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 both the expression and the patterns [INFO] [stderr] --> src/lib.rs:26:30 [INFO] [stderr] | [INFO] [stderr] 26 | .and_then(|ref attr| match &attr.value { [INFO] [stderr] | ______________________________^ [INFO] [stderr] 27 | | &syn::MetaItem::NameValue(_, syn::Lit::Str(ref template, _)) => Some(template), [INFO] [stderr] 28 | | _ => None [INFO] [stderr] 29 | | }) [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] 26 | .and_then(|ref attr| match attr.value { [INFO] [stderr] 27 | syn::MetaItem::NameValue(_, syn::Lit::Str(ref template, _)) => Some(template), [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/lib.rs:71:24 [INFO] [stderr] | [INFO] [stderr] 71 | let abs_path = match relative_path.has_root() { [INFO] [stderr] | ________________________^ [INFO] [stderr] 72 | | true => user_crate_root().join(relative_path.strip_prefix("/").unwrap()), [INFO] [stderr] 73 | | false => self.base_dir.join(partial_name), [INFO] [stderr] 74 | | }; [INFO] [stderr] | |_________^ help: consider using an if/else expression: `if relative_path.has_root() { user_crate_root().join(relative_path.strip_prefix("/").unwrap()) } else { self.base_dir.join(partial_name) }` [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: use of `unwrap_or` followed by a function call [INFO] [stderr] --> src/lib.rs:115:10 [INFO] [stderr] | [INFO] [stderr] 115 | .unwrap_or("self".to_owned())); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|| "self".to_owned())` [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 seem to be trying to match on a boolean expression [INFO] [stderr] --> src/scanner.rs:16:5 [INFO] [stderr] | [INFO] [stderr] 16 | / match input.starts_with(expected) { [INFO] [stderr] 17 | | true => Ok(&input[expected.len()..]), [INFO] [stderr] 18 | | false => Err(Error::Mismatch), [INFO] [stderr] 19 | | } [INFO] [stderr] | |_____^ help: consider using an if/else expression: `if input.starts_with(expected) { Ok(&input[expected.len()..]) } else { Err(Error::Mismatch) }` [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: length comparison to zero [INFO] [stderr] --> src/scanner.rs:27:8 [INFO] [stderr] | [INFO] [stderr] 27 | if input.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!input.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: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration) [INFO] [stderr] --> src/scanner.rs:45:1 [INFO] [stderr] | [INFO] [stderr] 45 | / pub fn name<'a>(input: &'a str) -> Result<(&'a str, Name<'a>), Error> { [INFO] [stderr] 46 | | let input = input.trim(); [INFO] [stderr] 47 | | [INFO] [stderr] 48 | | let leading_dots = input.find(not_dot).unwrap_or(input.len()); [INFO] [stderr] ... | [INFO] [stderr] 66 | | })) [INFO] [stderr] 67 | | } [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: use of `unwrap_or` followed by a function call [INFO] [stderr] --> src/scanner.rs:48:44 [INFO] [stderr] | [INFO] [stderr] 48 | let leading_dots = input.find(not_dot).unwrap_or(input.len()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|| input.len())` [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: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/scanner.rs:51:34 [INFO] [stderr] | [INFO] [stderr] 51 | let (function_call, input) = match input.ends_with("()") { [INFO] [stderr] | __________________________________^ [INFO] [stderr] 52 | | true => (true, input[..input.len() - 2].trim_right()), [INFO] [stderr] 53 | | false => (false, input), [INFO] [stderr] 54 | | }; [INFO] [stderr] | |_____^ help: consider using an if/else expression: `if input.ends_with("()") { (true, input[..input.len() - 2].trim_right()) } else { (false, input) }` [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: length comparison to zero [INFO] [stderr] --> src/scanner.rs:56:29 [INFO] [stderr] | [INFO] [stderr] 56 | if leading_dots == 0 && input.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `input.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: explicit lifetimes given in parameter types where they could be elided (or replaced with `'_` if needed by type declaration) [INFO] [stderr] --> src/scanner.rs:76:1 [INFO] [stderr] | [INFO] [stderr] 76 | / fn interpolation<'a>(input: &'a str) -> Result, Error> { [INFO] [stderr] 77 | | let (rest, name) = name(input)?; [INFO] [stderr] 78 | | at_end(rest)?; [INFO] [stderr] 79 | | Ok(Token::Interpolation(name)) [INFO] [stderr] 80 | | } [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/scanner.rs:82:1 [INFO] [stderr] | [INFO] [stderr] 82 | / fn unescaped_interpolation<'a>(input: &'a str) -> Result, Error> { [INFO] [stderr] 83 | | let input = consume(input, "{")?; [INFO] [stderr] 84 | | let (rest, name) = name(input)?; [INFO] [stderr] 85 | | at_end(rest)?; [INFO] [stderr] 86 | | Ok(Token::UnescapedInterpolation(name)) [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/scanner.rs:89:1 [INFO] [stderr] | [INFO] [stderr] 89 | / fn section_opener<'a>(input: &'a str) -> Result, Error> { [INFO] [stderr] 90 | | enum Head { Positive, Negative }; [INFO] [stderr] 91 | | enum Tail { Conditional, Scope, None }; [INFO] [stderr] 92 | | [INFO] [stderr] ... | [INFO] [stderr] 123 | | Ok(Token::SectionOpener(section_type, name)) [INFO] [stderr] 124 | | } [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/scanner.rs:126:1 [INFO] [stderr] | [INFO] [stderr] 126 | / fn section_closer<'a>(input: &'a str) -> Result, Error> { [INFO] [stderr] 127 | | let input = consume(input, "/")?; [INFO] [stderr] 128 | | let (rest, name) = name(input)?; [INFO] [stderr] 129 | | at_end(rest)?; [INFO] [stderr] 130 | | Ok(Token::SectionCloser(name)) [INFO] [stderr] 131 | | } [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/scanner.rs:133:1 [INFO] [stderr] | [INFO] [stderr] 133 | / fn partial_include<'a>(input: &'a str) -> Result, Error> { [INFO] [stderr] 134 | | let inner = consume(input, ">")?.trim().splitn(2, ' ').collect::>(); [INFO] [stderr] 135 | | let partial_name = inner[0]; [INFO] [stderr] 136 | | let segments = match inner.get(1) { [INFO] [stderr] ... | [INFO] [stderr] 141 | | Ok(Token::PartialInclude(partial_name, segments)) [INFO] [stderr] 142 | | } [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/scanner.rs:144:1 [INFO] [stderr] | [INFO] [stderr] 144 | / fn bart_tag<'a>(input: &'a str) -> Result<(&'a str, Token<'a>), Error> { [INFO] [stderr] 145 | | let input = consume(input, TAG_OPENER)?; [INFO] [stderr] 146 | | [INFO] [stderr] 147 | | let peek = input.chars().next(); [INFO] [stderr] ... | [INFO] [stderr] 167 | | Ok((rest, tag)) [INFO] [stderr] 168 | | } [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/scanner.rs:170:1 [INFO] [stderr] | [INFO] [stderr] 170 | / fn literal_text<'a>(input: &'a str) -> Result<(&'a str, Option>), Error> { [INFO] [stderr] 171 | | match input.find(TAG_OPENER) { [INFO] [stderr] 172 | | Some(0) => Ok((input, None)), [INFO] [stderr] 173 | | Some(index) => Ok(( [INFO] [stderr] ... | [INFO] [stderr] 184 | | } [INFO] [stderr] 185 | | } [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 seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/scanner.rs:418:9 [INFO] [stderr] | [INFO] [stderr] 418 | / match sequence("{{}}") { [INFO] [stderr] 419 | | Ok(_) => panic!(), [INFO] [stderr] 420 | | Err(_) => (), [INFO] [stderr] 421 | | } [INFO] [stderr] | |_________^ help: try this: `if let Ok(_) = sequence("{{}}") { panic!() }` [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] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/lib.rs:23:25 [INFO] [stderr] | [INFO] [stderr] 23 | fn find_attr<'a>(attrs: &'a Vec, name: &str) -> Option<&'a str> { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^ help: change this to: `&[syn::Attribute]` [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 both the expression and the patterns [INFO] [stderr] --> src/lib.rs:26:30 [INFO] [stderr] | [INFO] [stderr] 26 | .and_then(|ref attr| match &attr.value { [INFO] [stderr] | ______________________________^ [INFO] [stderr] 27 | | &syn::MetaItem::NameValue(_, syn::Lit::Str(ref template, _)) => Some(template), [INFO] [stderr] 28 | | _ => None [INFO] [stderr] 29 | | }) [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] 26 | .and_then(|ref attr| match attr.value { [INFO] [stderr] 27 | syn::MetaItem::NameValue(_, syn::Lit::Str(ref template, _)) => Some(template), [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/lib.rs:71:24 [INFO] [stderr] | [INFO] [stderr] 71 | let abs_path = match relative_path.has_root() { [INFO] [stderr] | ________________________^ [INFO] [stderr] 72 | | true => user_crate_root().join(relative_path.strip_prefix("/").unwrap()), [INFO] [stderr] 73 | | false => self.base_dir.join(partial_name), [INFO] [stderr] 74 | | }; [INFO] [stderr] | |_________^ help: consider using an if/else expression: `if relative_path.has_root() { user_crate_root().join(relative_path.strip_prefix("/").unwrap()) } else { self.base_dir.join(partial_name) }` [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: use of `unwrap_or` followed by a function call [INFO] [stderr] --> src/lib.rs:115:10 [INFO] [stderr] | [INFO] [stderr] 115 | .unwrap_or("self".to_owned())); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|| "self".to_owned())` [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] Finished dev [unoptimized + debuginfo] target(s) in 1.94s [INFO] running `"docker" "inspect" "7112d1ab42ee68f2e7b363793f83921aff5bc92bbbe817ec9634caf504d7c4ee"` [INFO] running `"docker" "rm" "-f" "7112d1ab42ee68f2e7b363793f83921aff5bc92bbbe817ec9634caf504d7c4ee"` [INFO] [stdout] 7112d1ab42ee68f2e7b363793f83921aff5bc92bbbe817ec9634caf504d7c4ee