[INFO] cloning repository https://github.com/surrealegg/yak [INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/surrealegg/yak" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fsurrealegg%2Fyak", kill_on_drop: false }` [INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fsurrealegg%2Fyak'... [INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }` [INFO] [stdout] 4a7725f0c1bccb87d8daaaab4a5f491a6378d7ab [INFO] linting surrealegg/yak against nightly for clippy-nonminimal_bool-denied [INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fsurrealegg%2Fyak" "/workspace/builds/worker-7-tc1/source", kill_on_drop: false }` [INFO] [stderr] Cloning into '/workspace/builds/worker-7-tc1/source'... [INFO] [stderr] done. [INFO] started tweaking git repo https://github.com/surrealegg/yak [INFO] finished tweaking git repo https://github.com/surrealegg/yak [INFO] tweaked toml for git repo https://github.com/surrealegg/yak written to /workspace/builds/worker-7-tc1/source/Cargo.toml [INFO] validating manifest of git repo https://github.com/surrealegg/yak on toolchain nightly [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+nightly" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }` [INFO] crate git repo https://github.com/surrealegg/yak already has a lockfile, it will not be regenerated [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+nightly" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }` [INFO] [stderr] Blocking waiting for file lock on package cache [INFO] [stderr] Updating git repository `https://github.com/TheDan64/inkwell` [INFO] [stderr] Updating crates.io index [INFO] [stderr] Downloading crates ... [INFO] [stderr] Downloaded unicode-ident v1.0.3 [INFO] [stderr] Downloaded either v1.7.0 [INFO] [stderr] Downloaded proc-macro2 v1.0.43 [INFO] [stderr] Downloaded semver v1.0.13 [INFO] [stderr] Downloaded llvm-sys v140.0.2 [INFO] [stderr] Downloaded syn v1.0.99 [INFO] [stderr] Downloaded libc v0.2.127 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-7-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-7-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+nightly" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }` [INFO] [stdout] 25f1ccceefb26f753b2c56a7b8a6250c1d2a449e2878685c531da38e9b3c321f [INFO] running `Command { std: "docker" "start" "-a" "25f1ccceefb26f753b2c56a7b8a6250c1d2a449e2878685c531da38e9b3c321f", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "25f1ccceefb26f753b2c56a7b8a6250c1d2a449e2878685c531da38e9b3c321f", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "25f1ccceefb26f753b2c56a7b8a6250c1d2a449e2878685c531da38e9b3c321f", kill_on_drop: false }` [INFO] [stdout] 25f1ccceefb26f753b2c56a7b8a6250c1d2a449e2878685c531da38e9b3c321f [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-7-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-7-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+nightly" "clippy" "--frozen" "--all" "--all-targets" "--message-format=json", kill_on_drop: false }` [INFO] [stdout] 1b80ce18bbaa0a2206d53a8365a0d86ce97ae902e854c18c555ec182b55f30c7 [INFO] running `Command { std: "docker" "start" "-a" "1b80ce18bbaa0a2206d53a8365a0d86ce97ae902e854c18c555ec182b55f30c7", kill_on_drop: false }` [INFO] [stderr] Compiling memchr v2.5.0 [INFO] [stderr] Compiling semver v1.0.13 [INFO] [stderr] Compiling proc-macro2 v1.0.43 [INFO] [stderr] Compiling libc v0.2.127 [INFO] [stderr] Compiling regex-syntax v0.6.27 [INFO] [stderr] Compiling cc v1.0.73 [INFO] [stderr] Compiling unicode-ident v1.0.3 [INFO] [stderr] Compiling quote v1.0.21 [INFO] [stderr] Compiling syn v1.0.99 [INFO] [stderr] Compiling parking_lot_core v0.9.3 [INFO] [stderr] Checking smallvec v1.9.0 [INFO] [stderr] Checking scopeguard v1.1.0 [INFO] [stderr] Compiling inkwell v0.1.0 (https://github.com/TheDan64/inkwell?branch=master#25b9fc58) [INFO] [stderr] Checking once_cell v1.13.0 [INFO] [stderr] Compiling lock_api v0.4.7 [INFO] [stderr] Checking either v1.7.0 [INFO] [stderr] Compiling aho-corasick v0.7.18 [INFO] [stderr] Checking parking_lot v0.12.1 [INFO] [stderr] Compiling regex v1.6.0 [INFO] [stderr] Compiling llvm-sys v140.0.2 [INFO] [stderr] Compiling inkwell_internals v0.5.0 (https://github.com/TheDan64/inkwell?branch=master#25b9fc58) [INFO] [stderr] Checking yakc v0.1.0 (/opt/rustwide/workdir) [INFO] [stdout] warning: field `0` is never read [INFO] [stdout] --> src/ast.rs:9:10 [INFO] [stdout] | [INFO] [stdout] 9 | Char(String), [INFO] [stdout] | ---- ^^^^^^ [INFO] [stdout] | | [INFO] [stdout] | field in this variant [INFO] [stdout] | [INFO] [stdout] = note: `LiteralKind` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis [INFO] [stdout] = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] help: consider changing the field to be of unit type to suppress this warning while preserving the field numbering, or remove the field [INFO] [stdout] | [INFO] [stdout] 9 - Char(String), [INFO] [stdout] 9 + Char(()), [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: field `kind` is never read [INFO] [stdout] --> src/codegen.rs:22:9 [INFO] [stdout] | [INFO] [stdout] 19 | pub struct StoredVariable<'a> { [INFO] [stdout] | -------------- field in this struct [INFO] [stdout] ... [INFO] [stdout] 22 | pub kind: BasicTypeEnum<'a>, [INFO] [stdout] | ^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `StoredVariable` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: fields `fpm`, `begin_block`, and `return_value` are never read [INFO] [stdout] --> src/codegen.rs:29:9 [INFO] [stdout] | [INFO] [stdout] 26 | pub struct Codegen<'a, 'ctx> { [INFO] [stdout] | ------- fields in this struct [INFO] [stdout] ... [INFO] [stdout] 29 | pub fpm: &'a PassManager>, [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 34 | pub begin_block: Option>, [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 37 | pub return_value: Option>, [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: direct implementation of `ToString` [INFO] [stdout] --> src/ast.rs:38:1 [INFO] [stdout] | [INFO] [stdout] 38 | / impl ToString for BinaryKind { [INFO] [stdout] 39 | | fn to_string(&self) -> String { [INFO] [stdout] 40 | | match self { [INFO] [stdout] 41 | | BinaryKind::Plus => "+", [INFO] [stdout] ... | [INFO] [stdout] 57 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: prefer implementing `Display` instead [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#to_string_trait_impl [INFO] [stdout] = note: `#[warn(clippy::to_string_trait_impl)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: direct implementation of `ToString` [INFO] [stdout] --> src/ast.rs:59:1 [INFO] [stdout] | [INFO] [stdout] 59 | / impl ToString for AssignmentKind { [INFO] [stdout] 60 | | fn to_string(&self) -> String { [INFO] [stdout] 61 | | match self { [INFO] [stdout] 62 | | AssignmentKind::Equal => "=", [INFO] [stdout] ... | [INFO] [stdout] 73 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: prefer implementing `Display` instead [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#to_string_trait_impl [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: direct implementation of `ToString` [INFO] [stdout] --> src/ast.rs:148:1 [INFO] [stdout] | [INFO] [stdout] 148 | / impl ToString for UnaryKind { [INFO] [stdout] 149 | | fn to_string(&self) -> String { [INFO] [stdout] 150 | | match self { [INFO] [stdout] 151 | | UnaryKind::Not => "not", [INFO] [stdout] ... | [INFO] [stdout] 158 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: prefer implementing `Display` instead [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#to_string_trait_impl [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: direct implementation of `ToString` [INFO] [stdout] --> src/ast.rs:322:1 [INFO] [stdout] | [INFO] [stdout] 322 | / impl ToString for Type { [INFO] [stdout] 323 | | fn to_string(&self) -> String { [INFO] [stdout] 324 | | match self { [INFO] [stdout] 325 | | Type::I8 => "i8".to_string(), [INFO] [stdout] ... | [INFO] [stdout] 349 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: prefer implementing `Display` instead [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#to_string_trait_impl [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this boolean expression can be simplified [INFO] [stdout] --> src/ast.rs:366:20 [INFO] [stdout] | [INFO] [stdout] 366 | if !(other == &Type::Void && it.peek().is_some()) && !last.equal(other) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `!(last.equal(other) || other == &Type::Void && it.peek().is_some())` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#nonminimal_bool [INFO] [stdout] = note: `#[warn(clippy::nonminimal_bool)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/ast.rs:372:9 [INFO] [stdout] | [INFO] [stdout] 372 | return Type::Void; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] = note: `#[warn(clippy::needless_return)]` on by default [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 372 - return Type::Void; [INFO] [stdout] 372 + Type::Void [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: match expression looks like `matches!` macro [INFO] [stdout] --> src/ast.rs:376:9 [INFO] [stdout] | [INFO] [stdout] 376 | / match self { [INFO] [stdout] 377 | | Type::I8 [INFO] [stdout] 378 | | | Type::U8 [INFO] [stdout] 379 | | | Type::I16 [INFO] [stdout] ... | [INFO] [stdout] 389 | | _ => false, [INFO] [stdout] 390 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_like_matches_macro [INFO] [stdout] = note: `#[warn(clippy::match_like_matches_macro)]` on by default [INFO] [stdout] help: use `matches!` directly [INFO] [stdout] | [INFO] [stdout] 376 ~ matches!(self, Type::I8 [INFO] [stdout] 377 + | Type::U8 [INFO] [stdout] 378 + | Type::I16 [INFO] [stdout] 379 + | Type::U16 [INFO] [stdout] 380 + | Type::I32 [INFO] [stdout] 381 + | Type::U32 [INFO] [stdout] 382 + | Type::I64 [INFO] [stdout] 383 + | Type::U64 [INFO] [stdout] 384 + | Type::F32 [INFO] [stdout] 385 + | Type::F64 [INFO] [stdout] 386 + | Type::CInt [INFO] [stdout] 387 + | Type::USize) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: match expression looks like `matches!` macro [INFO] [stdout] --> src/ast.rs:394:9 [INFO] [stdout] | [INFO] [stdout] 394 | / match self { [INFO] [stdout] 395 | | Type::I8 [INFO] [stdout] 396 | | | Type::U8 [INFO] [stdout] 397 | | | Type::I16 [INFO] [stdout] ... | [INFO] [stdout] 405 | | _ => false, [INFO] [stdout] 406 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_like_matches_macro [INFO] [stdout] help: use `matches!` directly [INFO] [stdout] | [INFO] [stdout] 394 ~ matches!(self, Type::I8 [INFO] [stdout] 395 + | Type::U8 [INFO] [stdout] 396 + | Type::I16 [INFO] [stdout] 397 + | Type::U16 [INFO] [stdout] 398 + | Type::I32 [INFO] [stdout] 399 + | Type::U32 [INFO] [stdout] 400 + | Type::I64 [INFO] [stdout] 401 + | Type::U64 [INFO] [stdout] 402 + | Type::CInt [INFO] [stdout] 403 + | Type::USize) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: match expression looks like `matches!` macro [INFO] [stdout] --> src/ast.rs:410:9 [INFO] [stdout] | [INFO] [stdout] 410 | / match self { [INFO] [stdout] 411 | | Type::I8 [INFO] [stdout] 412 | | | Type::U8 [INFO] [stdout] 413 | | | Type::I16 [INFO] [stdout] ... | [INFO] [stdout] 426 | | _ => false, [INFO] [stdout] 427 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_like_matches_macro [INFO] [stdout] help: use `matches!` directly [INFO] [stdout] | [INFO] [stdout] 410 ~ matches!(self, Type::I8 [INFO] [stdout] 411 + | Type::U8 [INFO] [stdout] 412 + | Type::I16 [INFO] [stdout] 413 + | Type::U16 [INFO] [stdout] 414 + | Type::I32 [INFO] [stdout] 415 + | Type::U32 [INFO] [stdout] 416 + | Type::I64 [INFO] [stdout] 417 + | Type::U64 [INFO] [stdout] 418 + | Type::F32 [INFO] [stdout] 419 + | Type::F64 [INFO] [stdout] 420 + | Type::Bool [INFO] [stdout] 421 + | Type::CInt [INFO] [stdout] 422 + | Type::CChar [INFO] [stdout] 423 + | Type::USize [INFO] [stdout] 424 + | Type::Char) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/ast.rs:568:9 [INFO] [stdout] | [INFO] [stdout] 568 | return String::new(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 568 - return String::new(); [INFO] [stdout] 568 + String::new() [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: used `assert_eq!` with a literal bool [INFO] [stdout] --> src/ast.rs:578:9 [INFO] [stdout] | [INFO] [stdout] 578 | assert_eq!(Type::Bool.equal(&Type::Bool), true); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bool_assert_comparison [INFO] [stdout] = note: `#[warn(clippy::bool_assert_comparison)]` on by default [INFO] [stdout] help: replace it with `assert!(..)` [INFO] [stdout] | [INFO] [stdout] 578 - assert_eq!(Type::Bool.equal(&Type::Bool), true); [INFO] [stdout] 578 + assert!(Type::Bool.equal(&Type::Bool)); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: used `assert_eq!` with a literal bool [INFO] [stdout] --> src/ast.rs:579:9 [INFO] [stdout] | [INFO] [stdout] 579 | assert_eq!(Type::Bool.equal(&Type::CChar), false); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bool_assert_comparison [INFO] [stdout] help: replace it with `assert!(..)` [INFO] [stdout] | [INFO] [stdout] 579 - assert_eq!(Type::Bool.equal(&Type::CChar), false); [INFO] [stdout] 579 + assert!(!Type::Bool.equal(&Type::CChar)); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: used `assert_eq!` with a literal bool [INFO] [stdout] --> src/ast.rs:580:9 [INFO] [stdout] | [INFO] [stdout] 580 | / assert_eq!( [INFO] [stdout] 581 | | Type::Raw(Box::new(Type::Bool)).equal(&Type::Raw(Box::new(Type::Bool))), [INFO] [stdout] 582 | | true [INFO] [stdout] 583 | | ); [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bool_assert_comparison [INFO] [stdout] help: replace it with `assert!(..)` [INFO] [stdout] | [INFO] [stdout] 580 ~ assert!( [INFO] [stdout] 581 ~ Type::Raw(Box::new(Type::Bool)).equal(&Type::Raw(Box::new(Type::Bool))) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: used `assert_eq!` with a literal bool [INFO] [stdout] --> src/ast.rs:584:9 [INFO] [stdout] | [INFO] [stdout] 584 | / assert_eq!( [INFO] [stdout] 585 | | Type::Raw(Box::new(Type::Bool)).equal(&Type::Raw(Box::new(Type::CChar))), [INFO] [stdout] 586 | | false [INFO] [stdout] 587 | | ); [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bool_assert_comparison [INFO] [stdout] help: replace it with `assert!(..)` [INFO] [stdout] | [INFO] [stdout] 584 ~ assert!( [INFO] [stdout] 585 ~ !Type::Raw(Box::new(Type::Bool)).equal(&Type::Raw(Box::new(Type::CChar))) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods called `from_*` usually take no `self` [INFO] [stdout] --> src/codegen.rs:237:37 [INFO] [stdout] | [INFO] [stdout] 237 | fn from_type_to_llvm_basic_type(&self, from: &Type) -> Option> { [INFO] [stdout] | ^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: consider choosing a less ambiguous name [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#wrong_self_convention [INFO] [stdout] = note: `#[warn(clippy::wrong_self_convention)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/codegen.rs:601:9 [INFO] [stdout] | [INFO] [stdout] 601 | return false; [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 601 - return false; [INFO] [stdout] 601 + false [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/codegen.rs:589:58 [INFO] [stdout] | [INFO] [stdout] 589 | if let Some(value) = self.expression(&expression) { [INFO] [stdout] | ^^^^^^^^^^^ help: change this to: `expression` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] = note: `#[warn(clippy::needless_borrow)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&Vec` instead of `&[_]` involves a new object where a slice will do [INFO] [stdout] --> src/codegen.rs:604:46 [INFO] [stdout] | [INFO] [stdout] 604 | pub fn statements(&mut self, statements: &Vec) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stdout] = note: `#[warn(clippy::ptr_arg)]` on by default [INFO] [stdout] help: change this to [INFO] [stdout] | [INFO] [stdout] 604 - pub fn statements(&mut self, statements: &Vec) -> bool { [INFO] [stdout] 604 + pub fn statements(&mut self, statements: &[Statement]) -> bool { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: direct implementation of `ToString` [INFO] [stdout] --> src/error.rs:86:1 [INFO] [stdout] | [INFO] [stdout] 86 | / impl ToString for ErrorKind { [INFO] [stdout] 87 | | fn to_string(&self) -> String { [INFO] [stdout] 88 | | match self { [INFO] [stdout] 89 | | ErrorKind::UnexpectedToken => "unexpected token".to_string(), [INFO] [stdout] ... | [INFO] [stdout] 166 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: prefer implementing `Display` instead [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#to_string_trait_impl [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/error.rs:95:69 [INFO] [stdout] | [INFO] [stdout] 95 | format!("expected token: {}", TokenKind::from_array(&tokens)) [INFO] [stdout] | ^^^^^^^ help: change this to: `tokens` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: direct implementation of `ToString` [INFO] [stdout] --> src/error.rs:184:1 [INFO] [stdout] | [INFO] [stdout] 184 | / impl ToString for ErrorSeverity { [INFO] [stdout] 185 | | fn to_string(&self) -> String { [INFO] [stdout] 186 | | match self { [INFO] [stdout] 187 | | ErrorSeverity::Warning => "warning", [INFO] [stdout] ... | [INFO] [stdout] 192 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: prefer implementing `Display` instead [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#to_string_trait_impl [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: returning the result of a `let` binding from a block [INFO] [stdout] --> src/lexer.rs:244:17 [INFO] [stdout] | [INFO] [stdout] 243 | let token = self.create_token(TokenKind::EndLine, 1); [INFO] [stdout] | ----------------------------------------------------- unnecessary `let` binding [INFO] [stdout] 244 | token [INFO] [stdout] | ^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#let_and_return [INFO] [stdout] = note: `#[warn(clippy::let_and_return)]` on by default [INFO] [stdout] help: return the expression directly [INFO] [stdout] | [INFO] [stdout] 243 ~ [INFO] [stdout] 244 ~ self.create_token(TokenKind::EndLine, 1) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/linter.rs:246:25 [INFO] [stdout] | [INFO] [stdout] 246 | return Ok(*kind.clone()); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 246 - return Ok(*kind.clone()); [INFO] [stdout] 246 + Ok(*kind.clone()) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/linter.rs:249:25 [INFO] [stdout] | [INFO] [stdout] 249 | / return Err(Error { [INFO] [stdout] 250 | | kind: ErrorKind::AccessValueToNonArrayType, [INFO] [stdout] 251 | | severity: ErrorSeverity::Error, [INFO] [stdout] 252 | | span: array_access.span, [INFO] [stdout] 253 | | }); [INFO] [stdout] | |__________________________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 249 ~ Err(Error { [INFO] [stdout] 250 + kind: ErrorKind::AccessValueToNonArrayType, [INFO] [stdout] 251 + severity: ErrorSeverity::Error, [INFO] [stdout] 252 + span: array_access.span, [INFO] [stdout] 253 ~ }) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `clone` on type `Span` which implements the `Copy` trait [INFO] [stdout] --> src/linter.rs:118:39 [INFO] [stdout] | [INFO] [stdout] 118 | ... span: unary.span.clone(), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ help: try removing the `clone` call: `unary.span` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stdout] = note: `#[warn(clippy::clone_on_copy)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant pattern matching, consider using `is_some()` [INFO] [stdout] --> src/linter.rs:288:16 [INFO] [stdout] | [INFO] [stdout] 288 | if let Some(_) = self.find_function_by_name(&prototype.name) { [INFO] [stdout] | -------^^^^^^^---------------------------------------------- help: try: `if self.find_function_by_name(&prototype.name).is_some()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_pattern_matching [INFO] [stdout] = note: `#[warn(clippy::redundant_pattern_matching)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `clone` on type `Span` which implements the `Copy` trait [INFO] [stdout] --> src/linter.rs:292:23 [INFO] [stdout] | [INFO] [stdout] 292 | span: prototype.span.clone(), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ help: try removing the `clone` call: `prototype.span` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant pattern matching, consider using `is_some()` [INFO] [stdout] --> src/linter.rs:338:16 [INFO] [stdout] | [INFO] [stdout] 338 | if let Some(_) = self [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_pattern_matching [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 338 ~ if self [INFO] [stdout] 339 + .variables [INFO] [stdout] 340 + .iter() [INFO] [stdout] 341 + .find(|item| item.name == decl.name && self.scope == item.scope).is_some() [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: passing a unit value to a function [INFO] [stdout] --> src/linter.rs:386:9 [INFO] [stdout] | [INFO] [stdout] 386 | / Ok(match statement { [INFO] [stdout] 387 | | Statement::Expression(expression) => { [INFO] [stdout] 388 | | self.check_expression(expression)?; [INFO] [stdout] ... | [INFO] [stdout] 512 | | }) [INFO] [stdout] | |__________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unit_arg [INFO] [stdout] = note: `#[warn(clippy::unit_arg)]` on by default [INFO] [stdout] help: move the expression in front of the call and replace it with the unit literal `()` [INFO] [stdout] | [INFO] [stdout] 386 ~ let _: () = match statement { [INFO] [stdout] 387 + Statement::Expression(expression) => { [INFO] [stdout] 388 + self.check_expression(expression)?; [INFO] [stdout] 389 + } [INFO] [stdout] 390 + Statement::VariableDeclaration(decl) => { [INFO] [stdout] 391 + let variable = self.create_variable(decl)?; [INFO] [stdout] 392 + let variable_kind = variable.kind.clone(); [INFO] [stdout] 393 + self.variables.push(variable); [INFO] [stdout] 394 + *decl = VariableDeclaration { [INFO] [stdout] 395 + mutable: decl.mutable, [INFO] [stdout] 396 + name: decl.name.clone(), [INFO] [stdout] 397 + span: decl.span, [INFO] [stdout] 398 + value: decl.value.clone(), [INFO] [stdout] 399 + variable_type: variable_kind, [INFO] [stdout] 400 + }; [INFO] [stdout] 401 + } [INFO] [stdout] 402 + Statement::Block(block) => { [INFO] [stdout] 403 + self.in_loop += 1; [INFO] [stdout] 404 + let kind = Type::merge(&self.check_statements(&mut block.statements)?); [INFO] [stdout] 405 + self.in_loop -= 1; [INFO] [stdout] 406 + types.push(kind); [INFO] [stdout] 407 + } [INFO] [stdout] 408 + Statement::Loop(block) => { [INFO] [stdout] 409 + self.in_loop += 1; [INFO] [stdout] 410 + let kind = Type::merge(&self.check_statements(&mut block.statements)?); [INFO] [stdout] 411 + self.in_loop -= 1; [INFO] [stdout] 412 + types.push(kind); [INFO] [stdout] 413 + } [INFO] [stdout] 414 + Statement::While(while_block) => { [INFO] [stdout] 415 + let check = self.check_expression(&mut while_block.expression)?; [INFO] [stdout] 416 + if check != Type::Bool { [INFO] [stdout] 417 + return Err(Error { [INFO] [stdout] 418 + kind: ErrorKind::MismatchedTypes(Type::Bool, check), [INFO] [stdout] 419 + severity: ErrorSeverity::Error, [INFO] [stdout] 420 + span: while_block.expression.span(), [INFO] [stdout] 421 + }); [INFO] [stdout] 422 + } [INFO] [stdout] 423 + self.in_loop += 1; [INFO] [stdout] 424 + let kind = Type::merge(&self.check_statements(&mut while_block.block)?); [INFO] [stdout] 425 + self.in_loop -= 1; [INFO] [stdout] 426 + types.push(kind); [INFO] [stdout] 427 + } [INFO] [stdout] 428 + Statement::Break(break_statement) => { [INFO] [stdout] 429 + if self.in_loop == 0 { [INFO] [stdout] 430 + return Err(Error { [INFO] [stdout] 431 + kind: ErrorKind::BreakOutsideLoop, [INFO] [stdout] 432 + severity: ErrorSeverity::Error, [INFO] [stdout] 433 + span: break_statement.span, [INFO] [stdout] 434 + }); [INFO] [stdout] 435 + } [INFO] [stdout] 436 + } [INFO] [stdout] 437 + Statement::Continue(continue_statement) => { [INFO] [stdout] 438 + if self.in_loop == 0 { [INFO] [stdout] 439 + return Err(Error { [INFO] [stdout] 440 + kind: ErrorKind::ContinueOutsideLoop, [INFO] [stdout] 441 + severity: ErrorSeverity::Error, [INFO] [stdout] 442 + span: continue_statement.span, [INFO] [stdout] 443 + }); [INFO] [stdout] 444 + } [INFO] [stdout] 445 + } [INFO] [stdout] 446 + Statement::If(if_statement) => { [INFO] [stdout] 447 + let check = self.check_expression(&mut if_statement.expression)?; [INFO] [stdout] 448 + if check != Type::Bool { [INFO] [stdout] 449 + return Err(Error { [INFO] [stdout] 450 + kind: ErrorKind::MismatchedTypes(Type::Bool, check), [INFO] [stdout] 451 + severity: ErrorSeverity::Error, [INFO] [stdout] 452 + span: if_statement.expression.span(), [INFO] [stdout] 453 + }); [INFO] [stdout] 454 + } [INFO] [stdout] 455 + let lhs = Type::merge(&self.check_statements(&mut if_statement.true_block)?); [INFO] [stdout] 456 + [INFO] [stdout] 457 + if !if_statement.else_block.is_empty() { [INFO] [stdout] 458 + let rhs = Type::merge(&self.check_statements(&mut if_statement.else_block)?); [INFO] [stdout] 459 + if !lhs.equal(&rhs) { [INFO] [stdout] 460 + return Err(Error { [INFO] [stdout] 461 + kind: ErrorKind::MismatchedTypes(lhs, rhs), [INFO] [stdout] 462 + severity: ErrorSeverity::Error, [INFO] [stdout] 463 + span: Span::default(), [INFO] [stdout] 464 + }); [INFO] [stdout] 465 + } [INFO] [stdout] 466 + types.push(lhs); [INFO] [stdout] 467 + } else { [INFO] [stdout] 468 + types.push(Type::Void); [INFO] [stdout] 469 + } [INFO] [stdout] 470 + } [INFO] [stdout] 471 + Statement::Prototype(prototype) => { [INFO] [stdout] 472 + let mut stored_prototype = self.create_prototype(prototype)?; [INFO] [stdout] 473 + let mut saved_kind = stored_prototype.return_kind.clone(); [INFO] [stdout] 474 + if stored_prototype.return_kind == Type::Unknown { [INFO] [stdout] 475 + stored_prototype.return_kind = Type::Void; [INFO] [stdout] 476 + saved_kind = Type::Void; [INFO] [stdout] 477 + } [INFO] [stdout] 478 + self.functions.push(stored_prototype); [INFO] [stdout] 479 + *prototype = Prototype { [INFO] [stdout] 480 + is_extern: prototype.is_extern, [INFO] [stdout] 481 + name: prototype.name.clone(), [INFO] [stdout] 482 + params: prototype.params.clone(), [INFO] [stdout] 483 + return_type: saved_kind.clone(), [INFO] [stdout] 484 + span: prototype.span, [INFO] [stdout] 485 + }; [INFO] [stdout] 486 + types.push(saved_kind); [INFO] [stdout] 487 + } [INFO] [stdout] 488 + Statement::Function(function) => { [INFO] [stdout] 489 + function.prototype.return_type = self.create_function(function)?; [INFO] [stdout] 490 + types.push(function.prototype.return_type.clone()); [INFO] [stdout] 491 + } [INFO] [stdout] 492 + Statement::Return(value) => { [INFO] [stdout] 493 + types.push(if let Some(expression) = &mut value.expression { [INFO] [stdout] 494 + self.check_expression(expression)? [INFO] [stdout] 495 + } else { [INFO] [stdout] 496 + Type::Void [INFO] [stdout] 497 + }); [INFO] [stdout] 498 + } [INFO] [stdout] 499 + Statement::Unsafe(unsafe_statement) => { [INFO] [stdout] 500 + if self.in_unsafe > 0 { [INFO] [stdout] 501 + self.warnings.push(Error { [INFO] [stdout] 502 + kind: ErrorKind::UnnecessaryUnsafe, [INFO] [stdout] 503 + severity: ErrorSeverity::Warning, [INFO] [stdout] 504 + span: unsafe_statement.span, [INFO] [stdout] 505 + }); [INFO] [stdout] 506 + } [INFO] [stdout] 507 + self.in_unsafe += 1; [INFO] [stdout] 508 + let kind = Type::merge(&self.check_statements(&mut unsafe_statement.statements)?); [INFO] [stdout] 509 + self.in_unsafe -= 1; [INFO] [stdout] 510 + types.push(kind); [INFO] [stdout] 511 + } [INFO] [stdout] 512 + }; [INFO] [stdout] 513 + Ok(()) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this loop could be written as a `for` loop [INFO] [stdout] --> src/linter.rs:519:9 [INFO] [stdout] | [INFO] [stdout] 519 | while let Some(statement) = iter.next() { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `for statement in iter` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#while_let_on_iterator [INFO] [stdout] = note: `#[warn(clippy::while_let_on_iterator)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/parser.rs:65:9 [INFO] [stdout] | [INFO] [stdout] 65 | return false; [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 65 - return false; [INFO] [stdout] 65 + false [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `clone` on type `TokenKind` which implements the `Copy` trait [INFO] [stdout] --> src/parser.rs:60:27 [INFO] [stdout] | [INFO] [stdout] 60 | if self.check(kind.clone()) { [INFO] [stdout] | ^^^^^^^^^^^^ help: try dereferencing it: `*kind` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/parser.rs:109:9 [INFO] [stdout] | [INFO] [stdout] 109 | return None; [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 109 - return None; [INFO] [stdout] 109 + None [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `clone` on type `TokenKind` which implements the `Copy` trait [INFO] [stdout] --> src/parser.rs:102:27 [INFO] [stdout] | [INFO] [stdout] 102 | if self.check(kind.clone()) { [INFO] [stdout] | ^^^^^^^^^^^^ help: try dereferencing it: `*kind` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `clone` on type `Span` which implements the `Copy` trait [INFO] [stdout] --> src/parser.rs:124:33 [INFO] [stdout] | [INFO] [stdout] 124 | self.current_span = token.span.clone(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ help: try removing the `clone` call: `token.span` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `Result.or_else(|x| Err(y))`, which is more succinctly expressed as `map_err(|x| y)` [INFO] [stdout] --> src/parser.rs:162:21 [INFO] [stdout] | [INFO] [stdout] 162 | / token [INFO] [stdout] 163 | | .slice [INFO] [stdout] 164 | | .parse::() [INFO] [stdout] 165 | | .or_else(|_| Err(self.error(ErrorKind::InvalidInteger)))?, [INFO] [stdout] | |________________________________________________________________________________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bind_instead_of_map [INFO] [stdout] = note: `#[warn(clippy::bind_instead_of_map)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 162 ~ token [INFO] [stdout] 163 + .slice [INFO] [stdout] 164 ~ .parse::().map_err(|_| self.error(ErrorKind::InvalidInteger))?, [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/parser.rs:254:9 [INFO] [stdout] | [INFO] [stdout] 254 | return self.primary(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 254 - return self.primary(); [INFO] [stdout] 254 + self.primary() [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `Result.or_else(|x| Err(y))`, which is more succinctly expressed as `map_err(|x| y)` [INFO] [stdout] --> src/parser.rs:267:23 [INFO] [stdout] | [INFO] [stdout] 267 | kind: UnaryKind::try_from(op.kind) [INFO] [stdout] | _______________________^ [INFO] [stdout] 268 | | .or_else(|_| Err(self.error(ErrorKind::UnexpectedUnaryOperator)))?, [INFO] [stdout] | |_____________________________________________________________________________________^ help: try: `UnaryKind::try_from(op.kind).map_err(|_| self.error(ErrorKind::UnexpectedUnaryOperator))` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bind_instead_of_map [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: field `0` is never read [INFO] [stdout] --> src/ast.rs:9:10 [INFO] [stdout] | [INFO] [stdout] 9 | Char(String), [INFO] [stdout] | ---- ^^^^^^ [INFO] [stdout] | | [INFO] [stdout] | field in this variant [INFO] [stdout] | [INFO] [stdout] = note: `LiteralKind` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis [INFO] [stdout] = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] help: consider changing the field to be of unit type to suppress this warning while preserving the field numbering, or remove the field [INFO] [stdout] | [INFO] [stdout] 9 - Char(String), [INFO] [stdout] 9 + Char(()), [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: field `kind` is never read [INFO] [stdout] --> src/codegen.rs:22:9 [INFO] [stdout] | [INFO] [stdout] 19 | pub struct StoredVariable<'a> { [INFO] [stdout] | -------------- field in this struct [INFO] [stdout] ... [INFO] [stdout] 22 | pub kind: BasicTypeEnum<'a>, [INFO] [stdout] | ^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `StoredVariable` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: fields `fpm`, `begin_block`, and `return_value` are never read [INFO] [stdout] --> src/codegen.rs:29:9 [INFO] [stdout] | [INFO] [stdout] 26 | pub struct Codegen<'a, 'ctx> { [INFO] [stdout] | ------- fields in this struct [INFO] [stdout] ... [INFO] [stdout] 29 | pub fpm: &'a PassManager>, [INFO] [stdout] | ^^^ [INFO] [stdout] ... [INFO] [stdout] 34 | pub begin_block: Option>, [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 37 | pub return_value: Option>, [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `Result.or_else(|x| Err(y))`, which is more succinctly expressed as `map_err(|x| y)` [INFO] [stdout] --> src/parser.rs:306:23 [INFO] [stdout] | [INFO] [stdout] 306 | kind: AssignmentKind::try_from(op.kind) [INFO] [stdout] | _______________________^ [INFO] [stdout] 307 | | .or_else(|_| Err(self.error(ErrorKind::UnexpectedBinaryOperator)))?, [INFO] [stdout] | |______________________________________________________________________________________^ help: try: `AssignmentKind::try_from(op.kind).map_err(|_| self.error(ErrorKind::UnexpectedBinaryOperator))` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bind_instead_of_map [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `Result.or_else(|x| Err(y))`, which is more succinctly expressed as `map_err(|x| y)` [INFO] [stdout] --> src/parser.rs:328:23 [INFO] [stdout] | [INFO] [stdout] 328 | kind: BinaryKind::try_from(op.kind) [INFO] [stdout] | _______________________^ [INFO] [stdout] 329 | | .or_else(|_| Err(self.error(ErrorKind::UnexpectedBinaryOperator)))?, [INFO] [stdout] | |______________________________________________________________________________________^ help: try: `BinaryKind::try_from(op.kind).map_err(|_| self.error(ErrorKind::UnexpectedBinaryOperator))` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bind_instead_of_map [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `Result.or_else(|x| Err(y))`, which is more succinctly expressed as `map_err(|x| y)` [INFO] [stdout] --> src/parser.rs:344:23 [INFO] [stdout] | [INFO] [stdout] 344 | kind: BinaryKind::try_from(op.kind.clone()) [INFO] [stdout] | _______________________^ [INFO] [stdout] 345 | | .or_else(|_| Err(self.error(ErrorKind::UnexpectedBinaryOperator)))?, [INFO] [stdout] | |______________________________________________________________________________________^ help: try: `BinaryKind::try_from(op.kind.clone()).map_err(|_| self.error(ErrorKind::UnexpectedBinaryOperator))` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bind_instead_of_map [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `clone` on type `TokenKind` which implements the `Copy` trait [INFO] [stdout] --> src/parser.rs:344:44 [INFO] [stdout] | [INFO] [stdout] 344 | kind: BinaryKind::try_from(op.kind.clone()) [INFO] [stdout] | ^^^^^^^^^^^^^^^ help: try removing the `clone` call: `op.kind` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `Result.or_else(|x| Err(y))`, which is more succinctly expressed as `map_err(|x| y)` [INFO] [stdout] --> src/parser.rs:367:23 [INFO] [stdout] | [INFO] [stdout] 367 | kind: BinaryKind::try_from(op.kind) [INFO] [stdout] | _______________________^ [INFO] [stdout] 368 | | .or_else(|_| Err(self.error(ErrorKind::UnexpectedBinaryOperator)))?, [INFO] [stdout] | |______________________________________________________________________________________^ help: try: `BinaryKind::try_from(op.kind).map_err(|_| self.error(ErrorKind::UnexpectedBinaryOperator))` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bind_instead_of_map [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: direct implementation of `ToString` [INFO] [stdout] --> src/ast.rs:38:1 [INFO] [stdout] | [INFO] [stdout] 38 | / impl ToString for BinaryKind { [INFO] [stdout] 39 | | fn to_string(&self) -> String { [INFO] [stdout] 40 | | match self { [INFO] [stdout] 41 | | BinaryKind::Plus => "+", [INFO] [stdout] ... | [INFO] [stdout] 57 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: prefer implementing `Display` instead [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#to_string_trait_impl [INFO] [stdout] = note: `#[warn(clippy::to_string_trait_impl)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: direct implementation of `ToString` [INFO] [stdout] --> src/ast.rs:59:1 [INFO] [stdout] | [INFO] [stdout] 59 | / impl ToString for AssignmentKind { [INFO] [stdout] 60 | | fn to_string(&self) -> String { [INFO] [stdout] 61 | | match self { [INFO] [stdout] 62 | | AssignmentKind::Equal => "=", [INFO] [stdout] ... | [INFO] [stdout] 73 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: prefer implementing `Display` instead [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#to_string_trait_impl [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: direct implementation of `ToString` [INFO] [stdout] --> src/ast.rs:148:1 [INFO] [stdout] | [INFO] [stdout] 148 | / impl ToString for UnaryKind { [INFO] [stdout] 149 | | fn to_string(&self) -> String { [INFO] [stdout] 150 | | match self { [INFO] [stdout] 151 | | UnaryKind::Not => "not", [INFO] [stdout] ... | [INFO] [stdout] 158 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: prefer implementing `Display` instead [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#to_string_trait_impl [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: direct implementation of `ToString` [INFO] [stdout] --> src/tokens.rs:96:1 [INFO] [stdout] | [INFO] [stdout] 96 | / impl ToString for TokenKind { [INFO] [stdout] 97 | | fn to_string(&self) -> String { [INFO] [stdout] 98 | | format!( [INFO] [stdout] 99 | | "`{}`", [INFO] [stdout] ... | [INFO] [stdout] 183 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: prefer implementing `Display` instead [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#to_string_trait_impl [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `impl` can be derived [INFO] [stdout] --> src/utils.rs:62:1 [INFO] [stdout] | [INFO] [stdout] 62 | / impl Default for Span { [INFO] [stdout] 63 | | fn default() -> Self { [INFO] [stdout] 64 | | Self { [INFO] [stdout] 65 | | start: 0, [INFO] [stdout] ... | [INFO] [stdout] 70 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#derivable_impls [INFO] [stdout] = note: `#[warn(clippy::derivable_impls)]` on by default [INFO] [stdout] help: replace the manual implementation with a derive attribute [INFO] [stdout] | [INFO] [stdout] 4 + #[derive(Default)] [INFO] [stdout] 5 | pub struct Span { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual `RangeInclusive::contains` implementation [INFO] [stdout] --> src/utils.rs:87:5 [INFO] [stdout] | [INFO] [stdout] 87 | chr >= b'0' && chr <= b'9' [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `(b'0'..=b'9').contains(&chr)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_range_contains [INFO] [stdout] = note: `#[warn(clippy::manual_range_contains)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual `RangeInclusive::contains` implementation [INFO] [stdout] --> src/utils.rs:91:5 [INFO] [stdout] | [INFO] [stdout] 91 | (chr >= b'a' && chr <= b'z') || (chr >= b'A' && chr <= b'Z') [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `(b'a'..=b'z').contains(&chr)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_range_contains [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual `RangeInclusive::contains` implementation [INFO] [stdout] --> src/utils.rs:91:37 [INFO] [stdout] | [INFO] [stdout] 91 | (chr >= b'a' && chr <= b'z') || (chr >= b'A' && chr <= b'Z') [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `(b'A'..=b'Z').contains(&chr)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_range_contains [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual `RangeInclusive::contains` implementation [INFO] [stdout] --> src/utils.rs:99:5 [INFO] [stdout] | [INFO] [stdout] 99 | (chr >= b'0' && chr <= b'9') || (chr >= b'a' && chr <= b'f') || (chr >= b'A' && chr <= b'F') [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `(b'0'..=b'9').contains(&chr)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_range_contains [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: direct implementation of `ToString` [INFO] [stdout] --> src/ast.rs:322:1 [INFO] [stdout] | [INFO] [stdout] 322 | / impl ToString for Type { [INFO] [stdout] 323 | | fn to_string(&self) -> String { [INFO] [stdout] 324 | | match self { [INFO] [stdout] 325 | | Type::I8 => "i8".to_string(), [INFO] [stdout] ... | [INFO] [stdout] 349 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: prefer implementing `Display` instead [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#to_string_trait_impl [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual `RangeInclusive::contains` implementation [INFO] [stdout] --> src/utils.rs:99:37 [INFO] [stdout] | [INFO] [stdout] 99 | (chr >= b'0' && chr <= b'9') || (chr >= b'a' && chr <= b'f') || (chr >= b'A' && chr <= b'F') [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `(b'a'..=b'f').contains(&chr)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_range_contains [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual `RangeInclusive::contains` implementation [INFO] [stdout] --> src/utils.rs:99:69 [INFO] [stdout] | [INFO] [stdout] 99 | (chr >= b'0' && chr <= b'9') || (chr >= b'a' && chr <= b'f') || (chr >= b'A' && chr <= b'F') [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `(b'A'..=b'F').contains(&chr)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_range_contains [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual `RangeInclusive::contains` implementation [INFO] [stdout] --> src/utils.rs:103:5 [INFO] [stdout] | [INFO] [stdout] 103 | chr >= b'0' && chr <= b'7' [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `(b'0'..=b'7').contains(&chr)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_range_contains [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this boolean expression can be simplified [INFO] [stdout] --> src/ast.rs:366:20 [INFO] [stdout] | [INFO] [stdout] 366 | if !(other == &Type::Void && it.peek().is_some()) && !last.equal(other) { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `!(last.equal(other) || other == &Type::Void && it.peek().is_some())` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#nonminimal_bool [INFO] [stdout] = note: `#[warn(clippy::nonminimal_bool)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/ast.rs:372:9 [INFO] [stdout] | [INFO] [stdout] 372 | return Type::Void; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] = note: `#[warn(clippy::needless_return)]` on by default [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 372 - return Type::Void; [INFO] [stdout] 372 + Type::Void [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: match expression looks like `matches!` macro [INFO] [stdout] --> src/ast.rs:376:9 [INFO] [stdout] | [INFO] [stdout] 376 | / match self { [INFO] [stdout] 377 | | Type::I8 [INFO] [stdout] 378 | | | Type::U8 [INFO] [stdout] 379 | | | Type::I16 [INFO] [stdout] ... | [INFO] [stdout] 389 | | _ => false, [INFO] [stdout] 390 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_like_matches_macro [INFO] [stdout] = note: `#[warn(clippy::match_like_matches_macro)]` on by default [INFO] [stdout] help: use `matches!` directly [INFO] [stdout] | [INFO] [stdout] 376 ~ matches!(self, Type::I8 [INFO] [stdout] 377 + | Type::U8 [INFO] [stdout] 378 + | Type::I16 [INFO] [stdout] 379 + | Type::U16 [INFO] [stdout] 380 + | Type::I32 [INFO] [stdout] 381 + | Type::U32 [INFO] [stdout] 382 + | Type::I64 [INFO] [stdout] 383 + | Type::U64 [INFO] [stdout] 384 + | Type::F32 [INFO] [stdout] 385 + | Type::F64 [INFO] [stdout] 386 + | Type::CInt [INFO] [stdout] 387 + | Type::USize) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/main.rs:29:58 [INFO] [stdout] | [INFO] [stdout] 29 | eprintln!("{}", warning.show(content.as_bytes(), &filename).unwrap()); [INFO] [stdout] | ^^^^^^^^^ help: change this to: `filename` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: match expression looks like `matches!` macro [INFO] [stdout] --> src/ast.rs:394:9 [INFO] [stdout] | [INFO] [stdout] 394 | / match self { [INFO] [stdout] 395 | | Type::I8 [INFO] [stdout] 396 | | | Type::U8 [INFO] [stdout] 397 | | | Type::I16 [INFO] [stdout] ... | [INFO] [stdout] 405 | | _ => false, [INFO] [stdout] 406 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_like_matches_macro [INFO] [stdout] help: use `matches!` directly [INFO] [stdout] | [INFO] [stdout] 394 ~ matches!(self, Type::I8 [INFO] [stdout] 395 + | Type::U8 [INFO] [stdout] 396 + | Type::I16 [INFO] [stdout] 397 + | Type::U16 [INFO] [stdout] 398 + | Type::I32 [INFO] [stdout] 399 + | Type::U32 [INFO] [stdout] 400 + | Type::I64 [INFO] [stdout] 401 + | Type::U64 [INFO] [stdout] 402 + | Type::CInt [INFO] [stdout] 403 + | Type::USize) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: match expression looks like `matches!` macro [INFO] [stdout] --> src/ast.rs:410:9 [INFO] [stdout] | [INFO] [stdout] 410 | / match self { [INFO] [stdout] 411 | | Type::I8 [INFO] [stdout] 412 | | | Type::U8 [INFO] [stdout] 413 | | | Type::I16 [INFO] [stdout] ... | [INFO] [stdout] 426 | | _ => false, [INFO] [stdout] 427 | | } [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_like_matches_macro [INFO] [stdout] help: use `matches!` directly [INFO] [stdout] | [INFO] [stdout] 410 ~ matches!(self, Type::I8 [INFO] [stdout] 411 + | Type::U8 [INFO] [stdout] 412 + | Type::I16 [INFO] [stdout] 413 + | Type::U16 [INFO] [stdout] 414 + | Type::I32 [INFO] [stdout] 415 + | Type::U32 [INFO] [stdout] 416 + | Type::I64 [INFO] [stdout] 417 + | Type::U64 [INFO] [stdout] 418 + | Type::F32 [INFO] [stdout] 419 + | Type::F64 [INFO] [stdout] 420 + | Type::Bool [INFO] [stdout] 421 + | Type::CInt [INFO] [stdout] 422 + | Type::CChar [INFO] [stdout] 423 + | Type::USize [INFO] [stdout] 424 + | Type::Char) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/ast.rs:568:9 [INFO] [stdout] | [INFO] [stdout] 568 | return String::new(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 568 - return String::new(); [INFO] [stdout] 568 + String::new() [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods called `from_*` usually take no `self` [INFO] [stdout] --> src/codegen.rs:237:37 [INFO] [stdout] | [INFO] [stdout] 237 | fn from_type_to_llvm_basic_type(&self, from: &Type) -> Option> { [INFO] [stdout] | ^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: consider choosing a less ambiguous name [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#wrong_self_convention [INFO] [stdout] = note: `#[warn(clippy::wrong_self_convention)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/codegen.rs:601:9 [INFO] [stdout] | [INFO] [stdout] 601 | return false; [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 601 - return false; [INFO] [stdout] 601 + false [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/codegen.rs:589:58 [INFO] [stdout] | [INFO] [stdout] 589 | if let Some(value) = self.expression(&expression) { [INFO] [stdout] | ^^^^^^^^^^^ help: change this to: `expression` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] = note: `#[warn(clippy::needless_borrow)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: writing `&Vec` instead of `&[_]` involves a new object where a slice will do [INFO] [stdout] --> src/codegen.rs:604:46 [INFO] [stdout] | [INFO] [stdout] 604 | pub fn statements(&mut self, statements: &Vec) -> bool { [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stdout] = note: `#[warn(clippy::ptr_arg)]` on by default [INFO] [stdout] help: change this to [INFO] [stdout] | [INFO] [stdout] 604 - pub fn statements(&mut self, statements: &Vec) -> bool { [INFO] [stdout] 604 + pub fn statements(&mut self, statements: &[Statement]) -> bool { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: direct implementation of `ToString` [INFO] [stdout] --> src/error.rs:86:1 [INFO] [stdout] | [INFO] [stdout] 86 | / impl ToString for ErrorKind { [INFO] [stdout] 87 | | fn to_string(&self) -> String { [INFO] [stdout] 88 | | match self { [INFO] [stdout] 89 | | ErrorKind::UnexpectedToken => "unexpected token".to_string(), [INFO] [stdout] ... | [INFO] [stdout] 166 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: prefer implementing `Display` instead [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#to_string_trait_impl [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/error.rs:95:69 [INFO] [stdout] | [INFO] [stdout] 95 | format!("expected token: {}", TokenKind::from_array(&tokens)) [INFO] [stdout] | ^^^^^^^ help: change this to: `tokens` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: direct implementation of `ToString` [INFO] [stdout] --> src/error.rs:184:1 [INFO] [stdout] | [INFO] [stdout] 184 | / impl ToString for ErrorSeverity { [INFO] [stdout] 185 | | fn to_string(&self) -> String { [INFO] [stdout] 186 | | match self { [INFO] [stdout] 187 | | ErrorSeverity::Warning => "warning", [INFO] [stdout] ... | [INFO] [stdout] 192 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: prefer implementing `Display` instead [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#to_string_trait_impl [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: returning the result of a `let` binding from a block [INFO] [stdout] --> src/lexer.rs:244:17 [INFO] [stdout] | [INFO] [stdout] 243 | let token = self.create_token(TokenKind::EndLine, 1); [INFO] [stdout] | ----------------------------------------------------- unnecessary `let` binding [INFO] [stdout] 244 | token [INFO] [stdout] | ^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#let_and_return [INFO] [stdout] = note: `#[warn(clippy::let_and_return)]` on by default [INFO] [stdout] help: return the expression directly [INFO] [stdout] | [INFO] [stdout] 243 ~ [INFO] [stdout] 244 ~ self.create_token(TokenKind::EndLine, 1) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/linter.rs:246:25 [INFO] [stdout] | [INFO] [stdout] 246 | return Ok(*kind.clone()); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 246 - return Ok(*kind.clone()); [INFO] [stdout] 246 + Ok(*kind.clone()) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/linter.rs:249:25 [INFO] [stdout] | [INFO] [stdout] 249 | / return Err(Error { [INFO] [stdout] 250 | | kind: ErrorKind::AccessValueToNonArrayType, [INFO] [stdout] 251 | | severity: ErrorSeverity::Error, [INFO] [stdout] 252 | | span: array_access.span, [INFO] [stdout] 253 | | }); [INFO] [stdout] | |__________________________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 249 ~ Err(Error { [INFO] [stdout] 250 + kind: ErrorKind::AccessValueToNonArrayType, [INFO] [stdout] 251 + severity: ErrorSeverity::Error, [INFO] [stdout] 252 + span: array_access.span, [INFO] [stdout] 253 ~ }) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `clone` on type `Span` which implements the `Copy` trait [INFO] [stdout] --> src/linter.rs:118:39 [INFO] [stdout] | [INFO] [stdout] 118 | ... span: unary.span.clone(), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ help: try removing the `clone` call: `unary.span` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stdout] = note: `#[warn(clippy::clone_on_copy)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant pattern matching, consider using `is_some()` [INFO] [stdout] --> src/linter.rs:288:16 [INFO] [stdout] | [INFO] [stdout] 288 | if let Some(_) = self.find_function_by_name(&prototype.name) { [INFO] [stdout] | -------^^^^^^^---------------------------------------------- help: try: `if self.find_function_by_name(&prototype.name).is_some()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_pattern_matching [INFO] [stdout] = note: `#[warn(clippy::redundant_pattern_matching)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `clone` on type `Span` which implements the `Copy` trait [INFO] [stdout] --> src/linter.rs:292:23 [INFO] [stdout] | [INFO] [stdout] 292 | span: prototype.span.clone(), [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ help: try removing the `clone` call: `prototype.span` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: redundant pattern matching, consider using `is_some()` [INFO] [stdout] --> src/linter.rs:338:16 [INFO] [stdout] | [INFO] [stdout] 338 | if let Some(_) = self [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_pattern_matching [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 338 ~ if self [INFO] [stdout] 339 + .variables [INFO] [stdout] 340 + .iter() [INFO] [stdout] 341 + .find(|item| item.name == decl.name && self.scope == item.scope).is_some() [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: passing a unit value to a function [INFO] [stdout] --> src/linter.rs:386:9 [INFO] [stdout] | [INFO] [stdout] 386 | / Ok(match statement { [INFO] [stdout] 387 | | Statement::Expression(expression) => { [INFO] [stdout] 388 | | self.check_expression(expression)?; [INFO] [stdout] ... | [INFO] [stdout] 512 | | }) [INFO] [stdout] | |__________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unit_arg [INFO] [stdout] = note: `#[warn(clippy::unit_arg)]` on by default [INFO] [stdout] help: move the expression in front of the call and replace it with the unit literal `()` [INFO] [stdout] | [INFO] [stdout] 386 ~ let _: () = match statement { [INFO] [stdout] 387 + Statement::Expression(expression) => { [INFO] [stdout] 388 + self.check_expression(expression)?; [INFO] [stdout] 389 + } [INFO] [stdout] 390 + Statement::VariableDeclaration(decl) => { [INFO] [stdout] 391 + let variable = self.create_variable(decl)?; [INFO] [stdout] 392 + let variable_kind = variable.kind.clone(); [INFO] [stdout] 393 + self.variables.push(variable); [INFO] [stdout] 394 + *decl = VariableDeclaration { [INFO] [stdout] 395 + mutable: decl.mutable, [INFO] [stdout] 396 + name: decl.name.clone(), [INFO] [stdout] 397 + span: decl.span, [INFO] [stdout] 398 + value: decl.value.clone(), [INFO] [stdout] 399 + variable_type: variable_kind, [INFO] [stdout] 400 + }; [INFO] [stdout] 401 + } [INFO] [stdout] 402 + Statement::Block(block) => { [INFO] [stdout] 403 + self.in_loop += 1; [INFO] [stdout] 404 + let kind = Type::merge(&self.check_statements(&mut block.statements)?); [INFO] [stdout] 405 + self.in_loop -= 1; [INFO] [stdout] 406 + types.push(kind); [INFO] [stdout] 407 + } [INFO] [stdout] 408 + Statement::Loop(block) => { [INFO] [stdout] 409 + self.in_loop += 1; [INFO] [stdout] 410 + let kind = Type::merge(&self.check_statements(&mut block.statements)?); [INFO] [stdout] 411 + self.in_loop -= 1; [INFO] [stdout] 412 + types.push(kind); [INFO] [stdout] 413 + } [INFO] [stdout] 414 + Statement::While(while_block) => { [INFO] [stdout] 415 + let check = self.check_expression(&mut while_block.expression)?; [INFO] [stdout] 416 + if check != Type::Bool { [INFO] [stdout] 417 + return Err(Error { [INFO] [stdout] 418 + kind: ErrorKind::MismatchedTypes(Type::Bool, check), [INFO] [stdout] 419 + severity: ErrorSeverity::Error, [INFO] [stdout] 420 + span: while_block.expression.span(), [INFO] [stdout] 421 + }); [INFO] [stdout] 422 + } [INFO] [stdout] 423 + self.in_loop += 1; [INFO] [stdout] 424 + let kind = Type::merge(&self.check_statements(&mut while_block.block)?); [INFO] [stdout] 425 + self.in_loop -= 1; [INFO] [stdout] 426 + types.push(kind); [INFO] [stdout] 427 + } [INFO] [stdout] 428 + Statement::Break(break_statement) => { [INFO] [stdout] 429 + if self.in_loop == 0 { [INFO] [stdout] 430 + return Err(Error { [INFO] [stdout] 431 + kind: ErrorKind::BreakOutsideLoop, [INFO] [stdout] 432 + severity: ErrorSeverity::Error, [INFO] [stdout] 433 + span: break_statement.span, [INFO] [stdout] 434 + }); [INFO] [stdout] 435 + } [INFO] [stdout] 436 + } [INFO] [stdout] 437 + Statement::Continue(continue_statement) => { [INFO] [stdout] 438 + if self.in_loop == 0 { [INFO] [stdout] 439 + return Err(Error { [INFO] [stdout] 440 + kind: ErrorKind::ContinueOutsideLoop, [INFO] [stdout] 441 + severity: ErrorSeverity::Error, [INFO] [stdout] 442 + span: continue_statement.span, [INFO] [stdout] 443 + }); [INFO] [stdout] 444 + } [INFO] [stdout] 445 + } [INFO] [stdout] 446 + Statement::If(if_statement) => { [INFO] [stdout] 447 + let check = self.check_expression(&mut if_statement.expression)?; [INFO] [stdout] 448 + if check != Type::Bool { [INFO] [stdout] 449 + return Err(Error { [INFO] [stdout] 450 + kind: ErrorKind::MismatchedTypes(Type::Bool, check), [INFO] [stdout] 451 + severity: ErrorSeverity::Error, [INFO] [stdout] 452 + span: if_statement.expression.span(), [INFO] [stdout] 453 + }); [INFO] [stdout] 454 + } [INFO] [stdout] 455 + let lhs = Type::merge(&self.check_statements(&mut if_statement.true_block)?); [INFO] [stdout] 456 + [INFO] [stdout] 457 + if !if_statement.else_block.is_empty() { [INFO] [stdout] 458 + let rhs = Type::merge(&self.check_statements(&mut if_statement.else_block)?); [INFO] [stdout] 459 + if !lhs.equal(&rhs) { [INFO] [stdout] 460 + return Err(Error { [INFO] [stdout] 461 + kind: ErrorKind::MismatchedTypes(lhs, rhs), [INFO] [stdout] 462 + severity: ErrorSeverity::Error, [INFO] [stdout] 463 + span: Span::default(), [INFO] [stdout] 464 + }); [INFO] [stdout] 465 + } [INFO] [stdout] 466 + types.push(lhs); [INFO] [stdout] 467 + } else { [INFO] [stdout] 468 + types.push(Type::Void); [INFO] [stdout] 469 + } [INFO] [stdout] 470 + } [INFO] [stdout] 471 + Statement::Prototype(prototype) => { [INFO] [stdout] 472 + let mut stored_prototype = self.create_prototype(prototype)?; [INFO] [stdout] 473 + let mut saved_kind = stored_prototype.return_kind.clone(); [INFO] [stdout] 474 + if stored_prototype.return_kind == Type::Unknown { [INFO] [stdout] 475 + stored_prototype.return_kind = Type::Void; [INFO] [stdout] 476 + saved_kind = Type::Void; [INFO] [stdout] 477 + } [INFO] [stdout] 478 + self.functions.push(stored_prototype); [INFO] [stdout] 479 + *prototype = Prototype { [INFO] [stdout] 480 + is_extern: prototype.is_extern, [INFO] [stdout] 481 + name: prototype.name.clone(), [INFO] [stdout] 482 + params: prototype.params.clone(), [INFO] [stdout] 483 + return_type: saved_kind.clone(), [INFO] [stdout] 484 + span: prototype.span, [INFO] [stdout] 485 + }; [INFO] [stdout] 486 + types.push(saved_kind); [INFO] [stdout] 487 + } [INFO] [stdout] 488 + Statement::Function(function) => { [INFO] [stdout] 489 + function.prototype.return_type = self.create_function(function)?; [INFO] [stdout] 490 + types.push(function.prototype.return_type.clone()); [INFO] [stdout] 491 + } [INFO] [stdout] 492 + Statement::Return(value) => { [INFO] [stdout] 493 + types.push(if let Some(expression) = &mut value.expression { [INFO] [stdout] 494 + self.check_expression(expression)? [INFO] [stdout] 495 + } else { [INFO] [stdout] 496 + Type::Void [INFO] [stdout] 497 + }); [INFO] [stdout] 498 + } [INFO] [stdout] 499 + Statement::Unsafe(unsafe_statement) => { [INFO] [stdout] 500 + if self.in_unsafe > 0 { [INFO] [stdout] 501 + self.warnings.push(Error { [INFO] [stdout] 502 + kind: ErrorKind::UnnecessaryUnsafe, [INFO] [stdout] 503 + severity: ErrorSeverity::Warning, [INFO] [stdout] 504 + span: unsafe_statement.span, [INFO] [stdout] 505 + }); [INFO] [stdout] 506 + } [INFO] [stdout] 507 + self.in_unsafe += 1; [INFO] [stdout] 508 + let kind = Type::merge(&self.check_statements(&mut unsafe_statement.statements)?); [INFO] [stdout] 509 + self.in_unsafe -= 1; [INFO] [stdout] 510 + types.push(kind); [INFO] [stdout] 511 + } [INFO] [stdout] 512 + }; [INFO] [stdout] 513 + Ok(()) [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the borrowed expression implements the required traits [INFO] [stdout] --> src/main.rs:78:39 [INFO] [stdout] | [INFO] [stdout] 78 | let contents = fs::read_to_string(&filename).unwrap(); [INFO] [stdout] | ^^^^^^^^^ help: change this to: `filename` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrows_for_generic_args [INFO] [stdout] = note: `#[warn(clippy::needless_borrows_for_generic_args)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/main.rs:79:33 [INFO] [stdout] | [INFO] [stdout] 79 | if let Err(error) = compile(&filename, &contents) { [INFO] [stdout] | ^^^^^^^^^ help: change this to: `filename` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/main.rs:80:57 [INFO] [stdout] | [INFO] [stdout] 80 | eprintln!("{}", error.show(contents.as_bytes(), &filename).unwrap()); [INFO] [stdout] | ^^^^^^^^^ help: change this to: `filename` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this loop could be written as a `for` loop [INFO] [stdout] --> src/linter.rs:519:9 [INFO] [stdout] | [INFO] [stdout] 519 | while let Some(statement) = iter.next() { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `for statement in iter` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#while_let_on_iterator [INFO] [stdout] = note: `#[warn(clippy::while_let_on_iterator)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/parser.rs:65:9 [INFO] [stdout] | [INFO] [stdout] 65 | return false; [INFO] [stdout] | ^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 65 - return false; [INFO] [stdout] 65 + false [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `clone` on type `TokenKind` which implements the `Copy` trait [INFO] [stdout] --> src/parser.rs:60:27 [INFO] [stdout] | [INFO] [stdout] 60 | if self.check(kind.clone()) { [INFO] [stdout] | ^^^^^^^^^^^^ help: try dereferencing it: `*kind` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/parser.rs:109:9 [INFO] [stdout] | [INFO] [stdout] 109 | return None; [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 109 - return None; [INFO] [stdout] 109 + None [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `clone` on type `TokenKind` which implements the `Copy` trait [INFO] [stdout] --> src/parser.rs:102:27 [INFO] [stdout] | [INFO] [stdout] 102 | if self.check(kind.clone()) { [INFO] [stdout] | ^^^^^^^^^^^^ help: try dereferencing it: `*kind` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `clone` on type `Span` which implements the `Copy` trait [INFO] [stdout] --> src/parser.rs:124:33 [INFO] [stdout] | [INFO] [stdout] 124 | self.current_span = token.span.clone(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ help: try removing the `clone` call: `token.span` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `Result.or_else(|x| Err(y))`, which is more succinctly expressed as `map_err(|x| y)` [INFO] [stdout] --> src/parser.rs:162:21 [INFO] [stdout] | [INFO] [stdout] 162 | / token [INFO] [stdout] 163 | | .slice [INFO] [stdout] 164 | | .parse::() [INFO] [stdout] 165 | | .or_else(|_| Err(self.error(ErrorKind::InvalidInteger)))?, [INFO] [stdout] | |________________________________________________________________________________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bind_instead_of_map [INFO] [stdout] = note: `#[warn(clippy::bind_instead_of_map)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 162 ~ token [INFO] [stdout] 163 + .slice [INFO] [stdout] 164 ~ .parse::().map_err(|_| self.error(ErrorKind::InvalidInteger))?, [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/parser.rs:254:9 [INFO] [stdout] | [INFO] [stdout] 254 | return self.primary(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 254 - return self.primary(); [INFO] [stdout] 254 + self.primary() [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `Result.or_else(|x| Err(y))`, which is more succinctly expressed as `map_err(|x| y)` [INFO] [stdout] --> src/parser.rs:267:23 [INFO] [stdout] | [INFO] [stdout] 267 | kind: UnaryKind::try_from(op.kind) [INFO] [stdout] | _______________________^ [INFO] [stdout] 268 | | .or_else(|_| Err(self.error(ErrorKind::UnexpectedUnaryOperator)))?, [INFO] [stdout] | |_____________________________________________________________________________________^ help: try: `UnaryKind::try_from(op.kind).map_err(|_| self.error(ErrorKind::UnexpectedUnaryOperator))` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bind_instead_of_map [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `Result.or_else(|x| Err(y))`, which is more succinctly expressed as `map_err(|x| y)` [INFO] [stdout] --> src/parser.rs:306:23 [INFO] [stdout] | [INFO] [stdout] 306 | kind: AssignmentKind::try_from(op.kind) [INFO] [stdout] | _______________________^ [INFO] [stdout] 307 | | .or_else(|_| Err(self.error(ErrorKind::UnexpectedBinaryOperator)))?, [INFO] [stdout] | |______________________________________________________________________________________^ help: try: `AssignmentKind::try_from(op.kind).map_err(|_| self.error(ErrorKind::UnexpectedBinaryOperator))` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bind_instead_of_map [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `Result.or_else(|x| Err(y))`, which is more succinctly expressed as `map_err(|x| y)` [INFO] [stdout] --> src/parser.rs:328:23 [INFO] [stdout] | [INFO] [stdout] 328 | kind: BinaryKind::try_from(op.kind) [INFO] [stdout] | _______________________^ [INFO] [stdout] 329 | | .or_else(|_| Err(self.error(ErrorKind::UnexpectedBinaryOperator)))?, [INFO] [stdout] | |______________________________________________________________________________________^ help: try: `BinaryKind::try_from(op.kind).map_err(|_| self.error(ErrorKind::UnexpectedBinaryOperator))` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bind_instead_of_map [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `Result.or_else(|x| Err(y))`, which is more succinctly expressed as `map_err(|x| y)` [INFO] [stdout] --> src/parser.rs:344:23 [INFO] [stdout] | [INFO] [stdout] 344 | kind: BinaryKind::try_from(op.kind.clone()) [INFO] [stdout] | _______________________^ [INFO] [stdout] 345 | | .or_else(|_| Err(self.error(ErrorKind::UnexpectedBinaryOperator)))?, [INFO] [stdout] | |______________________________________________________________________________________^ help: try: `BinaryKind::try_from(op.kind.clone()).map_err(|_| self.error(ErrorKind::UnexpectedBinaryOperator))` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bind_instead_of_map [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `clone` on type `TokenKind` which implements the `Copy` trait [INFO] [stdout] --> src/parser.rs:344:44 [INFO] [stdout] | [INFO] [stdout] 344 | kind: BinaryKind::try_from(op.kind.clone()) [INFO] [stdout] | ^^^^^^^^^^^^^^^ help: try removing the `clone` call: `op.kind` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: using `Result.or_else(|x| Err(y))`, which is more succinctly expressed as `map_err(|x| y)` [INFO] [stdout] --> src/parser.rs:367:23 [INFO] [stdout] | [INFO] [stdout] 367 | kind: BinaryKind::try_from(op.kind) [INFO] [stdout] | _______________________^ [INFO] [stdout] 368 | | .or_else(|_| Err(self.error(ErrorKind::UnexpectedBinaryOperator)))?, [INFO] [stdout] | |______________________________________________________________________________________^ help: try: `BinaryKind::try_from(op.kind).map_err(|_| self.error(ErrorKind::UnexpectedBinaryOperator))` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bind_instead_of_map [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: direct implementation of `ToString` [INFO] [stdout] --> src/tokens.rs:96:1 [INFO] [stdout] | [INFO] [stdout] 96 | / impl ToString for TokenKind { [INFO] [stdout] 97 | | fn to_string(&self) -> String { [INFO] [stdout] 98 | | format!( [INFO] [stdout] 99 | | "`{}`", [INFO] [stdout] ... | [INFO] [stdout] 183 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: prefer implementing `Display` instead [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#to_string_trait_impl [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this `impl` can be derived [INFO] [stdout] --> src/utils.rs:62:1 [INFO] [stdout] | [INFO] [stdout] 62 | / impl Default for Span { [INFO] [stdout] 63 | | fn default() -> Self { [INFO] [stdout] 64 | | Self { [INFO] [stdout] 65 | | start: 0, [INFO] [stdout] ... | [INFO] [stdout] 70 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#derivable_impls [INFO] [stdout] = note: `#[warn(clippy::derivable_impls)]` on by default [INFO] [stdout] help: replace the manual implementation with a derive attribute [INFO] [stdout] | [INFO] [stdout] 4 + #[derive(Default)] [INFO] [stdout] 5 | pub struct Span { [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual `RangeInclusive::contains` implementation [INFO] [stdout] --> src/utils.rs:87:5 [INFO] [stdout] | [INFO] [stdout] 87 | chr >= b'0' && chr <= b'9' [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `(b'0'..=b'9').contains(&chr)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_range_contains [INFO] [stdout] = note: `#[warn(clippy::manual_range_contains)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual `RangeInclusive::contains` implementation [INFO] [stdout] --> src/utils.rs:91:5 [INFO] [stdout] | [INFO] [stdout] 91 | (chr >= b'a' && chr <= b'z') || (chr >= b'A' && chr <= b'Z') [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `(b'a'..=b'z').contains(&chr)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_range_contains [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual `RangeInclusive::contains` implementation [INFO] [stdout] --> src/utils.rs:91:37 [INFO] [stdout] | [INFO] [stdout] 91 | (chr >= b'a' && chr <= b'z') || (chr >= b'A' && chr <= b'Z') [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `(b'A'..=b'Z').contains(&chr)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_range_contains [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual `RangeInclusive::contains` implementation [INFO] [stdout] --> src/utils.rs:99:5 [INFO] [stdout] | [INFO] [stdout] 99 | (chr >= b'0' && chr <= b'9') || (chr >= b'a' && chr <= b'f') || (chr >= b'A' && chr <= b'F') [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `(b'0'..=b'9').contains(&chr)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_range_contains [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual `RangeInclusive::contains` implementation [INFO] [stdout] --> src/utils.rs:99:37 [INFO] [stdout] | [INFO] [stdout] 99 | (chr >= b'0' && chr <= b'9') || (chr >= b'a' && chr <= b'f') || (chr >= b'A' && chr <= b'F') [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `(b'a'..=b'f').contains(&chr)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_range_contains [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual `RangeInclusive::contains` implementation [INFO] [stdout] --> src/utils.rs:99:69 [INFO] [stdout] | [INFO] [stdout] 99 | (chr >= b'0' && chr <= b'9') || (chr >= b'a' && chr <= b'f') || (chr >= b'A' && chr <= b'F') [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `(b'A'..=b'F').contains(&chr)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_range_contains [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: manual `RangeInclusive::contains` implementation [INFO] [stdout] --> src/utils.rs:103:5 [INFO] [stdout] | [INFO] [stdout] 103 | chr >= b'0' && chr <= b'7' [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `(b'0'..=b'7').contains(&chr)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_range_contains [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/main.rs:29:58 [INFO] [stdout] | [INFO] [stdout] 29 | eprintln!("{}", warning.show(content.as_bytes(), &filename).unwrap()); [INFO] [stdout] | ^^^^^^^^^ help: change this to: `filename` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: the borrowed expression implements the required traits [INFO] [stdout] --> src/main.rs:78:39 [INFO] [stdout] | [INFO] [stdout] 78 | let contents = fs::read_to_string(&filename).unwrap(); [INFO] [stdout] | ^^^^^^^^^ help: change this to: `filename` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrows_for_generic_args [INFO] [stdout] = note: `#[warn(clippy::needless_borrows_for_generic_args)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/main.rs:79:33 [INFO] [stdout] | [INFO] [stdout] 79 | if let Err(error) = compile(&filename, &contents) { [INFO] [stdout] | ^^^^^^^^^ help: change this to: `filename` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/main.rs:80:57 [INFO] [stdout] | [INFO] [stdout] 80 | eprintln!("{}", error.show(contents.as_bytes(), &filename).unwrap()); [INFO] [stdout] | ^^^^^^^^^ help: change this to: `filename` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] [INFO] [stdout] [INFO] [stderr] Finished `dev` profile [unoptimized + debuginfo] target(s) in 12.55s [INFO] running `Command { std: "docker" "inspect" "1b80ce18bbaa0a2206d53a8365a0d86ce97ae902e854c18c555ec182b55f30c7", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "1b80ce18bbaa0a2206d53a8365a0d86ce97ae902e854c18c555ec182b55f30c7", kill_on_drop: false }` [INFO] [stdout] 1b80ce18bbaa0a2206d53a8365a0d86ce97ae902e854c18c555ec182b55f30c7