[INFO] updating cached repository GodTamIt/tiger-compiler-rs [INFO] running `"git" "fetch" "--all"` [INFO] [stdout] Fetching origin [INFO] [stderr] From git://github.com/GodTamIt/tiger-compiler-rs [INFO] [stderr] * branch HEAD -> FETCH_HEAD [INFO] running `"git" "clone" "work/cache/sources/gh/GodTamIt/tiger-compiler-rs" "work/ex/clippy-test-run/sources/stable/gh/GodTamIt/tiger-compiler-rs"` [INFO] [stderr] Cloning into 'work/ex/clippy-test-run/sources/stable/gh/GodTamIt/tiger-compiler-rs'... [INFO] [stderr] done. [INFO] running `"git" "clone" "work/cache/sources/gh/GodTamIt/tiger-compiler-rs" "work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/GodTamIt/tiger-compiler-rs"` [INFO] [stderr] Cloning into 'work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/GodTamIt/tiger-compiler-rs'... [INFO] [stderr] done. [INFO] running `"git" "rev-parse" "HEAD"` [INFO] [stdout] db3c1f50e45097e90ee029c88c7b80322c08c2fe [INFO] sha for GitHub repo GodTamIt/tiger-compiler-rs: db3c1f50e45097e90ee029c88c7b80322c08c2fe [INFO] validating manifest of GodTamIt/tiger-compiler-rs on toolchain stable [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "read-manifest" "--manifest-path" "Cargo.toml"` [INFO] validating manifest of GodTamIt/tiger-compiler-rs on toolchain stable+rustflags=-Dclippy::into_iter_on_array [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "read-manifest" "--manifest-path" "Cargo.toml"` [INFO] started frobbing GodTamIt/tiger-compiler-rs [INFO] finished frobbing GodTamIt/tiger-compiler-rs [INFO] frobbed toml for GodTamIt/tiger-compiler-rs written to work/ex/clippy-test-run/sources/stable/gh/GodTamIt/tiger-compiler-rs/Cargo.toml [INFO] started frobbing GodTamIt/tiger-compiler-rs [INFO] finished frobbing GodTamIt/tiger-compiler-rs [INFO] frobbed toml for GodTamIt/tiger-compiler-rs written to work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/GodTamIt/tiger-compiler-rs/Cargo.toml [INFO] crate GodTamIt/tiger-compiler-rs has a lockfile. skipping [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "fetch" "--locked" "--manifest-path" "Cargo.toml"` [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "fetch" "--locked" "--manifest-path" "Cargo.toml"` [INFO] linting GodTamIt/tiger-compiler-rs against stable for clippy-test-run [INFO] running `"docker" "create" "-v" "/mnt/big/crater/work/local/target-dirs/clippy-test-run/worker-2/stable:/opt/crater/target:rw,Z" "-v" "/mnt/big/crater/work/ex/clippy-test-run/sources/stable/gh/GodTamIt/tiger-compiler-rs:/opt/crater/workdir:ro,Z" "-v" "/mnt/big/crater/work/local/cargo-home:/opt/crater/cargo-home:ro,Z" "-v" "/mnt/big/crater/work/local/rustup-home:/opt/crater/rustup-home:ro,Z" "-e" "USER_ID=1000" "-e" "SOURCE_DIR=/opt/crater/workdir" "-e" "MAP_USER_ID=1000" "-e" "CARGO_TARGET_DIR=/opt/crater/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/crater/cargo-home" "-e" "RUSTUP_HOME=/opt/crater/rustup-home" "-w" "/opt/crater/workdir" "-m" "1536M" "--network" "none" "rustops/crates-build-env" "/opt/crater/cargo-home/bin/cargo" "+stable" "clippy" "--frozen" "--all" "--all-targets"` [INFO] [stdout] 5efd28c3b6529ec196a1eb4e3f2cc9bb9dbe592680ac2de3f4d994ce13536aee [INFO] running `"docker" "start" "-a" "5efd28c3b6529ec196a1eb4e3f2cc9bb9dbe592680ac2de3f4d994ce13536aee"` [INFO] [stderr] Checking serde v1.0.35 [INFO] [stderr] Compiling serde_derive_internals v0.22.1 [INFO] [stderr] Checking env_logger v0.5.6 [INFO] [stderr] Compiling serde_derive v1.0.35 [INFO] [stderr] Checking serde_json v1.0.13 [INFO] [stderr] Checking cs4240 v0.1.0 (/opt/crater/workdir) [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/scanner.rs:29:13 [INFO] [stderr] | [INFO] [stderr] 29 | val: val, [INFO] [stderr] | ^^^^^^^^ help: replace it with: `val` [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/scanner.rs:30:13 [INFO] [stderr] | [INFO] [stderr] 30 | token_name: token_name, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `token_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/scanner.rs:31:13 [INFO] [stderr] | [INFO] [stderr] 31 | index: index, [INFO] [stderr] | ^^^^^^^^^^^^ help: replace it with: `index` [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:32:13 [INFO] [stderr] | [INFO] [stderr] 32 | length: length, [INFO] [stderr] | ^^^^^^^^^^^^^^ help: replace it with: `length` [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:33:13 [INFO] [stderr] | [INFO] [stderr] 33 | token_type: token_type, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `token_type` [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: using `write!()` with a format string that ends in a single newline, consider using `writeln!()` instead [INFO] [stderr] --> src/typechecker.rs:38:9 [INFO] [stderr] | [INFO] [stderr] 38 | write!(f, "Symbol Table\n")?; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::write_with_newline)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#write_with_newline [INFO] [stderr] [INFO] [stderr] warning: using `write!()` with a format string that ends in a single newline, consider using `writeln!()` instead [INFO] [stderr] --> src/typechecker.rs:40:13 [INFO] [stderr] | [INFO] [stderr] 40 | write!(f, "{} - {:?}\n", key, self.map.get(key).unwrap())?; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#write_with_newline [INFO] [stderr] [INFO] [stderr] warning: using `write!()` with a format string that ends in a single newline, consider using `writeln!()` instead [INFO] [stderr] --> src/typechecker.rs:42:9 [INFO] [stderr] | [INFO] [stderr] 42 | write!(f, "\n") [INFO] [stderr] | ^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#write_with_newline [INFO] [stderr] [INFO] [stderr] warning: using `write!()` with a format string that ends in a single newline, consider using `writeln!()` instead [INFO] [stderr] --> src/typechecker.rs:76:9 [INFO] [stderr] | [INFO] [stderr] 76 | write!(f, "Symbol Table\n")?; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#write_with_newline [INFO] [stderr] [INFO] [stderr] warning: using `write!()` with a format string that ends in a single newline, consider using `writeln!()` instead [INFO] [stderr] --> src/typechecker.rs:78:13 [INFO] [stderr] | [INFO] [stderr] 78 | write!(f, "func: {}\n", key)?; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#write_with_newline [INFO] [stderr] [INFO] [stderr] warning: using `write!()` with a format string that ends in a single newline, consider using `writeln!()` instead [INFO] [stderr] --> src/typechecker.rs:81:17 [INFO] [stderr] | [INFO] [stderr] 81 | write!(f, "{} - {:?}\n", arg_key, argmap.get(arg_key).unwrap())?; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#write_with_newline [INFO] [stderr] [INFO] [stderr] warning: using `write!()` with a format string that ends in a single newline, consider using `writeln!()` instead [INFO] [stderr] --> src/typechecker.rs:83:13 [INFO] [stderr] | [INFO] [stderr] 83 | write!(f, "\n")?; [INFO] [stderr] | ^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#write_with_newline [INFO] [stderr] [INFO] [stderr] warning: using `write!()` with a format string that ends in a single newline, consider using `writeln!()` instead [INFO] [stderr] --> src/typechecker.rs:85:9 [INFO] [stderr] | [INFO] [stderr] 85 | write!(f, "\n") [INFO] [stderr] | ^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#write_with_newline [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/typechecker.rs:163:13 [INFO] [stderr] | [INFO] [stderr] 163 | cur_type: cur_type, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^ help: replace it with: `cur_type` [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/typechecker.rs:181:13 [INFO] [stderr] | [INFO] [stderr] 181 | cur_type: cur_type, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^ help: replace it with: `cur_type` [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:29:13 [INFO] [stderr] | [INFO] [stderr] 29 | val: val, [INFO] [stderr] | ^^^^^^^^ help: replace it with: `val` [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/scanner.rs:30:13 [INFO] [stderr] | [INFO] [stderr] 30 | token_name: token_name, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `token_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/scanner.rs:31:13 [INFO] [stderr] | [INFO] [stderr] 31 | index: index, [INFO] [stderr] | ^^^^^^^^^^^^ help: replace it with: `index` [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:32:13 [INFO] [stderr] | [INFO] [stderr] 32 | length: length, [INFO] [stderr] | ^^^^^^^^^^^^^^ help: replace it with: `length` [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:33:13 [INFO] [stderr] | [INFO] [stderr] 33 | token_type: token_type, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `token_type` [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: using `write!()` with a format string that ends in a single newline, consider using `writeln!()` instead [INFO] [stderr] --> src/typechecker.rs:38:9 [INFO] [stderr] | [INFO] [stderr] 38 | write!(f, "Symbol Table\n")?; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::write_with_newline)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#write_with_newline [INFO] [stderr] [INFO] [stderr] warning: using `write!()` with a format string that ends in a single newline, consider using `writeln!()` instead [INFO] [stderr] --> src/typechecker.rs:40:13 [INFO] [stderr] | [INFO] [stderr] 40 | write!(f, "{} - {:?}\n", key, self.map.get(key).unwrap())?; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#write_with_newline [INFO] [stderr] [INFO] [stderr] warning: using `write!()` with a format string that ends in a single newline, consider using `writeln!()` instead [INFO] [stderr] --> src/typechecker.rs:42:9 [INFO] [stderr] | [INFO] [stderr] 42 | write!(f, "\n") [INFO] [stderr] | ^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#write_with_newline [INFO] [stderr] [INFO] [stderr] warning: using `write!()` with a format string that ends in a single newline, consider using `writeln!()` instead [INFO] [stderr] --> src/typechecker.rs:76:9 [INFO] [stderr] | [INFO] [stderr] 76 | write!(f, "Symbol Table\n")?; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#write_with_newline [INFO] [stderr] [INFO] [stderr] warning: using `write!()` with a format string that ends in a single newline, consider using `writeln!()` instead [INFO] [stderr] --> src/typechecker.rs:78:13 [INFO] [stderr] | [INFO] [stderr] 78 | write!(f, "func: {}\n", key)?; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#write_with_newline [INFO] [stderr] [INFO] [stderr] warning: using `write!()` with a format string that ends in a single newline, consider using `writeln!()` instead [INFO] [stderr] --> src/typechecker.rs:81:17 [INFO] [stderr] | [INFO] [stderr] 81 | write!(f, "{} - {:?}\n", arg_key, argmap.get(arg_key).unwrap())?; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#write_with_newline [INFO] [stderr] [INFO] [stderr] warning: using `write!()` with a format string that ends in a single newline, consider using `writeln!()` instead [INFO] [stderr] --> src/typechecker.rs:83:13 [INFO] [stderr] | [INFO] [stderr] 83 | write!(f, "\n")?; [INFO] [stderr] | ^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#write_with_newline [INFO] [stderr] [INFO] [stderr] warning: using `write!()` with a format string that ends in a single newline, consider using `writeln!()` instead [INFO] [stderr] --> src/typechecker.rs:85:9 [INFO] [stderr] | [INFO] [stderr] 85 | write!(f, "\n") [INFO] [stderr] | ^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#write_with_newline [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/typechecker.rs:163:13 [INFO] [stderr] | [INFO] [stderr] 163 | cur_type: cur_type, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^ help: replace it with: `cur_type` [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/typechecker.rs:181:13 [INFO] [stderr] | [INFO] [stderr] 181 | cur_type: cur_type, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^ help: replace it with: `cur_type` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/parser.rs:262:5 [INFO] [stderr] | [INFO] [stderr] 262 | return output; [INFO] [stderr] | ^^^^^^^^^^^^^^ help: remove `return` as shown: `output` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::needless_return)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/typechecker.rs:339:5 [INFO] [stderr] | [INFO] [stderr] 339 | return ((rhs.cur_type == BaseType::Integer || rhs.cur_type == BaseType::Float) && (lhs.cur_type == BaseType::Float)) || lhs == rhs [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove `return` as shown: `((rhs.cur_type == BaseType::Integer || rhs.cur_type == BaseType::Float) && (lhs.cur_type == BaseType::Float)) || lhs == rhs` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/typechecker.rs:457:40 [INFO] [stderr] | [INFO] [stderr] 457 | None => return Err(format!("'{}' is not of an indexable type!", &*arena[id_node].data.val)), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove `return` as shown: `Err(format!("'{}' is not of an indexable type!", &*arena[id_node].data.val))` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/parser.rs:262:5 [INFO] [stderr] | [INFO] [stderr] 262 | return output; [INFO] [stderr] | ^^^^^^^^^^^^^^ help: remove `return` as shown: `output` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::needless_return)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/typechecker.rs:339:5 [INFO] [stderr] | [INFO] [stderr] 339 | return ((rhs.cur_type == BaseType::Integer || rhs.cur_type == BaseType::Float) && (lhs.cur_type == BaseType::Float)) || lhs == rhs [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove `return` as shown: `((rhs.cur_type == BaseType::Integer || rhs.cur_type == BaseType::Float) && (lhs.cur_type == BaseType::Float)) || lhs == rhs` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/typechecker.rs:457:40 [INFO] [stderr] | [INFO] [stderr] 457 | None => return Err(format!("'{}' is not of an indexable type!", &*arena[id_node].data.val)), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove `return` as shown: `Err(format!("'{}' is not of an indexable type!", &*arena[id_node].data.val))` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] [INFO] [stderr] warning: unused variable: `funcdecls_node` [INFO] [stderr] --> src/typechecker.rs:297:45 [INFO] [stderr] | [INFO] [stderr] 297 | fn build_context_map(vardecls_node: NodeId, funcdecls_node: NodeId, arena: &Arena>, atable: &SymbolTable) -> Result { [INFO] [stderr] | ^^^^^^^^^^^^^^ help: consider using `_funcdecls_node` instead [INFO] [stderr] | [INFO] [stderr] = note: #[warn(unused_variables)] on by default [INFO] [stderr] [INFO] [stderr] warning: unused variable: `child` [INFO] [stderr] --> src/typechecker.rs:508:17 [INFO] [stderr] | [INFO] [stderr] 508 | for child in rhs_node.children(arena) { [INFO] [stderr] | ^^^^^ help: consider using `_child` instead [INFO] [stderr] [INFO] [stderr] warning: unused variable: `term_child_iter` [INFO] [stderr] --> src/typechecker.rs:644:13 [INFO] [stderr] | [INFO] [stderr] 644 | let mut term_child_iter = curr_term_node.children(arena); [INFO] [stderr] | ^^^^^^^^^^^^^^^ help: consider using `_term_child_iter` instead [INFO] [stderr] [INFO] [stderr] warning: unused variable: `ast` [INFO] [stderr] --> src/main.rs:98:14 [INFO] [stderr] | [INFO] [stderr] 98 | let (mut ast, mut new_ast) = match parser::parse_input(&grammar, &table, &mut tokens) { [INFO] [stderr] | ^^^ help: consider using `_ast` instead [INFO] [stderr] [INFO] [stderr] warning: unused variable: `param` [INFO] [stderr] --> src/typechecker.rs:59:14 [INFO] [stderr] | [INFO] [stderr] 59 | for (param, param_type) in argmap.iter() { [INFO] [stderr] | ^^^^^ help: consider using `_param` instead [INFO] [stderr] [INFO] [stderr] warning: variable does not need to be mutable [INFO] [stderr] --> src/main.rs:98:19 [INFO] [stderr] | [INFO] [stderr] 98 | let (mut ast, mut new_ast) = match parser::parse_input(&grammar, &table, &mut tokens) { [INFO] [stderr] | ----^^^^^^^ [INFO] [stderr] | | [INFO] [stderr] | help: remove this `mut` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(unused_mut)] on by default [INFO] [stderr] [INFO] [stderr] warning: variable does not need to be mutable [INFO] [stderr] --> src/main.rs:98:10 [INFO] [stderr] | [INFO] [stderr] 98 | let (mut ast, mut new_ast) = match parser::parse_input(&grammar, &table, &mut tokens) { [INFO] [stderr] | ----^^^ [INFO] [stderr] | | [INFO] [stderr] | help: remove this `mut` [INFO] [stderr] [INFO] [stderr] warning: variable does not need to be mutable [INFO] [stderr] --> src/main.rs:109:21 [INFO] [stderr] | [INFO] [stderr] 109 | let (mut arena, mut ast_root) = typechecker::build_ast(&new_ast); [INFO] [stderr] | ----^^^^^^^^ [INFO] [stderr] | | [INFO] [stderr] | help: remove this `mut` [INFO] [stderr] [INFO] [stderr] warning: variable does not need to be mutable [INFO] [stderr] --> src/main.rs:109:10 [INFO] [stderr] | [INFO] [stderr] 109 | let (mut arena, mut ast_root) = typechecker::build_ast(&new_ast); [INFO] [stderr] | ----^^^^^ [INFO] [stderr] | | [INFO] [stderr] | help: remove this `mut` [INFO] [stderr] [INFO] [stderr] warning: unused variable: `funcdecls_node` [INFO] [stderr] --> src/typechecker.rs:297:45 [INFO] [stderr] | [INFO] [stderr] 297 | fn build_context_map(vardecls_node: NodeId, funcdecls_node: NodeId, arena: &Arena>, atable: &SymbolTable) -> Result { [INFO] [stderr] | ^^^^^^^^^^^^^^ help: consider using `_funcdecls_node` instead [INFO] [stderr] | [INFO] [stderr] = note: #[warn(unused_variables)] on by default [INFO] [stderr] [INFO] [stderr] warning: unused variable: `child` [INFO] [stderr] --> src/typechecker.rs:508:17 [INFO] [stderr] | [INFO] [stderr] 508 | for child in rhs_node.children(arena) { [INFO] [stderr] | ^^^^^ help: consider using `_child` instead [INFO] [stderr] [INFO] [stderr] warning: unused variable: `term_child_iter` [INFO] [stderr] --> src/typechecker.rs:644:13 [INFO] [stderr] | [INFO] [stderr] 644 | let mut term_child_iter = curr_term_node.children(arena); [INFO] [stderr] | ^^^^^^^^^^^^^^^ help: consider using `_term_child_iter` instead [INFO] [stderr] [INFO] [stderr] warning: unused variable: `ast` [INFO] [stderr] --> src/main.rs:98:14 [INFO] [stderr] | [INFO] [stderr] 98 | let (mut ast, mut new_ast) = match parser::parse_input(&grammar, &table, &mut tokens) { [INFO] [stderr] | ^^^ help: consider using `_ast` instead [INFO] [stderr] [INFO] [stderr] warning: unused variable: `param` [INFO] [stderr] --> src/typechecker.rs:59:14 [INFO] [stderr] | [INFO] [stderr] 59 | for (param, param_type) in argmap.iter() { [INFO] [stderr] | ^^^^^ help: consider using `_param` instead [INFO] [stderr] [INFO] [stderr] warning: variable does not need to be mutable [INFO] [stderr] --> src/main.rs:98:10 [INFO] [stderr] | [INFO] [stderr] 98 | let (mut ast, mut new_ast) = match parser::parse_input(&grammar, &table, &mut tokens) { [INFO] [stderr] | ----^^^ [INFO] [stderr] | | [INFO] [stderr] | help: remove this `mut` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(unused_mut)] on by default [INFO] [stderr] [INFO] [stderr] warning: variable does not need to be mutable [INFO] [stderr] --> src/main.rs:98:19 [INFO] [stderr] | [INFO] [stderr] 98 | let (mut ast, mut new_ast) = match parser::parse_input(&grammar, &table, &mut tokens) { [INFO] [stderr] | ----^^^^^^^ [INFO] [stderr] | | [INFO] [stderr] | help: remove this `mut` [INFO] [stderr] [INFO] [stderr] warning: variable does not need to be mutable [INFO] [stderr] --> src/main.rs:109:21 [INFO] [stderr] | [INFO] [stderr] 109 | let (mut arena, mut ast_root) = typechecker::build_ast(&new_ast); [INFO] [stderr] | ----^^^^^^^^ [INFO] [stderr] | | [INFO] [stderr] | help: remove this `mut` [INFO] [stderr] [INFO] [stderr] warning: variable does not need to be mutable [INFO] [stderr] --> src/main.rs:109:10 [INFO] [stderr] | [INFO] [stderr] 109 | let (mut arena, mut ast_root) = typechecker::build_ast(&new_ast); [INFO] [stderr] | ----^^^^^ [INFO] [stderr] | | [INFO] [stderr] | help: remove this `mut` [INFO] [stderr] [INFO] [stderr] warning: variable does not need to be mutable [INFO] [stderr] --> src/typechecker.rs:644:9 [INFO] [stderr] | [INFO] [stderr] 644 | let mut term_child_iter = curr_term_node.children(arena); [INFO] [stderr] | ----^^^^^^^^^^^^^^^ [INFO] [stderr] | | [INFO] [stderr] | help: remove this `mut` [INFO] [stderr] [INFO] [stderr] warning: method is never used: `pop` [INFO] [stderr] --> src/typechecker.rs:27:5 [INFO] [stderr] | [INFO] [stderr] 27 | fn pop(&mut self, id: &String) -> Option { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(dead_code)] on by default [INFO] [stderr] [INFO] [stderr] warning: function is never used: `debug_print_ast` [INFO] [stderr] --> src/typechecker.rs:779:1 [INFO] [stderr] | [INFO] [stderr] 779 | pub fn debug_print_ast(arena: &Arena>, node: NodeId) { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: function is never used: `debug_print_inner` [INFO] [stderr] --> src/typechecker.rs:784:1 [INFO] [stderr] | [INFO] [stderr] 784 | pub fn debug_print_inner(arena: &Arena>, node: NodeId) { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/scanner.rs:48:29 [INFO] [stderr] | [INFO] [stderr] 48 | pub fn parse_tokens(buffer: &String) -> Result, VecDeque> { [INFO] [stderr] | ^^^^^^^ help: change this to: `&str` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::ptr_arg)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: this lifetime isn't used in the function definition [INFO] [stderr] --> src/parser.rs:45:20 [INFO] [stderr] | [INFO] [stderr] 45 | pub fn parse_input<'a>(grammar: &Grammar, table: &ParseTable, tokens: &mut VecDeque) -> Result<(Vec, Vec>), String> { [INFO] [stderr] | ^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::extra_unused_lifetimes)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#extra_unused_lifetimes [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/parser.rs:101:26 [INFO] [stderr] | [INFO] [stderr] 101 | None => *terminal_map.get(cur_token.token_name).unwrap(), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&terminal_map[cur_token.token_name]` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::get_unwrap)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a Vec. Using `[]` is more clear and more concise [INFO] [stderr] --> src/parser.rs:116:18 [INFO] [stderr] | [INFO] [stderr] 116 | &grammar.nonterminals.get(non_terminal).unwrap(), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `grammar.nonterminals[non_terminal]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a Vec. Using `[]` is more clear and more concise [INFO] [stderr] --> src/parser.rs:119:17 [INFO] [stderr] | [INFO] [stderr] 119 | table.terminals.get(terminal_ndx).unwrap(), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `table.terminals[terminal_ndx]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a Vec. Using `[]` is more clear and more concise [INFO] [stderr] --> src/parser.rs:129:33 [INFO] [stderr] | [INFO] [stderr] 129 | let prod_name = grammar.nonterminals.get(non_terminal).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `grammar.nonterminals[non_terminal]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: single-character string constant used as pattern [INFO] [stderr] --> src/parser.rs:130:40 [INFO] [stderr] | [INFO] [stderr] 130 | if prod_name.ends_with("^") { [INFO] [stderr] | ^^^ help: try using a char instead: `'^'` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::single_char_pattern)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_char_pattern [INFO] [stderr] [INFO] [stderr] warning: single-character string constant used as pattern [INFO] [stderr] --> src/parser.rs:159:41 [INFO] [stderr] | [INFO] [stderr] 159 | if !prod_name.ends_with("'") { [INFO] [stderr] | ^^^ help: try using a char instead: `'''` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_char_pattern [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/parser.rs:205:33 [INFO] [stderr] | [INFO] [stderr] 205 | fn debug_production(production: &Vec, nonterminals: &Vec) -> String { [INFO] [stderr] | ^^^^^^^^^^^^ help: change this to: `&[String]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:205:61 [INFO] [stderr] | [INFO] [stderr] 205 | fn debug_production(production: &Vec, nonterminals: &Vec) -> String { [INFO] [stderr] | ^^^^^^^^^^^^ help: change this to: `&[String]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a slice. Using `[]` is more clear and more concise [INFO] [stderr] --> src/parser.rs:213:35 [INFO] [stderr] | [INFO] [stderr] 213 | write!(output, "{} ", nonterminals.get(non_terminal).unwrap()).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `nonterminals[non_terminal]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:221:62 [INFO] [stderr] | [INFO] [stderr] 221 | fn print_debug_stack(stack: &VecDeque, nonterminals: &Vec) { [INFO] [stderr] | ^^^^^^^^^^^^ help: change this to: `&[String]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a slice. Using `[]` is more clear and more concise [INFO] [stderr] --> src/parser.rs:233:35 [INFO] [stderr] | [INFO] [stderr] 233 | write!(output, "{}-", nonterminals.get(non_terminal).unwrap()).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `nonterminals[non_terminal]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:244:24 [INFO] [stderr] | [INFO] [stderr] 244 | pub fn format_ast(ast: &Vec) -> String { [INFO] [stderr] | ^^^^^^^^^^^^ help: change this to: `&[String]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: single-character string constant used as pattern [INFO] [stderr] --> src/parser.rs:255:31 [INFO] [stderr] | [INFO] [stderr] 255 | if symbol.starts_with("@") { [INFO] [stderr] | ^^^ help: try using a char instead: `'@'` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_char_pattern [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/typechecker.rs:17:28 [INFO] [stderr] | [INFO] [stderr] 17 | fn push(&mut self, id: &String, sym_type: DynamicType) -> Result<(), String> { [INFO] [stderr] | ^^^^^^^ help: change this to: `&str` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/typechecker.rs:27:27 [INFO] [stderr] | [INFO] [stderr] 27 | fn pop(&mut self, id: &String) -> Option { [INFO] [stderr] | ^^^^^^^ help: change this to: `&str` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/typechecker.rs:31:24 [INFO] [stderr] | [INFO] [stderr] 31 | fn find(&self, id: &String) -> Option<&DynamicType> { [INFO] [stderr] | ^^^^^^^ help: change this to: `&str` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/typechecker.rs:40:43 [INFO] [stderr] | [INFO] [stderr] 40 | write!(f, "{} - {:?}\n", key, self.map.get(key).unwrap())?; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&self.map[key]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/typechecker.rs:52:30 [INFO] [stderr] | [INFO] [stderr] 52 | fn match_args(&self, id: &String, args_list: &Vec) -> bool { [INFO] [stderr] | ^^^^^^^ help: change this to: `&str` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/typechecker.rs:52:50 [INFO] [stderr] | [INFO] [stderr] 52 | fn match_args(&self, id: &String, args_list: &Vec) -> bool { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^ help: change this to: `&[DynamicType]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/typechecker.rs:79:26 [INFO] [stderr] | [INFO] [stderr] 79 | let argmap = self.map.get(key).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&self.map[key]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: this argument is passed by reference, but would be more efficient if passed by value [INFO] [stderr] --> src/typechecker.rs:121:26 [INFO] [stderr] | [INFO] [stderr] 121 | fn is_recursive_type(&self) -> bool { [INFO] [stderr] | ^^^^^ help: consider passing by value instead: `self` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::trivially_copy_pass_by_ref)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#trivially_copy_pass_by_ref [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/typechecker.rs:164:23 [INFO] [stderr] | [INFO] [stderr] 164 | sub_type: match cur_type.is_recursive_type() { [INFO] [stderr] | _______________________^ [INFO] [stderr] 165 | | true => match DynamicType::from_tree_node(node.children(arena).last().unwrap(), arena, symbol_table) { [INFO] [stderr] 166 | | Ok(t) => Some(Rc::new(Box::new(t))), [INFO] [stderr] 167 | | Err(e) => return Err(e), [INFO] [stderr] 168 | | }, [INFO] [stderr] 169 | | false => None, [INFO] [stderr] 170 | | } [INFO] [stderr] | |_____________^ [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] help: consider using an if/else expression [INFO] [stderr] | [INFO] [stderr] 164 | sub_type: if cur_type.is_recursive_type() { match DynamicType::from_tree_node(node.children(arena).last().unwrap(), arena, symbol_table) { [INFO] [stderr] 165 | Ok(t) => Some(Rc::new(Box::new(t))), [INFO] [stderr] 166 | Err(e) => return Err(e), [INFO] [stderr] 167 | } } else { None } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/typechecker.rs:328:28 [INFO] [stderr] | [INFO] [stderr] 328 | return Err(format!("type mismatch error!")); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"type mismatch error!".to_string()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::useless_format)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/typechecker.rs:371:149 [INFO] [stderr] | [INFO] [stderr] 371 | fn check_funcdecl(funcdecl_node: NodeId, arena: &Arena>, ctable: &SymbolTable, ftable: &FunctionTable, ret_type: &DynamicType, func_name: &String) -> Result<(), String> { [INFO] [stderr] | ^^^^^^^ help: change this to: `&str` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/typechecker.rs:379:145 [INFO] [stderr] | [INFO] [stderr] 379 | fn check_return_paths(stmts_node: NodeId, arena: &Arena>, ctable: &SymbolTable, ftable: &FunctionTable, ret_type: &DynamicType, name: &String) -> Result, String> { [INFO] [stderr] | ^^^^^^^ help: change this to: `&str` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: variable does not need to be mutable [INFO] [stderr] --> src/typechecker.rs:644:9 [INFO] [stderr] | [INFO] [stderr] 644 | let mut term_child_iter = curr_term_node.children(arena); [INFO] [stderr] | ----^^^^^^^^^^^^^^^ [INFO] [stderr] | | [INFO] [stderr] | help: remove this `mut` [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/typechecker.rs:388:13 [INFO] [stderr] | [INFO] [stderr] 388 | / match stmt_node.children(arena).nth(5) { [INFO] [stderr] 389 | | Some(_) => { [INFO] [stderr] 390 | | if let Some(ret_type) = check_return_paths(stmt_node.children(arena).nth(3).unwrap(), arena, ctable, ftable, ret_type, name)? { [INFO] [stderr] 391 | | cur_return = Some(ret_type); [INFO] [stderr] ... | [INFO] [stderr] 394 | | None => {}, [INFO] [stderr] 395 | | } [INFO] [stderr] | |_________________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::single_match)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 388 | if let Some(_) = stmt_node.children(arena).nth(5) { [INFO] [stderr] 389 | if let Some(ret_type) = check_return_paths(stmt_node.children(arena).nth(3).unwrap(), arena, ctable, ftable, ret_type, name)? { [INFO] [stderr] 390 | cur_return = Some(ret_type); [INFO] [stderr] 391 | } [INFO] [stderr] 392 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/typechecker.rs:399:26 [INFO] [stderr] | [INFO] [stderr] 399 | cur_return = match can_assign_types(ret_type, &rhs_ret_type) { [INFO] [stderr] | __________________________^ [INFO] [stderr] 400 | | true => Some(rhs_ret_type), [INFO] [stderr] 401 | | false => return Err(format!("the type of a return path of '{}' does not match its definition!", name)), [INFO] [stderr] 402 | | }; [INFO] [stderr] | |_____________^ help: consider using an if/else expression: `if can_assign_types(ret_type, &rhs_ret_type) { Some(rhs_ret_type) } else { return Err(format!("the type of a return path of '{}' does not match its definition!", 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: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/typechecker.rs:406:5 [INFO] [stderr] | [INFO] [stderr] 406 | / match stmts_node.children(arena).nth(1) { [INFO] [stderr] 407 | | Some(n) => { cur_return = check_return_paths(n, arena, ctable, ftable, ret_type, name)?; }, [INFO] [stderr] 408 | | None => {}, [INFO] [stderr] 409 | | } [INFO] [stderr] | |_____^ help: try this: `if let Some(n) = stmts_node.children(arena).nth(1) { cur_return = check_return_paths(n, arena, ctable, ftable, ret_type, name)?; }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/typechecker.rs:411:27 [INFO] [stderr] | [INFO] [stderr] 411 | cur_return.map_or(Err(format!("does not return a value on all code paths!")), |ret| Ok(Some(ret))) [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"does not return a value on all code paths!".to_string()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/typechecker.rs:453:32 [INFO] [stderr] | [INFO] [stderr] 453 | return Err(format!("index expressions must be of type int!")); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"index expressions must be of type int!".to_string()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/typechecker.rs:473:28 [INFO] [stderr] | [INFO] [stderr] 473 | return Err(format!("an if condition must be of type boolean!")); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"an if condition must be of type boolean!".to_string()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [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/typechecker.rs:476:13 [INFO] [stderr] | [INFO] [stderr] 476 | / match stmt_node.children(arena).nth(5) { [INFO] [stderr] 477 | | Some(else_stmts_node) => { check_stmts(else_stmts_node, arena, ctable, ftable)?; }, [INFO] [stderr] 478 | | None => {}, [INFO] [stderr] 479 | | } [INFO] [stderr] | |_____________^ help: try this: `if let Some(else_stmts_node) = stmt_node.children(arena).nth(5) { check_stmts(else_stmts_node, arena, ctable, ftable)?; }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/typechecker.rs:484:28 [INFO] [stderr] | [INFO] [stderr] 484 | return Err(format!("a while condition must be of type boolean!")); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"a while condition must be of type boolean!".to_string()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/typechecker.rs:491:28 [INFO] [stderr] | [INFO] [stderr] 491 | return Err(format!("a while condition must be of type boolean!")); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"a while condition must be of type boolean!".to_string()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/typechecker.rs:494:28 [INFO] [stderr] | [INFO] [stderr] 494 | return Err(format!("a while condition must be of type boolean!")); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"a while condition must be of type boolean!".to_string()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/typechecker.rs:497:28 [INFO] [stderr] | [INFO] [stderr] 497 | return Err(format!("a while condition must be of type boolean!")); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"a while condition must be of type boolean!".to_string()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/typechecker.rs:512:28 [INFO] [stderr] | [INFO] [stderr] 512 | return Err(format!("type mismatch in assignment statement!")); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"type mismatch in assignment statement!".to_string()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] [INFO] [stderr] warning: method is never used: `pop` [INFO] [stderr] --> src/typechecker.rs:27:5 [INFO] [stderr] | [INFO] [stderr] 27 | fn pop(&mut self, id: &String) -> Option { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(dead_code)] on by default [INFO] [stderr] [INFO] [stderr] warning: function is never used: `debug_print_ast` [INFO] [stderr] --> src/typechecker.rs:779:1 [INFO] [stderr] | [INFO] [stderr] 779 | pub fn debug_print_ast(arena: &Arena>, node: NodeId) { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: function is never used: `debug_print_inner` [INFO] [stderr] --> src/typechecker.rs:784:1 [INFO] [stderr] | [INFO] [stderr] 784 | pub fn debug_print_inner(arena: &Arena>, node: NodeId) { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/typechecker.rs:527:13 [INFO] [stderr] | [INFO] [stderr] 527 | / match clause_type == expr_type { [INFO] [stderr] 528 | | true => Ok(expr_type), [INFO] [stderr] 529 | | false => Err(format!("expression is not well-typed!")), [INFO] [stderr] 530 | | } [INFO] [stderr] | |_____________^ help: consider using an if/else expression: `if clause_type == expr_type { Ok(expr_type) } else { Err(format!("expression is not well-typed!")) }` [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: useless use of `format!` [INFO] [stderr] --> src/typechecker.rs:529:32 [INFO] [stderr] | [INFO] [stderr] 529 | false => Err(format!("expression is not well-typed!")), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"expression is not well-typed!".to_string()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/typechecker.rs:564:13 [INFO] [stderr] | [INFO] [stderr] 564 | / match pred_type == clause_type { [INFO] [stderr] 565 | | true => Ok(clause_type), [INFO] [stderr] 566 | | false => Err(format!("expression is not well-typed!")), [INFO] [stderr] 567 | | } [INFO] [stderr] | |_____________^ help: consider using an if/else expression: `if pred_type == clause_type { Ok(clause_type) } else { Err(format!("expression is not well-typed!")) }` [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: useless use of `format!` [INFO] [stderr] --> src/typechecker.rs:566:32 [INFO] [stderr] | [INFO] [stderr] 566 | false => Err(format!("expression is not well-typed!")), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"expression is not well-typed!".to_string()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/scanner.rs:48:29 [INFO] [stderr] | [INFO] [stderr] 48 | pub fn parse_tokens(buffer: &String) -> Result, VecDeque> { [INFO] [stderr] | ^^^^^^^ help: change this to: `&str` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::ptr_arg)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/typechecker.rs:755:23 [INFO] [stderr] | [INFO] [stderr] 755 | pub fn build_ast(ast: &Vec>) -> (Arena>, NodeId) { [INFO] [stderr] | ^^^^^^^^^^^^^^^ help: change this to: `&[Rc]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: this .into_iter() call is equivalent to .iter() and will not move the Vec [INFO] [stderr] --> src/typechecker.rs:757:28 [INFO] [stderr] | [INFO] [stderr] 757 | let mut ast_iter = ast.into_iter(); [INFO] [stderr] | ^^^^^^^^^ help: call directly: `iter` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::into_iter_on_ref)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#into_iter_on_ref [INFO] [stderr] [INFO] [stderr] warning: this lifetime isn't used in the function definition [INFO] [stderr] --> src/parser.rs:45:20 [INFO] [stderr] | [INFO] [stderr] 45 | pub fn parse_input<'a>(grammar: &Grammar, table: &ParseTable, tokens: &mut VecDeque) -> Result<(Vec, Vec>), String> { [INFO] [stderr] | ^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::extra_unused_lifetimes)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#extra_unused_lifetimes [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/parser.rs:101:26 [INFO] [stderr] | [INFO] [stderr] 101 | None => *terminal_map.get(cur_token.token_name).unwrap(), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&terminal_map[cur_token.token_name]` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::get_unwrap)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a Vec. Using `[]` is more clear and more concise [INFO] [stderr] --> src/parser.rs:116:18 [INFO] [stderr] | [INFO] [stderr] 116 | &grammar.nonterminals.get(non_terminal).unwrap(), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `grammar.nonterminals[non_terminal]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a Vec. Using `[]` is more clear and more concise [INFO] [stderr] --> src/parser.rs:119:17 [INFO] [stderr] | [INFO] [stderr] 119 | table.terminals.get(terminal_ndx).unwrap(), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `table.terminals[terminal_ndx]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a Vec. Using `[]` is more clear and more concise [INFO] [stderr] --> src/parser.rs:129:33 [INFO] [stderr] | [INFO] [stderr] 129 | let prod_name = grammar.nonterminals.get(non_terminal).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `grammar.nonterminals[non_terminal]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: single-character string constant used as pattern [INFO] [stderr] --> src/parser.rs:130:40 [INFO] [stderr] | [INFO] [stderr] 130 | if prod_name.ends_with("^") { [INFO] [stderr] | ^^^ help: try using a char instead: `'^'` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::single_char_pattern)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_char_pattern [INFO] [stderr] [INFO] [stderr] warning: single-character string constant used as pattern [INFO] [stderr] --> src/parser.rs:159:41 [INFO] [stderr] | [INFO] [stderr] 159 | if !prod_name.ends_with("'") { [INFO] [stderr] | ^^^ help: try using a char instead: `'''` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_char_pattern [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/parser.rs:205:33 [INFO] [stderr] | [INFO] [stderr] 205 | fn debug_production(production: &Vec, nonterminals: &Vec) -> String { [INFO] [stderr] | ^^^^^^^^^^^^ help: change this to: `&[String]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:205:61 [INFO] [stderr] | [INFO] [stderr] 205 | fn debug_production(production: &Vec, nonterminals: &Vec) -> String { [INFO] [stderr] | ^^^^^^^^^^^^ help: change this to: `&[String]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a slice. Using `[]` is more clear and more concise [INFO] [stderr] --> src/parser.rs:213:35 [INFO] [stderr] | [INFO] [stderr] 213 | write!(output, "{} ", nonterminals.get(non_terminal).unwrap()).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `nonterminals[non_terminal]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:221:62 [INFO] [stderr] | [INFO] [stderr] 221 | fn print_debug_stack(stack: &VecDeque, nonterminals: &Vec) { [INFO] [stderr] | ^^^^^^^^^^^^ help: change this to: `&[String]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a slice. Using `[]` is more clear and more concise [INFO] [stderr] --> src/parser.rs:233:35 [INFO] [stderr] | [INFO] [stderr] 233 | write!(output, "{}-", nonterminals.get(non_terminal).unwrap()).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `nonterminals[non_terminal]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/parser.rs:244:24 [INFO] [stderr] | [INFO] [stderr] 244 | pub fn format_ast(ast: &Vec) -> String { [INFO] [stderr] | ^^^^^^^^^^^^ help: change this to: `&[String]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: single-character string constant used as pattern [INFO] [stderr] --> src/parser.rs:255:31 [INFO] [stderr] | [INFO] [stderr] 255 | if symbol.starts_with("@") { [INFO] [stderr] | ^^^ help: try using a char instead: `'@'` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_char_pattern [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/typechecker.rs:17:28 [INFO] [stderr] | [INFO] [stderr] 17 | fn push(&mut self, id: &String, sym_type: DynamicType) -> Result<(), String> { [INFO] [stderr] | ^^^^^^^ help: change this to: `&str` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/typechecker.rs:27:27 [INFO] [stderr] | [INFO] [stderr] 27 | fn pop(&mut self, id: &String) -> Option { [INFO] [stderr] | ^^^^^^^ help: change this to: `&str` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/typechecker.rs:31:24 [INFO] [stderr] | [INFO] [stderr] 31 | fn find(&self, id: &String) -> Option<&DynamicType> { [INFO] [stderr] | ^^^^^^^ help: change this to: `&str` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/typechecker.rs:40:43 [INFO] [stderr] | [INFO] [stderr] 40 | write!(f, "{} - {:?}\n", key, self.map.get(key).unwrap())?; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&self.map[key]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/typechecker.rs:52:30 [INFO] [stderr] | [INFO] [stderr] 52 | fn match_args(&self, id: &String, args_list: &Vec) -> bool { [INFO] [stderr] | ^^^^^^^ help: change this to: `&str` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/typechecker.rs:52:50 [INFO] [stderr] | [INFO] [stderr] 52 | fn match_args(&self, id: &String, args_list: &Vec) -> bool { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^ help: change this to: `&[DynamicType]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/typechecker.rs:79:26 [INFO] [stderr] | [INFO] [stderr] 79 | let argmap = self.map.get(key).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&self.map[key]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: this argument is passed by reference, but would be more efficient if passed by value [INFO] [stderr] --> src/typechecker.rs:121:26 [INFO] [stderr] | [INFO] [stderr] 121 | fn is_recursive_type(&self) -> bool { [INFO] [stderr] | ^^^^^ help: consider passing by value instead: `self` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::trivially_copy_pass_by_ref)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#trivially_copy_pass_by_ref [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/typechecker.rs:164:23 [INFO] [stderr] | [INFO] [stderr] 164 | sub_type: match cur_type.is_recursive_type() { [INFO] [stderr] | _______________________^ [INFO] [stderr] 165 | | true => match DynamicType::from_tree_node(node.children(arena).last().unwrap(), arena, symbol_table) { [INFO] [stderr] 166 | | Ok(t) => Some(Rc::new(Box::new(t))), [INFO] [stderr] 167 | | Err(e) => return Err(e), [INFO] [stderr] 168 | | }, [INFO] [stderr] 169 | | false => None, [INFO] [stderr] 170 | | } [INFO] [stderr] | |_____________^ [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] help: consider using an if/else expression [INFO] [stderr] | [INFO] [stderr] 164 | sub_type: if cur_type.is_recursive_type() { match DynamicType::from_tree_node(node.children(arena).last().unwrap(), arena, symbol_table) { [INFO] [stderr] 165 | Ok(t) => Some(Rc::new(Box::new(t))), [INFO] [stderr] 166 | Err(e) => return Err(e), [INFO] [stderr] 167 | } } else { None } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/typechecker.rs:328:28 [INFO] [stderr] | [INFO] [stderr] 328 | return Err(format!("type mismatch error!")); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"type mismatch error!".to_string()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::useless_format)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/typechecker.rs:371:149 [INFO] [stderr] | [INFO] [stderr] 371 | fn check_funcdecl(funcdecl_node: NodeId, arena: &Arena>, ctable: &SymbolTable, ftable: &FunctionTable, ret_type: &DynamicType, func_name: &String) -> Result<(), String> { [INFO] [stderr] | ^^^^^^^ help: change this to: `&str` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/typechecker.rs:379:145 [INFO] [stderr] | [INFO] [stderr] 379 | fn check_return_paths(stmts_node: NodeId, arena: &Arena>, ctable: &SymbolTable, ftable: &FunctionTable, ret_type: &DynamicType, name: &String) -> Result, String> { [INFO] [stderr] | ^^^^^^^ help: change this to: `&str` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/typechecker.rs:388:13 [INFO] [stderr] | [INFO] [stderr] 388 | / match stmt_node.children(arena).nth(5) { [INFO] [stderr] 389 | | Some(_) => { [INFO] [stderr] 390 | | if let Some(ret_type) = check_return_paths(stmt_node.children(arena).nth(3).unwrap(), arena, ctable, ftable, ret_type, name)? { [INFO] [stderr] 391 | | cur_return = Some(ret_type); [INFO] [stderr] ... | [INFO] [stderr] 394 | | None => {}, [INFO] [stderr] 395 | | } [INFO] [stderr] | |_________________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::single_match)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 388 | if let Some(_) = stmt_node.children(arena).nth(5) { [INFO] [stderr] 389 | if let Some(ret_type) = check_return_paths(stmt_node.children(arena).nth(3).unwrap(), arena, ctable, ftable, ret_type, name)? { [INFO] [stderr] 390 | cur_return = Some(ret_type); [INFO] [stderr] 391 | } [INFO] [stderr] 392 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/typechecker.rs:399:26 [INFO] [stderr] | [INFO] [stderr] 399 | cur_return = match can_assign_types(ret_type, &rhs_ret_type) { [INFO] [stderr] | __________________________^ [INFO] [stderr] 400 | | true => Some(rhs_ret_type), [INFO] [stderr] 401 | | false => return Err(format!("the type of a return path of '{}' does not match its definition!", name)), [INFO] [stderr] 402 | | }; [INFO] [stderr] | |_____________^ help: consider using an if/else expression: `if can_assign_types(ret_type, &rhs_ret_type) { Some(rhs_ret_type) } else { return Err(format!("the type of a return path of '{}' does not match its definition!", 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: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/typechecker.rs:406:5 [INFO] [stderr] | [INFO] [stderr] 406 | / match stmts_node.children(arena).nth(1) { [INFO] [stderr] 407 | | Some(n) => { cur_return = check_return_paths(n, arena, ctable, ftable, ret_type, name)?; }, [INFO] [stderr] 408 | | None => {}, [INFO] [stderr] 409 | | } [INFO] [stderr] | |_____^ help: try this: `if let Some(n) = stmts_node.children(arena).nth(1) { cur_return = check_return_paths(n, arena, ctable, ftable, ret_type, name)?; }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/typechecker.rs:411:27 [INFO] [stderr] | [INFO] [stderr] 411 | cur_return.map_or(Err(format!("does not return a value on all code paths!")), |ret| Ok(Some(ret))) [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"does not return a value on all code paths!".to_string()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/typechecker.rs:453:32 [INFO] [stderr] | [INFO] [stderr] 453 | return Err(format!("index expressions must be of type int!")); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"index expressions must be of type int!".to_string()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/typechecker.rs:473:28 [INFO] [stderr] | [INFO] [stderr] 473 | return Err(format!("an if condition must be of type boolean!")); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"an if condition must be of type boolean!".to_string()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [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/typechecker.rs:476:13 [INFO] [stderr] | [INFO] [stderr] 476 | / match stmt_node.children(arena).nth(5) { [INFO] [stderr] 477 | | Some(else_stmts_node) => { check_stmts(else_stmts_node, arena, ctable, ftable)?; }, [INFO] [stderr] 478 | | None => {}, [INFO] [stderr] 479 | | } [INFO] [stderr] | |_____________^ help: try this: `if let Some(else_stmts_node) = stmt_node.children(arena).nth(5) { check_stmts(else_stmts_node, arena, ctable, ftable)?; }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/typechecker.rs:484:28 [INFO] [stderr] | [INFO] [stderr] 484 | return Err(format!("a while condition must be of type boolean!")); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"a while condition must be of type boolean!".to_string()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/typechecker.rs:491:28 [INFO] [stderr] | [INFO] [stderr] 491 | return Err(format!("a while condition must be of type boolean!")); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"a while condition must be of type boolean!".to_string()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/typechecker.rs:494:28 [INFO] [stderr] | [INFO] [stderr] 494 | return Err(format!("a while condition must be of type boolean!")); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"a while condition must be of type boolean!".to_string()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/typechecker.rs:497:28 [INFO] [stderr] | [INFO] [stderr] 497 | return Err(format!("a while condition must be of type boolean!")); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"a while condition must be of type boolean!".to_string()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] [INFO] [stderr] warning: useless use of `format!` [INFO] [stderr] --> src/typechecker.rs:512:28 [INFO] [stderr] | [INFO] [stderr] 512 | return Err(format!("type mismatch in assignment statement!")); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"type mismatch in assignment statement!".to_string()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/typechecker.rs:527:13 [INFO] [stderr] | [INFO] [stderr] 527 | / match clause_type == expr_type { [INFO] [stderr] 528 | | true => Ok(expr_type), [INFO] [stderr] 529 | | false => Err(format!("expression is not well-typed!")), [INFO] [stderr] 530 | | } [INFO] [stderr] | |_____________^ help: consider using an if/else expression: `if clause_type == expr_type { Ok(expr_type) } else { Err(format!("expression is not well-typed!")) }` [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: useless use of `format!` [INFO] [stderr] --> src/typechecker.rs:529:32 [INFO] [stderr] | [INFO] [stderr] 529 | false => Err(format!("expression is not well-typed!")), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"expression is not well-typed!".to_string()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/typechecker.rs:564:13 [INFO] [stderr] | [INFO] [stderr] 564 | / match pred_type == clause_type { [INFO] [stderr] 565 | | true => Ok(clause_type), [INFO] [stderr] 566 | | false => Err(format!("expression is not well-typed!")), [INFO] [stderr] 567 | | } [INFO] [stderr] | |_____________^ help: consider using an if/else expression: `if pred_type == clause_type { Ok(clause_type) } else { Err(format!("expression is not well-typed!")) }` [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: useless use of `format!` [INFO] [stderr] --> src/typechecker.rs:566:32 [INFO] [stderr] | [INFO] [stderr] 566 | false => Err(format!("expression is not well-typed!")), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using .to_string(): `"expression is not well-typed!".to_string()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_format [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/typechecker.rs:755:23 [INFO] [stderr] | [INFO] [stderr] 755 | pub fn build_ast(ast: &Vec>) -> (Arena>, NodeId) { [INFO] [stderr] | ^^^^^^^^^^^^^^^ help: change this to: `&[Rc]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: this .into_iter() call is equivalent to .iter() and will not move the Vec [INFO] [stderr] --> src/typechecker.rs:757:28 [INFO] [stderr] | [INFO] [stderr] 757 | let mut ast_iter = ast.into_iter(); [INFO] [stderr] | ^^^^^^^^^ help: call directly: `iter` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::into_iter_on_ref)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#into_iter_on_ref [INFO] [stderr] [INFO] [stderr] Finished dev [unoptimized + debuginfo] target(s) in 23.07s [INFO] running `"docker" "inspect" "5efd28c3b6529ec196a1eb4e3f2cc9bb9dbe592680ac2de3f4d994ce13536aee"` [INFO] running `"docker" "rm" "-f" "5efd28c3b6529ec196a1eb4e3f2cc9bb9dbe592680ac2de3f4d994ce13536aee"` [INFO] [stdout] 5efd28c3b6529ec196a1eb4e3f2cc9bb9dbe592680ac2de3f4d994ce13536aee