[INFO] updating cached repository jlmbaka/hack-assembler [INFO] running `"git" "fetch" "--all"` [INFO] [stdout] Fetching origin [INFO] [stderr] From git://github.com/jlmbaka/hack-assembler [INFO] [stderr] * branch HEAD -> FETCH_HEAD [INFO] running `"git" "clone" "work/cache/sources/gh/jlmbaka/hack-assembler" "work/ex/clippy-test-run/sources/stable/gh/jlmbaka/hack-assembler"` [INFO] [stderr] Cloning into 'work/ex/clippy-test-run/sources/stable/gh/jlmbaka/hack-assembler'... [INFO] [stderr] done. [INFO] running `"git" "clone" "work/cache/sources/gh/jlmbaka/hack-assembler" "work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/jlmbaka/hack-assembler"` [INFO] [stderr] Cloning into 'work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/jlmbaka/hack-assembler'... [INFO] [stderr] done. [INFO] running `"git" "rev-parse" "HEAD"` [INFO] [stdout] 31943f8106e10374e87f1765b3064b341c49ee2c [INFO] sha for GitHub repo jlmbaka/hack-assembler: 31943f8106e10374e87f1765b3064b341c49ee2c [INFO] validating manifest of jlmbaka/hack-assembler 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 jlmbaka/hack-assembler 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 jlmbaka/hack-assembler [INFO] finished frobbing jlmbaka/hack-assembler [INFO] frobbed toml for jlmbaka/hack-assembler written to work/ex/clippy-test-run/sources/stable/gh/jlmbaka/hack-assembler/Cargo.toml [INFO] started frobbing jlmbaka/hack-assembler [INFO] finished frobbing jlmbaka/hack-assembler [INFO] frobbed toml for jlmbaka/hack-assembler written to work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/jlmbaka/hack-assembler/Cargo.toml [INFO] crate jlmbaka/hack-assembler 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 jlmbaka/hack-assembler against stable+rustflags=-Dclippy::into_iter_on_array for clippy-test-run [INFO] running `"docker" "create" "-v" "/mnt/big/crater/work/local/target-dirs/clippy-test-run/worker-5/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array:/opt/crater/target:rw,Z" "-v" "/mnt/big/crater/work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/jlmbaka/hack-assembler:/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 -Dclippy::into_iter_on_array" "-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] 94fe31b43e29853eabd1217fab40c78d8e74235c4739f1d386e497abff5647e3 [INFO] running `"docker" "start" "-a" "94fe31b43e29853eabd1217fab40c78d8e74235c4739f1d386e497abff5647e3"` [INFO] [stderr] Checking hack v0.1.0 (/opt/crater/workdir) [INFO] [stderr] warning: All variants have the same postfix: `Command` [INFO] [stderr] --> src/assembler.rs:11:1 [INFO] [stderr] | [INFO] [stderr] 11 | / enum CommandType { [INFO] [stderr] 12 | | ACommand, [INFO] [stderr] 13 | | CCommand, [INFO] [stderr] 14 | | LCommand, [INFO] [stderr] 15 | | } [INFO] [stderr] | |_^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::enum_variant_names)] on by default [INFO] [stderr] = help: remove the postfixes and use full paths to the variants instead of glob imports [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#enum_variant_names [INFO] [stderr] [INFO] [stderr] warning: returning the result of a let binding from a block. Consider returning the expression directly. [INFO] [stderr] --> src/assembler.rs:75:3 [INFO] [stderr] | [INFO] [stderr] 75 | file [INFO] [stderr] | ^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::let_and_return)] on by default [INFO] [stderr] note: this expression can be directly returned [INFO] [stderr] --> src/assembler.rs:67:14 [INFO] [stderr] | [INFO] [stderr] 67 | let file = match OpenOptions::new() [INFO] [stderr] | ____________________^ [INFO] [stderr] 68 | | .read(true) [INFO] [stderr] 69 | | .write(true) [INFO] [stderr] 70 | | .create(true) [INFO] [stderr] ... | [INFO] [stderr] 73 | | Ok(file) => file, [INFO] [stderr] 74 | | }; [INFO] [stderr] | |_________^ [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#let_and_return [INFO] [stderr] [INFO] [stderr] warning: returning the result of a let binding from a block. Consider returning the expression directly. [INFO] [stderr] --> src/assembler.rs:90:3 [INFO] [stderr] | [INFO] [stderr] 90 | output_filename [INFO] [stderr] | ^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] note: this expression can be directly returned [INFO] [stderr] --> src/assembler.rs:89:25 [INFO] [stderr] | [INFO] [stderr] 89 | let output_filename = v[1].to_string() + output_ext; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#let_and_return [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/assembler.rs:278:5 [INFO] [stderr] | [INFO] [stderr] 278 | return v[0].to_string() [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^ help: remove `return` as shown: `v[0].to_string()` [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/assembler.rs:324:5 [INFO] [stderr] | [INFO] [stderr] 324 | return v[1].to_string() [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^ help: remove `return` as shown: `v[1].to_string()` [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: All variants have the same postfix: `Command` [INFO] [stderr] --> src/assembler.rs:11:1 [INFO] [stderr] | [INFO] [stderr] 11 | / enum CommandType { [INFO] [stderr] 12 | | ACommand, [INFO] [stderr] 13 | | CCommand, [INFO] [stderr] 14 | | LCommand, [INFO] [stderr] 15 | | } [INFO] [stderr] | |_^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::enum_variant_names)] on by default [INFO] [stderr] = help: remove the postfixes and use full paths to the variants instead of glob imports [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#enum_variant_names [INFO] [stderr] [INFO] [stderr] warning: returning the result of a let binding from a block. Consider returning the expression directly. [INFO] [stderr] --> src/assembler.rs:75:3 [INFO] [stderr] | [INFO] [stderr] 75 | file [INFO] [stderr] | ^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::let_and_return)] on by default [INFO] [stderr] note: this expression can be directly returned [INFO] [stderr] --> src/assembler.rs:67:14 [INFO] [stderr] | [INFO] [stderr] 67 | let file = match OpenOptions::new() [INFO] [stderr] | ____________________^ [INFO] [stderr] 68 | | .read(true) [INFO] [stderr] 69 | | .write(true) [INFO] [stderr] 70 | | .create(true) [INFO] [stderr] ... | [INFO] [stderr] 73 | | Ok(file) => file, [INFO] [stderr] 74 | | }; [INFO] [stderr] | |_________^ [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#let_and_return [INFO] [stderr] [INFO] [stderr] warning: returning the result of a let binding from a block. Consider returning the expression directly. [INFO] [stderr] --> src/assembler.rs:90:3 [INFO] [stderr] | [INFO] [stderr] 90 | output_filename [INFO] [stderr] | ^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] note: this expression can be directly returned [INFO] [stderr] --> src/assembler.rs:89:25 [INFO] [stderr] | [INFO] [stderr] 89 | let output_filename = v[1].to_string() + output_ext; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#let_and_return [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/assembler.rs:278:5 [INFO] [stderr] | [INFO] [stderr] 278 | return v[0].to_string() [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^ help: remove `return` as shown: `v[0].to_string()` [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/assembler.rs:324:5 [INFO] [stderr] | [INFO] [stderr] 324 | return v[1].to_string() [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^ help: remove `return` as shown: `v[1].to_string()` [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: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/assembler.rs:80:3 [INFO] [stderr] | [INFO] [stderr] 80 | match file.write_fmt(format_args!("{:016b}\n", code)) { [INFO] [stderr] | _________^ [INFO] [stderr] 81 | | Err(why) => panic!("couldn't write to file: {}", Error::description(&why)), [INFO] [stderr] 82 | | Ok(_) => (), [INFO] [stderr] 83 | | } [INFO] [stderr] | |_________^ help: try this: `if let Err(why) = file.write_fmt(format_args!("{:016b}\n", code)) { panic!("couldn't write to file: {}", Error::description(&why)) }` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::single_match)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] [INFO] [stderr] warning: this loop could be written as a `while let` loop [INFO] [stderr] --> src/assembler.rs:98:3 [INFO] [stderr] | [INFO] [stderr] 98 | loop { [INFO] [stderr] | _________^ [INFO] [stderr] 99 | | match self.parser.input_lines.next() { [INFO] [stderr] 100 | | Some(line) => { [INFO] [stderr] 101 | | let content = line.unwrap().trim().to_string(); [INFO] [stderr] ... | [INFO] [stderr] 135 | | } [INFO] [stderr] 136 | | } [INFO] [stderr] | |_________^ help: try: `while let Some(line) = self.parser.input_lines.next() { .. }` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::while_let_loop)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#while_let_loop [INFO] [stderr] [INFO] [stderr] warning: `if _ { .. } else { .. }` is an expression [INFO] [stderr] --> src/assembler.rs:109:6 [INFO] [stderr] | [INFO] [stderr] 109 | let mut content_without_inline = String::new(); [INFO] [stderr] | _____________________^ [INFO] [stderr] 110 | | if content.contains("//") { [INFO] [stderr] 111 | | let v: Vec<&str> = content.split("//").collect(); [INFO] [stderr] 112 | | content_without_inline = v[0].trim().to_string(); [INFO] [stderr] 113 | | } [INFO] [stderr] | |_____________________^ help: it is more idiomatic to write: `let content_without_inline = if content.contains("//") { ..; v[0].trim().to_string() } else { String::new() };` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::useless_let_if_seq)] on by default [INFO] [stderr] = note: you might not need `mut` at all [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_let_if_seq [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/assembler.rs:129:50 [INFO] [stderr] | [INFO] [stderr] 129 | println!("({0}, {1})", l_cmd_sym.clone(), next_instr_rom_address.clone()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try removing the `clone` call: `next_instr_rom_address` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::clone_on_copy)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: this loop could be written as a `while let` loop [INFO] [stderr] --> src/assembler.rs:157:3 [INFO] [stderr] | [INFO] [stderr] 157 | loop { [INFO] [stderr] | _________^ [INFO] [stderr] 158 | | match self.parser.input_lines.next() { [INFO] [stderr] 159 | | Some(line) => { // has_more_command.true [INFO] [stderr] 160 | | let content = line.unwrap().trim().to_string(); [INFO] [stderr] ... | [INFO] [stderr] 219 | | } [INFO] [stderr] 220 | | } [INFO] [stderr] | |_________^ help: try: `while let Some(line) = self.parser.input_lines.next() { .. }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#while_let_loop [INFO] [stderr] [INFO] [stderr] warning: `if _ { .. } else { .. }` is an expression [INFO] [stderr] --> src/assembler.rs:168:6 [INFO] [stderr] | [INFO] [stderr] 168 | let mut content_without_inline = String::new(); [INFO] [stderr] | _____________________^ [INFO] [stderr] 169 | | if content.contains("//") { [INFO] [stderr] 170 | | let v: Vec<&str> = content.split("//").collect(); [INFO] [stderr] 171 | | content_without_inline = v[0].trim().to_string(); [INFO] [stderr] 172 | | } [INFO] [stderr] | |_____________________^ help: it is more idiomatic to write: `let content_without_inline = if content.contains("//") { ..; v[0].trim().to_string() } else { String::new() };` [INFO] [stderr] | [INFO] [stderr] = note: you might not need `mut` at all [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_let_if_seq [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/assembler.rs:190:10 [INFO] [stderr] | [INFO] [stderr] 190 | match self.symbol_table.contains(&a_cmd_symbol) { [INFO] [stderr] | _____________________________________^ [INFO] [stderr] 191 | | true => { // found the symbol in the table [INFO] [stderr] 192 | | let address = self.symbol_table.get_address(&a_cmd_symbol); [INFO] [stderr] 193 | | Assembler::write_to_file(&output_file, address); [INFO] [stderr] ... | [INFO] [stderr] 199 | | }, [INFO] [stderr] 200 | | } [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] 190 | if self.symbol_table.contains(&a_cmd_symbol) { // found the symbol in the table [INFO] [stderr] 191 | let address = self.symbol_table.get_address(&a_cmd_symbol); [INFO] [stderr] 192 | Assembler::write_to_file(&output_file, address); [INFO] [stderr] 193 | } else { // couldn't find the symbol in the table. Find the next available addr. [INFO] [stderr] 194 | self.symbol_table.add_entry(a_cmd_symbol, user_defined_var_addr); [INFO] [stderr] 195 | Assembler::write_to_file(&output_file, user_defined_var_addr); [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: single-character string constant used as pattern [INFO] [stderr] --> src/assembler.rs:251:39 [INFO] [stderr] | [INFO] [stderr] 251 | if self.current_command.starts_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/assembler.rs:253:46 [INFO] [stderr] | [INFO] [stderr] 253 | } else if self.current_command.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: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/assembler.rs:275:3 [INFO] [stderr] | [INFO] [stderr] 275 | match self.current_command.contains('=') { [INFO] [stderr] | _________^ [INFO] [stderr] 276 | | true => { [INFO] [stderr] 277 | | let v: Vec<&str> = self.current_command.split('=').collect(); [INFO] [stderr] 278 | | return v[0].to_string() [INFO] [stderr] 279 | | }, [INFO] [stderr] 280 | | false => "null".to_string(), [INFO] [stderr] 281 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [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] 275 | if self.current_command.contains('=') { [INFO] [stderr] 276 | let v: Vec<&str> = self.current_command.split('=').collect(); [INFO] [stderr] 277 | return v[0].to_string() [INFO] [stderr] 278 | } else { "null".to_string() } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/assembler.rs:289:3 [INFO] [stderr] | [INFO] [stderr] 289 | match self.current_command.contains('=') { [INFO] [stderr] | _________^ [INFO] [stderr] 290 | | true => { [INFO] [stderr] 291 | | match self.current_command.contains(';') { [INFO] [stderr] 292 | | true => { // dest=comp;jump [INFO] [stderr] ... | [INFO] [stderr] 312 | | } [INFO] [stderr] 313 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [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] 289 | if self.current_command.contains('=') { [INFO] [stderr] 290 | match self.current_command.contains(';') { [INFO] [stderr] 291 | true => { // dest=comp;jump [INFO] [stderr] 292 | let v: Vec<&str> = self.current_command.split(|c: char| c == ';' || c == '=' ).collect(); [INFO] [stderr] 293 | v[1].to_string() [INFO] [stderr] 294 | }, [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/assembler.rs:291:5 [INFO] [stderr] | [INFO] [stderr] 291 | match self.current_command.contains(';') { [INFO] [stderr] | _________________^ [INFO] [stderr] 292 | | true => { // dest=comp;jump [INFO] [stderr] 293 | | let v: Vec<&str> = self.current_command.split(|c: char| c == ';' || c == '=' ).collect(); [INFO] [stderr] 294 | | v[1].to_string() [INFO] [stderr] ... | [INFO] [stderr] 299 | | } [INFO] [stderr] 300 | | } [INFO] [stderr] | |_________________^ [INFO] [stderr] | [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] 291 | if self.current_command.contains(';') { // dest=comp;jump [INFO] [stderr] 292 | let v: Vec<&str> = self.current_command.split(|c: char| c == ';' || c == '=' ).collect(); [INFO] [stderr] 293 | v[1].to_string() [INFO] [stderr] 294 | } else { // dest=comp [INFO] [stderr] 295 | let v: Vec<&str> = self.current_command.split('=').collect(); [INFO] [stderr] 296 | v[1].to_string() [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/assembler.rs:303:5 [INFO] [stderr] | [INFO] [stderr] 303 | match self.current_command.contains(';') { [INFO] [stderr] | _________________^ [INFO] [stderr] 304 | | true => { // comp;jump [INFO] [stderr] 305 | | let v: Vec<&str> = self.current_command.split(';').collect(); [INFO] [stderr] 306 | | v[0].to_string() [INFO] [stderr] ... | [INFO] [stderr] 310 | | }, [INFO] [stderr] 311 | | } [INFO] [stderr] | |_________________^ [INFO] [stderr] | [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] 303 | if self.current_command.contains(';') { // comp;jump [INFO] [stderr] 304 | let v: Vec<&str> = self.current_command.split(';').collect(); [INFO] [stderr] 305 | v[0].to_string() [INFO] [stderr] 306 | } else { // comp [INFO] [stderr] 307 | self.current_command.clone() [INFO] [stderr] 308 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/assembler.rs:321:3 [INFO] [stderr] | [INFO] [stderr] 321 | match self.current_command.contains(';') { [INFO] [stderr] | _________^ [INFO] [stderr] 322 | | true => { [INFO] [stderr] 323 | | let v: Vec<&str> = self.current_command.split(';').collect(); [INFO] [stderr] 324 | | return v[1].to_string() [INFO] [stderr] 325 | | }, [INFO] [stderr] 326 | | false => "null".to_string(), [INFO] [stderr] 327 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [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] 321 | if self.current_command.contains(';') { [INFO] [stderr] 322 | let v: Vec<&str> = self.current_command.split(';').collect(); [INFO] [stderr] 323 | return v[1].to_string() [INFO] [stderr] 324 | } else { "null".to_string() } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/assembler.rs:585:19 [INFO] [stderr] | [INFO] [stderr] 585 | Some(value) => value.clone(), [INFO] [stderr] | ^^^^^^^^^^^^^ help: try dereferencing it: `*value` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/assembler.rs:710:13 [INFO] [stderr] | [INFO] [stderr] 710 | let tmp = self.table.get(symbol).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&self.table[symbol]` [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: using `clone` on a `Copy` type [INFO] [stderr] --> src/assembler.rs:711:3 [INFO] [stderr] | [INFO] [stderr] 711 | tmp.clone() [INFO] [stderr] | ^^^^^^^^^^^ help: try dereferencing it: `*tmp` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/assembler.rs:80:3 [INFO] [stderr] | [INFO] [stderr] 80 | match file.write_fmt(format_args!("{:016b}\n", code)) { [INFO] [stderr] | _________^ [INFO] [stderr] 81 | | Err(why) => panic!("couldn't write to file: {}", Error::description(&why)), [INFO] [stderr] 82 | | Ok(_) => (), [INFO] [stderr] 83 | | } [INFO] [stderr] | |_________^ help: try this: `if let Err(why) = file.write_fmt(format_args!("{:016b}\n", code)) { panic!("couldn't write to file: {}", Error::description(&why)) }` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::single_match)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] [INFO] [stderr] warning: this loop could be written as a `while let` loop [INFO] [stderr] --> src/assembler.rs:98:3 [INFO] [stderr] | [INFO] [stderr] 98 | loop { [INFO] [stderr] | _________^ [INFO] [stderr] 99 | | match self.parser.input_lines.next() { [INFO] [stderr] 100 | | Some(line) => { [INFO] [stderr] 101 | | let content = line.unwrap().trim().to_string(); [INFO] [stderr] ... | [INFO] [stderr] 135 | | } [INFO] [stderr] 136 | | } [INFO] [stderr] | |_________^ help: try: `while let Some(line) = self.parser.input_lines.next() { .. }` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::while_let_loop)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#while_let_loop [INFO] [stderr] [INFO] [stderr] warning: `if _ { .. } else { .. }` is an expression [INFO] [stderr] --> src/assembler.rs:109:6 [INFO] [stderr] | [INFO] [stderr] 109 | let mut content_without_inline = String::new(); [INFO] [stderr] | _____________________^ [INFO] [stderr] 110 | | if content.contains("//") { [INFO] [stderr] 111 | | let v: Vec<&str> = content.split("//").collect(); [INFO] [stderr] 112 | | content_without_inline = v[0].trim().to_string(); [INFO] [stderr] 113 | | } [INFO] [stderr] | |_____________________^ help: it is more idiomatic to write: `let content_without_inline = if content.contains("//") { ..; v[0].trim().to_string() } else { String::new() };` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::useless_let_if_seq)] on by default [INFO] [stderr] = note: you might not need `mut` at all [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_let_if_seq [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/assembler.rs:129:50 [INFO] [stderr] | [INFO] [stderr] 129 | println!("({0}, {1})", l_cmd_sym.clone(), next_instr_rom_address.clone()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try removing the `clone` call: `next_instr_rom_address` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::clone_on_copy)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: this loop could be written as a `while let` loop [INFO] [stderr] --> src/assembler.rs:157:3 [INFO] [stderr] | [INFO] [stderr] 157 | loop { [INFO] [stderr] | _________^ [INFO] [stderr] 158 | | match self.parser.input_lines.next() { [INFO] [stderr] 159 | | Some(line) => { // has_more_command.true [INFO] [stderr] 160 | | let content = line.unwrap().trim().to_string(); [INFO] [stderr] ... | [INFO] [stderr] 219 | | } [INFO] [stderr] 220 | | } [INFO] [stderr] | |_________^ help: try: `while let Some(line) = self.parser.input_lines.next() { .. }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#while_let_loop [INFO] [stderr] [INFO] [stderr] warning: `if _ { .. } else { .. }` is an expression [INFO] [stderr] --> src/assembler.rs:168:6 [INFO] [stderr] | [INFO] [stderr] 168 | let mut content_without_inline = String::new(); [INFO] [stderr] | _____________________^ [INFO] [stderr] 169 | | if content.contains("//") { [INFO] [stderr] 170 | | let v: Vec<&str> = content.split("//").collect(); [INFO] [stderr] 171 | | content_without_inline = v[0].trim().to_string(); [INFO] [stderr] 172 | | } [INFO] [stderr] | |_____________________^ help: it is more idiomatic to write: `let content_without_inline = if content.contains("//") { ..; v[0].trim().to_string() } else { String::new() };` [INFO] [stderr] | [INFO] [stderr] = note: you might not need `mut` at all [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_let_if_seq [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/assembler.rs:190:10 [INFO] [stderr] | [INFO] [stderr] 190 | match self.symbol_table.contains(&a_cmd_symbol) { [INFO] [stderr] | _____________________________________^ [INFO] [stderr] 191 | | true => { // found the symbol in the table [INFO] [stderr] 192 | | let address = self.symbol_table.get_address(&a_cmd_symbol); [INFO] [stderr] 193 | | Assembler::write_to_file(&output_file, address); [INFO] [stderr] ... | [INFO] [stderr] 199 | | }, [INFO] [stderr] 200 | | } [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] 190 | if self.symbol_table.contains(&a_cmd_symbol) { // found the symbol in the table [INFO] [stderr] 191 | let address = self.symbol_table.get_address(&a_cmd_symbol); [INFO] [stderr] 192 | Assembler::write_to_file(&output_file, address); [INFO] [stderr] 193 | } else { // couldn't find the symbol in the table. Find the next available addr. [INFO] [stderr] 194 | self.symbol_table.add_entry(a_cmd_symbol, user_defined_var_addr); [INFO] [stderr] 195 | Assembler::write_to_file(&output_file, user_defined_var_addr); [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: single-character string constant used as pattern [INFO] [stderr] --> src/assembler.rs:251:39 [INFO] [stderr] | [INFO] [stderr] 251 | if self.current_command.starts_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/assembler.rs:253:46 [INFO] [stderr] | [INFO] [stderr] 253 | } else if self.current_command.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: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/assembler.rs:275:3 [INFO] [stderr] | [INFO] [stderr] 275 | match self.current_command.contains('=') { [INFO] [stderr] | _________^ [INFO] [stderr] 276 | | true => { [INFO] [stderr] 277 | | let v: Vec<&str> = self.current_command.split('=').collect(); [INFO] [stderr] 278 | | return v[0].to_string() [INFO] [stderr] 279 | | }, [INFO] [stderr] 280 | | false => "null".to_string(), [INFO] [stderr] 281 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [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] 275 | if self.current_command.contains('=') { [INFO] [stderr] 276 | let v: Vec<&str> = self.current_command.split('=').collect(); [INFO] [stderr] 277 | return v[0].to_string() [INFO] [stderr] 278 | } else { "null".to_string() } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/assembler.rs:289:3 [INFO] [stderr] | [INFO] [stderr] 289 | match self.current_command.contains('=') { [INFO] [stderr] | _________^ [INFO] [stderr] 290 | | true => { [INFO] [stderr] 291 | | match self.current_command.contains(';') { [INFO] [stderr] 292 | | true => { // dest=comp;jump [INFO] [stderr] ... | [INFO] [stderr] 312 | | } [INFO] [stderr] 313 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [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] 289 | if self.current_command.contains('=') { [INFO] [stderr] 290 | match self.current_command.contains(';') { [INFO] [stderr] 291 | true => { // dest=comp;jump [INFO] [stderr] 292 | let v: Vec<&str> = self.current_command.split(|c: char| c == ';' || c == '=' ).collect(); [INFO] [stderr] 293 | v[1].to_string() [INFO] [stderr] 294 | }, [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/assembler.rs:291:5 [INFO] [stderr] | [INFO] [stderr] 291 | match self.current_command.contains(';') { [INFO] [stderr] | _________________^ [INFO] [stderr] 292 | | true => { // dest=comp;jump [INFO] [stderr] 293 | | let v: Vec<&str> = self.current_command.split(|c: char| c == ';' || c == '=' ).collect(); [INFO] [stderr] 294 | | v[1].to_string() [INFO] [stderr] ... | [INFO] [stderr] 299 | | } [INFO] [stderr] 300 | | } [INFO] [stderr] | |_________________^ [INFO] [stderr] | [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] 291 | if self.current_command.contains(';') { // dest=comp;jump [INFO] [stderr] 292 | let v: Vec<&str> = self.current_command.split(|c: char| c == ';' || c == '=' ).collect(); [INFO] [stderr] 293 | v[1].to_string() [INFO] [stderr] 294 | } else { // dest=comp [INFO] [stderr] 295 | let v: Vec<&str> = self.current_command.split('=').collect(); [INFO] [stderr] 296 | v[1].to_string() [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/assembler.rs:303:5 [INFO] [stderr] | [INFO] [stderr] 303 | match self.current_command.contains(';') { [INFO] [stderr] | _________________^ [INFO] [stderr] 304 | | true => { // comp;jump [INFO] [stderr] 305 | | let v: Vec<&str> = self.current_command.split(';').collect(); [INFO] [stderr] 306 | | v[0].to_string() [INFO] [stderr] ... | [INFO] [stderr] 310 | | }, [INFO] [stderr] 311 | | } [INFO] [stderr] | |_________________^ [INFO] [stderr] | [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] 303 | if self.current_command.contains(';') { // comp;jump [INFO] [stderr] 304 | let v: Vec<&str> = self.current_command.split(';').collect(); [INFO] [stderr] 305 | v[0].to_string() [INFO] [stderr] 306 | } else { // comp [INFO] [stderr] 307 | self.current_command.clone() [INFO] [stderr] 308 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/assembler.rs:321:3 [INFO] [stderr] | [INFO] [stderr] 321 | match self.current_command.contains(';') { [INFO] [stderr] | _________^ [INFO] [stderr] 322 | | true => { [INFO] [stderr] 323 | | let v: Vec<&str> = self.current_command.split(';').collect(); [INFO] [stderr] 324 | | return v[1].to_string() [INFO] [stderr] 325 | | }, [INFO] [stderr] 326 | | false => "null".to_string(), [INFO] [stderr] 327 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [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] 321 | if self.current_command.contains(';') { [INFO] [stderr] 322 | let v: Vec<&str> = self.current_command.split(';').collect(); [INFO] [stderr] 323 | return v[1].to_string() [INFO] [stderr] 324 | } else { "null".to_string() } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/assembler.rs:585:19 [INFO] [stderr] | [INFO] [stderr] 585 | Some(value) => value.clone(), [INFO] [stderr] | ^^^^^^^^^^^^^ help: try dereferencing it: `*value` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/assembler.rs:710:13 [INFO] [stderr] | [INFO] [stderr] 710 | let tmp = self.table.get(symbol).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&self.table[symbol]` [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: using `clone` on a `Copy` type [INFO] [stderr] --> src/assembler.rs:711:3 [INFO] [stderr] | [INFO] [stderr] 711 | tmp.clone() [INFO] [stderr] | ^^^^^^^^^^^ help: try dereferencing it: `*tmp` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: unused import: `std::env` [INFO] [stderr] --> src/main.rs:3:5 [INFO] [stderr] | [INFO] [stderr] 3 | use std::env; [INFO] [stderr] | ^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(unused_imports)] on by default [INFO] [stderr] [INFO] [stderr] warning: unused import: `hack::assembler::Assembler` [INFO] [stderr] --> src/main.rs:4:5 [INFO] [stderr] | [INFO] [stderr] 4 | use hack::assembler::Assembler; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: statement with no effect [INFO] [stderr] --> tests/assembler.rs:73:13 [INFO] [stderr] | [INFO] [stderr] 73 | Ok(_) => {"Clean up successful";}, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::no_effect)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#no_effect [INFO] [stderr] [INFO] [stderr] warning: statement with no effect [INFO] [stderr] --> tests/assembler.rs:74:14 [INFO] [stderr] | [INFO] [stderr] 74 | Err(_) => {"Couldn't clean up";}, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#no_effect [INFO] [stderr] [INFO] [stderr] Finished dev [unoptimized + debuginfo] target(s) in 1.19s [INFO] running `"docker" "inspect" "94fe31b43e29853eabd1217fab40c78d8e74235c4739f1d386e497abff5647e3"` [INFO] running `"docker" "rm" "-f" "94fe31b43e29853eabd1217fab40c78d8e74235c4739f1d386e497abff5647e3"` [INFO] [stdout] 94fe31b43e29853eabd1217fab40c78d8e74235c4739f1d386e497abff5647e3