[INFO] updating cached repository puppyofkosh/safer-c-compiler [INFO] running `"git" "fetch" "--all"` [INFO] [stdout] Fetching origin [INFO] [stderr] From git://github.com/puppyofkosh/safer-c-compiler [INFO] [stderr] * branch HEAD -> FETCH_HEAD [INFO] running `"git" "clone" "work/cache/sources/gh/puppyofkosh/safer-c-compiler" "work/ex/clippy-test-run/sources/stable/gh/puppyofkosh/safer-c-compiler"` [INFO] [stderr] Cloning into 'work/ex/clippy-test-run/sources/stable/gh/puppyofkosh/safer-c-compiler'... [INFO] [stderr] done. [INFO] running `"git" "clone" "work/cache/sources/gh/puppyofkosh/safer-c-compiler" "work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/puppyofkosh/safer-c-compiler"` [INFO] [stderr] Cloning into 'work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/puppyofkosh/safer-c-compiler'... [INFO] [stderr] done. [INFO] running `"git" "rev-parse" "HEAD"` [INFO] [stdout] 9a53e4b6c2ca2756fb91fbade4407e64796adfed [INFO] sha for GitHub repo puppyofkosh/safer-c-compiler: 9a53e4b6c2ca2756fb91fbade4407e64796adfed [INFO] validating manifest of puppyofkosh/safer-c-compiler 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 puppyofkosh/safer-c-compiler 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 puppyofkosh/safer-c-compiler [INFO] finished frobbing puppyofkosh/safer-c-compiler [INFO] frobbed toml for puppyofkosh/safer-c-compiler written to work/ex/clippy-test-run/sources/stable/gh/puppyofkosh/safer-c-compiler/Cargo.toml [INFO] started frobbing puppyofkosh/safer-c-compiler [INFO] finished frobbing puppyofkosh/safer-c-compiler [INFO] frobbed toml for puppyofkosh/safer-c-compiler written to work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/puppyofkosh/safer-c-compiler/Cargo.toml [INFO] crate puppyofkosh/safer-c-compiler 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 puppyofkosh/safer-c-compiler against stable for clippy-test-run [INFO] running `"docker" "create" "-v" "/mnt/big/crater/work/local/target-dirs/clippy-test-run/worker-0/stable:/opt/crater/target:rw,Z" "-v" "/mnt/big/crater/work/ex/clippy-test-run/sources/stable/gh/puppyofkosh/safer-c-compiler:/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] e5393804b7aa56d1f79072394a4c0b3cf498bcf977620c8b66c7b2cc4e480d2d [INFO] running `"docker" "start" "-a" "e5393804b7aa56d1f79072394a4c0b3cf498bcf977620c8b66c7b2cc4e480d2d"` [INFO] [stderr] Checking safer-c-compiler v0.1.0 (/opt/crater/workdir) [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/parser.rs:417:41 [INFO] [stderr] | [INFO] [stderr] 417 | FunctionCall {name:fn_name, args_exprs: args_exprs } [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `args_exprs` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::redundant_field_names)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/parser.rs:445:26 [INFO] [stderr] | [INFO] [stderr] 445 | statements: statements, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `statements` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/parser.rs:446:26 [INFO] [stderr] | [INFO] [stderr] 446 | args: args, [INFO] [stderr] | ^^^^^^^^^^ help: replace it with: `args` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/parser.rs:448:30 [INFO] [stderr] | [INFO] [stderr] 448 | arg_types: arg_types, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^ help: replace it with: `arg_types` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/parser.rs:449:30 [INFO] [stderr] | [INFO] [stderr] 449 | return_type: return_type, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `return_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/parser.rs:474:13 [INFO] [stderr] | [INFO] [stderr] 474 | name: name, [INFO] [stderr] | ^^^^^^^^^^ help: replace it with: `name` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/parser.rs:513:31 [INFO] [stderr] | [INFO] [stderr] 513 | return Block {statements: statements}; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `statements` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/parser.rs:536:22 [INFO] [stderr] | [INFO] [stderr] 536 | ast::Program{functions: functions, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^ help: replace it with: `functions` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/parser.rs:537:22 [INFO] [stderr] | [INFO] [stderr] 537 | structs: structs} [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: replace it with: `structs` [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/representation_manager.rs:40:17 [INFO] [stderr] | [INFO] [stderr] 40 | offset: offset, [INFO] [stderr] | ^^^^^^^^^^^^^^ help: replace it with: `offset` [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/representation_manager.rs:52:31 [INFO] [stderr] | [INFO] [stderr] 52 | StructRepresentation{ field_to_info: field_to_info, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `field_to_info` [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/x86_code_generator.rs:53:13 [INFO] [stderr] | [INFO] [stderr] 53 | var_type: var_type, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^ help: replace it with: `var_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/x86_code_generator.rs:54:13 [INFO] [stderr] | [INFO] [stderr] 54 | machine_type: machine_type, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `machine_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/parser.rs:417:41 [INFO] [stderr] | [INFO] [stderr] 417 | FunctionCall {name:fn_name, args_exprs: args_exprs } [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `args_exprs` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::redundant_field_names)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/parser.rs:445:26 [INFO] [stderr] | [INFO] [stderr] 445 | statements: statements, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `statements` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/parser.rs:446:26 [INFO] [stderr] | [INFO] [stderr] 446 | args: args, [INFO] [stderr] | ^^^^^^^^^^ help: replace it with: `args` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/parser.rs:448:30 [INFO] [stderr] | [INFO] [stderr] 448 | arg_types: arg_types, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^ help: replace it with: `arg_types` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/parser.rs:449:30 [INFO] [stderr] | [INFO] [stderr] 449 | return_type: return_type, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `return_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/parser.rs:474:13 [INFO] [stderr] | [INFO] [stderr] 474 | name: name, [INFO] [stderr] | ^^^^^^^^^^ help: replace it with: `name` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/parser.rs:513:31 [INFO] [stderr] | [INFO] [stderr] 513 | return Block {statements: statements}; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `statements` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/parser.rs:536:22 [INFO] [stderr] | [INFO] [stderr] 536 | ast::Program{functions: functions, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^ help: replace it with: `functions` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names [INFO] [stderr] [INFO] [stderr] warning: redundant field names in struct initialization [INFO] [stderr] --> src/parser.rs:537:22 [INFO] [stderr] | [INFO] [stderr] 537 | structs: structs} [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: replace it with: `structs` [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/representation_manager.rs:40:17 [INFO] [stderr] | [INFO] [stderr] 40 | offset: offset, [INFO] [stderr] | ^^^^^^^^^^^^^^ help: replace it with: `offset` [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/representation_manager.rs:52:31 [INFO] [stderr] | [INFO] [stderr] 52 | StructRepresentation{ field_to_info: field_to_info, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `field_to_info` [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/x86_code_generator.rs:53:13 [INFO] [stderr] | [INFO] [stderr] 53 | var_type: var_type, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^ help: replace it with: `var_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/x86_code_generator.rs:54:13 [INFO] [stderr] | [INFO] [stderr] 54 | machine_type: machine_type, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `machine_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:332:9 [INFO] [stderr] | [INFO] [stderr] 332 | return Statement::Return(expr); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove `return` as shown: `Statement::Return(expr)` [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/parser.rs:444:9 [INFO] [stderr] | [INFO] [stderr] 444 | / return Function {name: fn_name, [INFO] [stderr] 445 | | statements: statements, [INFO] [stderr] 446 | | args: args, [INFO] [stderr] 447 | | fn_type: ast::FunctionType { [INFO] [stderr] ... | [INFO] [stderr] 451 | | } [INFO] [stderr] 452 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] help: remove `return` as shown [INFO] [stderr] | [INFO] [stderr] 444 | Function {name: fn_name, [INFO] [stderr] 445 | statements: statements, [INFO] [stderr] 446 | args: args, [INFO] [stderr] 447 | fn_type: ast::FunctionType { [INFO] [stderr] 448 | arg_types: arg_types, [INFO] [stderr] 449 | return_type: return_type, [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: returning the result of a let binding from a block. Consider returning the expression directly. [INFO] [stderr] --> src/parser.rs:546:5 [INFO] [stderr] | [INFO] [stderr] 546 | prog [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/parser.rs:544:16 [INFO] [stderr] | [INFO] [stderr] 544 | let prog = p.parse_program(tokens); [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: unused import: `ast::Block` [INFO] [stderr] --> src/pointer_arithmetic_transformer.rs:3:5 [INFO] [stderr] | [INFO] [stderr] 3 | use ast::Block; [INFO] [stderr] | ^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(unused_imports)] on by default [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/type_checker_helper.rs:33:5 [INFO] [stderr] | [INFO] [stderr] 33 | return false; [INFO] [stderr] | ^^^^^^^^^^^^^ help: remove `return` as shown: `false` [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:332:9 [INFO] [stderr] | [INFO] [stderr] 332 | return Statement::Return(expr); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove `return` as shown: `Statement::Return(expr)` [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/parser.rs:444:9 [INFO] [stderr] | [INFO] [stderr] 444 | / return Function {name: fn_name, [INFO] [stderr] 445 | | statements: statements, [INFO] [stderr] 446 | | args: args, [INFO] [stderr] 447 | | fn_type: ast::FunctionType { [INFO] [stderr] ... | [INFO] [stderr] 451 | | } [INFO] [stderr] 452 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] help: remove `return` as shown [INFO] [stderr] | [INFO] [stderr] 444 | Function {name: fn_name, [INFO] [stderr] 445 | statements: statements, [INFO] [stderr] 446 | args: args, [INFO] [stderr] 447 | fn_type: ast::FunctionType { [INFO] [stderr] 448 | arg_types: arg_types, [INFO] [stderr] 449 | return_type: return_type, [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: returning the result of a let binding from a block. Consider returning the expression directly. [INFO] [stderr] --> src/parser.rs:546:5 [INFO] [stderr] | [INFO] [stderr] 546 | prog [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/parser.rs:544:16 [INFO] [stderr] | [INFO] [stderr] 544 | let prog = p.parse_program(tokens); [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: unused import: `ast::Block` [INFO] [stderr] --> src/pointer_arithmetic_transformer.rs:3:5 [INFO] [stderr] | [INFO] [stderr] 3 | use ast::Block; [INFO] [stderr] | ^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(unused_imports)] on by default [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/type_checker_helper.rs:33:5 [INFO] [stderr] | [INFO] [stderr] 33 | return false; [INFO] [stderr] | ^^^^^^^^^^^^^ help: remove `return` as shown: `false` [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: this argument is passed by reference, but would be more efficient if passed by value [INFO] [stderr] --> src/assembly_helper.rs:42:31 [INFO] [stderr] | [INFO] [stderr] 42 | pub fn register_other_than(r: &RegisterVal) -> RegisterVal { [INFO] [stderr] | ^^^^^^^^^^^^ help: consider passing by value instead: `RegisterVal` [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: this argument is passed by reference, but would be more efficient if passed by value [INFO] [stderr] --> src/assembly_helper.rs:52:24 [INFO] [stderr] | [INFO] [stderr] 52 | pub fn get_low_byte(o: &RegisterVal) -> RegisterVal { [INFO] [stderr] | ^^^^^^^^^^^^ help: consider passing by value instead: `RegisterVal` [INFO] [stderr] | [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: this argument is passed by reference, but would be more efficient if passed by value [INFO] [stderr] --> src/assembly_printer.rs:10:18 [INFO] [stderr] | [INFO] [stderr] 10 | fn reg_to_str(r: &RegisterVal) -> String { [INFO] [stderr] | ^^^^^^^^^^^^ help: consider passing by value instead: `RegisterVal` [INFO] [stderr] | [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: this argument is passed by reference, but would be more efficient if passed by value [INFO] [stderr] --> src/assembly_helper.rs:42:31 [INFO] [stderr] | [INFO] [stderr] 42 | pub fn register_other_than(r: &RegisterVal) -> RegisterVal { [INFO] [stderr] | ^^^^^^^^^^^^ help: consider passing by value instead: `RegisterVal` [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: this argument is passed by reference, but would be more efficient if passed by value [INFO] [stderr] --> src/assembly_helper.rs:52:24 [INFO] [stderr] | [INFO] [stderr] 52 | pub fn get_low_byte(o: &RegisterVal) -> RegisterVal { [INFO] [stderr] | ^^^^^^^^^^^^ help: consider passing by value instead: `RegisterVal` [INFO] [stderr] | [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: this argument is passed by reference, but would be more efficient if passed by value [INFO] [stderr] --> src/assembly_printer.rs:10:18 [INFO] [stderr] | [INFO] [stderr] 10 | fn reg_to_str(r: &RegisterVal) -> String { [INFO] [stderr] | ^^^^^^^^^^^^ help: consider passing by value instead: `RegisterVal` [INFO] [stderr] | [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: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/assembly_printer.rs:70:46 [INFO] [stderr] | [INFO] [stderr] 70 | pub fn instruction_list_to_asm(instructions: &Vec) -> String { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^ help: change this to: `&[Instruction]` [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/assembly_printer.rs:70:46 [INFO] [stderr] | [INFO] [stderr] 70 | pub fn instruction_list_to_asm(instructions: &Vec) -> String { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^ help: change this to: `&[Instruction]` [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 argument is passed by reference, but would be more efficient if passed by value [INFO] [stderr] --> src/parser.rs:40:21 [INFO] [stderr] | [INFO] [stderr] 40 | fn optype_to_op(op: &OperatorType) -> BinaryOp { [INFO] [stderr] | ^^^^^^^^^^^^^ help: consider passing by value instead: `OperatorType` [INFO] [stderr] | [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: this argument is passed by reference, but would be more efficient if passed by value [INFO] [stderr] --> src/parser.rs:59:23 [INFO] [stderr] | [INFO] [stderr] 59 | fn get_precedence(op: &OperatorType) -> i32 { [INFO] [stderr] | ^^^^^^^^^^^^^ help: consider passing by value instead: `OperatorType` [INFO] [stderr] | [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: this argument is passed by reference, but would be more efficient if passed by value [INFO] [stderr] --> src/parser.rs:100:39 [INFO] [stderr] | [INFO] [stderr] 100 | fn evaluate_bin_op(&mut self, op: &OperatorType, [INFO] [stderr] | ^^^^^^^^^^^^^ help: consider passing by value instead: `OperatorType` [INFO] [stderr] | [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: this argument is passed by reference, but would be more efficient if passed by value [INFO] [stderr] --> src/parser.rs:40:21 [INFO] [stderr] | [INFO] [stderr] 40 | fn optype_to_op(op: &OperatorType) -> BinaryOp { [INFO] [stderr] | ^^^^^^^^^^^^^ help: consider passing by value instead: `OperatorType` [INFO] [stderr] | [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: this argument is passed by reference, but would be more efficient if passed by value [INFO] [stderr] --> src/parser.rs:59:23 [INFO] [stderr] | [INFO] [stderr] 59 | fn get_precedence(op: &OperatorType) -> i32 { [INFO] [stderr] | ^^^^^^^^^^^^^ help: consider passing by value instead: `OperatorType` [INFO] [stderr] | [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: this argument is passed by reference, but would be more efficient if passed by value [INFO] [stderr] --> src/parser.rs:100:39 [INFO] [stderr] | [INFO] [stderr] 100 | fn evaluate_bin_op(&mut self, op: &OperatorType, [INFO] [stderr] | ^^^^^^^^^^^^^ help: consider passing by value instead: `OperatorType` [INFO] [stderr] | [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: `if _ { .. } else { .. }` is an expression [INFO] [stderr] --> src/parser.rs:352:9 [INFO] [stderr] | [INFO] [stderr] 352 | / let mut else_block = None; [INFO] [stderr] 353 | | if tokens.peek() == Lexeme::Else { [INFO] [stderr] 354 | | assert_eq!(tokens.consume(), Lexeme::Else); [INFO] [stderr] 355 | | else_block = Some(self.parse_block(tokens)); [INFO] [stderr] 356 | | } [INFO] [stderr] | |_________^ help: it is more idiomatic to write: `let else_block = if tokens.peek() == Lexeme::Else { ..; Some(self.parse_block(tokens)) } else { None };` [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: `if _ { .. } else { .. }` is an expression [INFO] [stderr] --> src/parser.rs:352:9 [INFO] [stderr] | [INFO] [stderr] 352 | / let mut else_block = None; [INFO] [stderr] 353 | | if tokens.peek() == Lexeme::Else { [INFO] [stderr] 354 | | assert_eq!(tokens.consume(), Lexeme::Else); [INFO] [stderr] 355 | | else_block = Some(self.parse_block(tokens)); [INFO] [stderr] 356 | | } [INFO] [stderr] | |_________^ help: it is more idiomatic to write: `let else_block = if tokens.peek() == Lexeme::Else { ..; Some(self.parse_block(tokens)) } else { None };` [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/pointer_arithmetic_transformer.rs:93:38 [INFO] [stderr] | [INFO] [stderr] 93 | Expression::BinaryOp(op.clone(), Box::new(left), [INFO] [stderr] | ^^^^^^^^^^ help: try removing the `clone` call: `op` [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: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/representation_manager.rs:58:37 [INFO] [stderr] | [INFO] [stderr] 58 | struct_definitions: &Vec) { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: change this to: `&[StructDefinition]` [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 don't need to add `&` to all patterns [INFO] [stderr] --> src/representation_manager.rs:112:5 [INFO] [stderr] | [INFO] [stderr] 112 | / if let &VarType::Struct(ref n) = typ { [INFO] [stderr] 113 | | return n; [INFO] [stderr] 114 | | } else { [INFO] [stderr] 115 | | panic!("Not a struct!"); [INFO] [stderr] 116 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::match_ref_pats)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 112 | if let VarType::Struct(ref n) = *typ { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ ^^^^ [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/scanner.rs:13:13 [INFO] [stderr] | [INFO] [stderr] 13 | assert!(token.len() > 0); [INFO] [stderr] | ^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!token.is_empty()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::len_zero)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: single-character string constant used as pattern [INFO] [stderr] --> src/scanner.rs:52:34 [INFO] [stderr] | [INFO] [stderr] 52 | if token.starts_with("\"") && token.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/scanner.rs:52:59 [INFO] [stderr] | [INFO] [stderr] 52 | if token.starts_with("\"") && token.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: single-character string constant used as pattern [INFO] [stderr] --> src/scanner.rs:58:34 [INFO] [stderr] | [INFO] [stderr] 58 | if token.starts_with("\'") && token.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: single-character string constant used as pattern [INFO] [stderr] --> src/scanner.rs:58:59 [INFO] [stderr] | [INFO] [stderr] 58 | if token.starts_with("\'") && token.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: length comparison to zero [INFO] [stderr] --> src/scanner.rs:117:8 [INFO] [stderr] | [INFO] [stderr] 117 | if source.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `source.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/struct_analyzer.rs:61:35 [INFO] [stderr] | [INFO] [stderr] 61 | structs: &Vec) -> bool { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: change this to: `&[StructDefinition]` [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 block may be rewritten with the `?` operator [INFO] [stderr] --> src/type_checker.rs:117:9 [INFO] [stderr] | [INFO] [stderr] 117 | / if fn_type_opt.is_none() { [INFO] [stderr] 118 | | self.errors_found.push(format!("Unkown function {}", [INFO] [stderr] 119 | | call.name)); [INFO] [stderr] 120 | | return None [INFO] [stderr] 121 | | } [INFO] [stderr] | |_________^ help: replace_it_with: `fn_type_opt?;` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::question_mark)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#question_mark [INFO] [stderr] [INFO] [stderr] warning: called `.get_mut().unwrap()` on a Vec. Using `[]` is more clear and more concise [INFO] [stderr] --> src/type_checker.rs:137:51 [INFO] [stderr] | [INFO] [stderr] 137 | let arg_type_opt = self.annotate_type(call.args_exprs.get_mut(i).unwrap()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `call.args_exprs[i]` [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: this block may be rewritten with the `?` operator [INFO] [stderr] --> src/type_checker.rs:138:13 [INFO] [stderr] | [INFO] [stderr] 138 | if arg_type_opt.is_none() { return None; } [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace_it_with: `arg_type_opt?;` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#question_mark [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a Vec. Using `[]` is more clear and more concise [INFO] [stderr] --> src/type_checker.rs:143:34 [INFO] [stderr] | [INFO] [stderr] 143 | let param_type = fn_type.arg_types.get(i).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `fn_type.arg_types[i]` [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/type_checker.rs:170:36 [INFO] [stderr] | [INFO] [stderr] 170 | op: &ast::BinaryOp, l: &mut AstExpressionNode, [INFO] [stderr] | ^^^^^^^^^^^^^^ help: consider passing by value instead: `ast::BinaryOp` [INFO] [stderr] | [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: this block may be rewritten with the `?` operator [INFO] [stderr] --> src/type_checker.rs:267:17 [INFO] [stderr] | [INFO] [stderr] 267 | / if expr_t.is_none() { [INFO] [stderr] 268 | | None [INFO] [stderr] 269 | | } else if let Some(VarType::Struct(ref struct_name)) = expr_t { [INFO] [stderr] 270 | | // return type of the field [INFO] [stderr] ... | [INFO] [stderr] 286 | | None [INFO] [stderr] 287 | | } [INFO] [stderr] | |_________________^ help: replace_it_with: `expr_t?;` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#question_mark [INFO] [stderr] [INFO] [stderr] warning: use of `expect` followed by a function call [INFO] [stderr] --> src/type_checker.rs:273:26 [INFO] [stderr] | [INFO] [stderr] 273 | .expect(&format!("Struct {} unkown!", struct_name)); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|| panic!("Struct {} unkown!", struct_name))` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::expect_fun_call)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#expect_fun_call [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/pointer_arithmetic_transformer.rs:93:38 [INFO] [stderr] | [INFO] [stderr] 93 | Expression::BinaryOp(op.clone(), Box::new(left), [INFO] [stderr] | ^^^^^^^^^^ help: try removing the `clone` call: `op` [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: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/type_checker.rs:298:33 [INFO] [stderr] | [INFO] [stderr] 298 | let ret_type = &self.function_to_type [INFO] [stderr] | _________________________________^ [INFO] [stderr] 299 | | .get(&self.current_fn) [INFO] [stderr] 300 | | .unwrap() [INFO] [stderr] | |_____________________________^ help: try this: `&self.function_to_type[&self.current_fn]` [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/representation_manager.rs:58:37 [INFO] [stderr] | [INFO] [stderr] 58 | struct_definitions: &Vec) { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: change this to: `&[StructDefinition]` [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 don't need to add `&` to all patterns [INFO] [stderr] --> src/type_checker.rs:329:17 [INFO] [stderr] | [INFO] [stderr] 329 | / if let &mut Some(ref mut else_stmts) = else_opt { [INFO] [stderr] 330 | | // TODO: add else checker [INFO] [stderr] 331 | | self.annotate_types_block(else_stmts) && self.annotate_types_block(stmts) && expr_type.is_some() [INFO] [stderr] 332 | | } else { [INFO] [stderr] 333 | | self.annotate_types_block(stmts) && expr_type.is_some() [INFO] [stderr] 334 | | } [INFO] [stderr] | |_________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 329 | if let Some(ref mut else_stmts) = *else_opt { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: `if _ { .. } else { .. }` is an expression [INFO] [stderr] --> src/type_checker.rs:341:17 [INFO] [stderr] | [INFO] [stderr] 341 | / let mut res = true; [INFO] [stderr] 342 | | if !self.type_exists(var_type) { [INFO] [stderr] 343 | | self.errors_found.push(format!("Type {:?} doesn't exist.", [INFO] [stderr] 344 | | var_type)); [INFO] [stderr] 345 | | res = false; [INFO] [stderr] 346 | | } [INFO] [stderr] | |_________________^ help: it is more idiomatic to write: `let res = if !self.type_exists(var_type) { ..; false } else { true };` [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 don't need to add `&` to all patterns [INFO] [stderr] --> src/type_checker.rs:348:17 [INFO] [stderr] | [INFO] [stderr] 348 | / if let &mut Some(ref mut expr) = expr_opt { [INFO] [stderr] 349 | | self.annotate_type(expr); [INFO] [stderr] 350 | | [INFO] [stderr] 351 | | if !type_checker_helper::can_assign_expr_to_type(var_type, [INFO] [stderr] ... | [INFO] [stderr] 360 | | // There was no initialization expression, which is fine. [INFO] [stderr] 361 | | } [INFO] [stderr] | |_________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 348 | if let Some(ref mut expr) = *expr_opt { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^ ^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: equality checks against true are unnecessary [INFO] [stderr] --> src/type_checker.rs:363:20 [INFO] [stderr] | [INFO] [stderr] 363 | if res == true { [INFO] [stderr] | ^^^^^^^^^^^ help: try simplifying it as shown: `res` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::bool_comparison)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bool_comparison [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/type_checker.rs:409:40 [INFO] [stderr] | [INFO] [stderr] 409 | fn add_structs(&mut self, structs: &Vec) { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: change this to: `&[StructDefinition]` [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 don't need to add `&` to all patterns [INFO] [stderr] --> src/representation_manager.rs:112:5 [INFO] [stderr] | [INFO] [stderr] 112 | / if let &VarType::Struct(ref n) = typ { [INFO] [stderr] 113 | | return n; [INFO] [stderr] 114 | | } else { [INFO] [stderr] 115 | | panic!("Not a struct!"); [INFO] [stderr] 116 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::match_ref_pats)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 112 | if let VarType::Struct(ref n) = *typ { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ ^^^^ [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/type_checker.rs:429:17 [INFO] [stderr] | [INFO] [stderr] 429 | / if let &Struct(_) = arg_type { [INFO] [stderr] 430 | | self.errors_found.push("Cannot pass structs yet".to_string()); [INFO] [stderr] 431 | | return false; [INFO] [stderr] 432 | | } [INFO] [stderr] | |_________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 429 | if let Struct(_) = *arg_type { [INFO] [stderr] | ^^^^^^^^^ ^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a Vec. Using `[]` is more clear and more concise [INFO] [stderr] --> src/type_checker.rs:445:46 [INFO] [stderr] | [INFO] [stderr] 445 | self.variable_to_type.insert(fun.args.get(i).unwrap().clone(), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `fun.args[i]` [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/type_checker.rs:446:46 [INFO] [stderr] | [INFO] [stderr] 446 | fun.fn_type.arg_types.get(i).unwrap().clone()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `fun.fn_type.arg_types[i]` [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: length comparison to zero [INFO] [stderr] --> src/scanner.rs:13:13 [INFO] [stderr] | [INFO] [stderr] 13 | assert!(token.len() > 0); [INFO] [stderr] | ^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!token.is_empty()` [INFO] [stderr] warning: this boolean expression can be simplified [INFO] [stderr] --> src/type_checker_helper.rs:49:8 [INFO] [stderr] | [INFO] [stderr] 49 | if !right.typ.is_some() { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^ help: try: `right.typ.is_none()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::nonminimal_bool)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#nonminimal_bool [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/type_checker_helper.rs:53:5 [INFO] [stderr] | [INFO] [stderr] 53 | / if let &Struct(_) = left_t { [INFO] [stderr] 54 | | // Can't assign structs to one another [INFO] [stderr] 55 | | return false; [INFO] [stderr] 56 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 53 | if let Struct(_) = *left_t { [INFO] [stderr] | ^^^^^^^^^ ^^^^^^^ [INFO] [stderr] [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::len_zero)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/type_checker_helper.rs:69:9 [INFO] [stderr] | [INFO] [stderr] 69 | / if let &Pointer(_, _) = left_t { [INFO] [stderr] 70 | | if let &Expression::Value(val) = &right.expr { [INFO] [stderr] 71 | | res = val == 0; [INFO] [stderr] 72 | | } [INFO] [stderr] 73 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 69 | if let Pointer(_, _) = *left_t { [INFO] [stderr] | ^^^^^^^^^^^^^ ^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to both the expression and the patterns [INFO] [stderr] --> src/type_checker_helper.rs:70:13 [INFO] [stderr] | [INFO] [stderr] 70 | / if let &Expression::Value(val) = &right.expr { [INFO] [stderr] 71 | | res = val == 0; [INFO] [stderr] 72 | | } [INFO] [stderr] | |_____________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 70 | if let Expression::Value(val) = right.expr { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: this boolean expression can be simplified [INFO] [stderr] --> src/type_checker_helper.rs:85:8 [INFO] [stderr] | [INFO] [stderr] 85 | if !left.typ.is_some() || !right.typ.is_some() { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `left.typ.is_none() || right.typ.is_none()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#nonminimal_bool [INFO] [stderr] [INFO] [stderr] warning: single-character string constant used as pattern [INFO] [stderr] --> src/scanner.rs:52:34 [INFO] [stderr] | [INFO] [stderr] 52 | if token.starts_with("\"") && token.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/scanner.rs:52:59 [INFO] [stderr] | [INFO] [stderr] 52 | if token.starts_with("\"") && token.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: single-character string constant used as pattern [INFO] [stderr] --> src/scanner.rs:58:34 [INFO] [stderr] | [INFO] [stderr] 58 | if token.starts_with("\'") && token.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: single-character string constant used as pattern [INFO] [stderr] --> src/scanner.rs:58:59 [INFO] [stderr] | [INFO] [stderr] 58 | if token.starts_with("\'") && token.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: use of `expect` followed by a function call [INFO] [stderr] --> src/x86_code_generator.rs:112:14 [INFO] [stderr] | [INFO] [stderr] 112 | .expect(&format!("Unkown variable {}", varname)); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|| panic!("Unkown variable {}", varname))` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#expect_fun_call [INFO] [stderr] [INFO] [stderr] warning: use of `expect` followed by a function call [INFO] [stderr] --> src/x86_code_generator.rs:123:14 [INFO] [stderr] | [INFO] [stderr] 123 | .expect(&format!("Unkown variable {}", varname)); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|| panic!("Unkown variable {}", varname))` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#expect_fun_call [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/x86_code_generator.rs:140:27 [INFO] [stderr] | [INFO] [stderr] 140 | let var = self.identifier_to_var.get(name).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&self.identifier_to_var[name]` [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 HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/x86_code_generator.rs:212:33 [INFO] [stderr] | [INFO] [stderr] 212 | let label = self.string_to_label.get(v).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&self.string_to_label[v]` [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: length comparison to zero [INFO] [stderr] --> src/scanner.rs:117:8 [INFO] [stderr] | [INFO] [stderr] 117 | if source.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `source.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/x86_code_generator.rs:347:17 [INFO] [stderr] | [INFO] [stderr] 347 | / if let &Some(ref else_statements) = else_block_opt { [INFO] [stderr] 348 | | self.instructions.push(Comment("The start of else block".to_string())); [INFO] [stderr] 349 | | self.evaluate_block(else_statements); [INFO] [stderr] 350 | | let label = format!("L{}", self.label_num); [INFO] [stderr] 351 | | self.label_num += 1; [INFO] [stderr] 352 | | self.instructions.push(Instruction::Label(label.to_string())); [INFO] [stderr] 353 | | } [INFO] [stderr] | |_________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 347 | if let Some(ref else_statements) = *else_block_opt { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ [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/struct_analyzer.rs:61:35 [INFO] [stderr] | [INFO] [stderr] 61 | structs: &Vec) -> bool { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: change this to: `&[StructDefinition]` [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 don't need to add `&` to all patterns [INFO] [stderr] --> src/x86_code_generator.rs:396:17 [INFO] [stderr] | [INFO] [stderr] 396 | / if let &Some(ref expr) = expr_opt { [INFO] [stderr] 397 | | let reg = self.evaluate_expression(expr); [INFO] [stderr] 398 | | self.move_value_to_var(reg, name); [INFO] [stderr] 399 | | } [INFO] [stderr] | |_________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 396 | if let Some(ref expr) = *expr_opt { [INFO] [stderr] | ^^^^^^^^^^^^^^ ^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: this argument is passed by reference, but would be more efficient if passed by value [INFO] [stderr] --> src/x86_code_generator.rs:438:31 [INFO] [stderr] | [INFO] [stderr] 438 | op: &BinaryOp, [INFO] [stderr] | ^^^^^^^^^ help: consider passing by value instead: `BinaryOp` [INFO] [stderr] | [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: called `.get().unwrap()` on a Vec. Using `[]` is more clear and more concise [INFO] [stderr] --> src/x86_code_generator.rs:557:43 [INFO] [stderr] | [INFO] [stderr] 557 | self.identifier_to_var.insert(fun.args.get(i).unwrap().clone(), var); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `fun.args[i]` [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: The function/method `instruction_list_to_asm` doesn't need a mutable reference [INFO] [stderr] --> src/x86_code_generator.rs:583:48 [INFO] [stderr] | [INFO] [stderr] 583 | code.push_str(&instruction_list_to_asm(&mut self.instructions)); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::unnecessary_mut_passed)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_mut_passed [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/main.rs:40:30 [INFO] [stderr] | [INFO] [stderr] 40 | fn write_code(complete_code: &String, path: &Path) { [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: redundant pattern matching, consider using `is_err()` [INFO] [stderr] --> src/main.rs:67:12 [INFO] [stderr] | [INFO] [stderr] 67 | if let Err(_) = result { [INFO] [stderr] | _____- ^^^^^^ [INFO] [stderr] 68 | | panic!("Error reading file {}", filename); [INFO] [stderr] 69 | | } [INFO] [stderr] | |_____- help: try this: `if result.is_err()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::redundant_pattern_matching)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_pattern_matching [INFO] [stderr] [INFO] [stderr] warning: this block may be rewritten with the `?` operator [INFO] [stderr] --> src/type_checker.rs:117:9 [INFO] [stderr] | [INFO] [stderr] 117 | / if fn_type_opt.is_none() { [INFO] [stderr] 118 | | self.errors_found.push(format!("Unkown function {}", [INFO] [stderr] 119 | | call.name)); [INFO] [stderr] 120 | | return None [INFO] [stderr] 121 | | } [INFO] [stderr] | |_________^ help: replace_it_with: `fn_type_opt?;` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::question_mark)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#question_mark [INFO] [stderr] [INFO] [stderr] warning: called `.get_mut().unwrap()` on a Vec. Using `[]` is more clear and more concise [INFO] [stderr] --> src/type_checker.rs:137:51 [INFO] [stderr] | [INFO] [stderr] 137 | let arg_type_opt = self.annotate_type(call.args_exprs.get_mut(i).unwrap()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `call.args_exprs[i]` [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: this block may be rewritten with the `?` operator [INFO] [stderr] --> src/type_checker.rs:138:13 [INFO] [stderr] | [INFO] [stderr] 138 | if arg_type_opt.is_none() { return None; } [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace_it_with: `arg_type_opt?;` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#question_mark [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a Vec. Using `[]` is more clear and more concise [INFO] [stderr] --> src/type_checker.rs:143:34 [INFO] [stderr] | [INFO] [stderr] 143 | let param_type = fn_type.arg_types.get(i).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `fn_type.arg_types[i]` [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/type_checker.rs:170:36 [INFO] [stderr] | [INFO] [stderr] 170 | op: &ast::BinaryOp, l: &mut AstExpressionNode, [INFO] [stderr] | ^^^^^^^^^^^^^^ help: consider passing by value instead: `ast::BinaryOp` [INFO] [stderr] | [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: this block may be rewritten with the `?` operator [INFO] [stderr] --> src/type_checker.rs:267:17 [INFO] [stderr] | [INFO] [stderr] 267 | / if expr_t.is_none() { [INFO] [stderr] 268 | | None [INFO] [stderr] 269 | | } else if let Some(VarType::Struct(ref struct_name)) = expr_t { [INFO] [stderr] 270 | | // return type of the field [INFO] [stderr] ... | [INFO] [stderr] 286 | | None [INFO] [stderr] 287 | | } [INFO] [stderr] | |_________________^ help: replace_it_with: `expr_t?;` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#question_mark [INFO] [stderr] [INFO] [stderr] warning: use of `expect` followed by a function call [INFO] [stderr] --> src/type_checker.rs:273:26 [INFO] [stderr] | [INFO] [stderr] 273 | .expect(&format!("Struct {} unkown!", struct_name)); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|| panic!("Struct {} unkown!", struct_name))` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::expect_fun_call)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#expect_fun_call [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/type_checker.rs:298:33 [INFO] [stderr] | [INFO] [stderr] 298 | let ret_type = &self.function_to_type [INFO] [stderr] | _________________________________^ [INFO] [stderr] 299 | | .get(&self.current_fn) [INFO] [stderr] 300 | | .unwrap() [INFO] [stderr] | |_____________________________^ help: try this: `&self.function_to_type[&self.current_fn]` [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: you don't need to add `&` to all patterns [INFO] [stderr] --> src/type_checker.rs:329:17 [INFO] [stderr] | [INFO] [stderr] 329 | / if let &mut Some(ref mut else_stmts) = else_opt { [INFO] [stderr] 330 | | // TODO: add else checker [INFO] [stderr] 331 | | self.annotate_types_block(else_stmts) && self.annotate_types_block(stmts) && expr_type.is_some() [INFO] [stderr] 332 | | } else { [INFO] [stderr] 333 | | self.annotate_types_block(stmts) && expr_type.is_some() [INFO] [stderr] 334 | | } [INFO] [stderr] | |_________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 329 | if let Some(ref mut else_stmts) = *else_opt { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: `if _ { .. } else { .. }` is an expression [INFO] [stderr] --> src/type_checker.rs:341:17 [INFO] [stderr] | [INFO] [stderr] 341 | / let mut res = true; [INFO] [stderr] 342 | | if !self.type_exists(var_type) { [INFO] [stderr] 343 | | self.errors_found.push(format!("Type {:?} doesn't exist.", [INFO] [stderr] 344 | | var_type)); [INFO] [stderr] 345 | | res = false; [INFO] [stderr] 346 | | } [INFO] [stderr] | |_________________^ help: it is more idiomatic to write: `let res = if !self.type_exists(var_type) { ..; false } else { true };` [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 don't need to add `&` to all patterns [INFO] [stderr] --> src/type_checker.rs:348:17 [INFO] [stderr] | [INFO] [stderr] 348 | / if let &mut Some(ref mut expr) = expr_opt { [INFO] [stderr] 349 | | self.annotate_type(expr); [INFO] [stderr] 350 | | [INFO] [stderr] 351 | | if !type_checker_helper::can_assign_expr_to_type(var_type, [INFO] [stderr] ... | [INFO] [stderr] 360 | | // There was no initialization expression, which is fine. [INFO] [stderr] 361 | | } [INFO] [stderr] | |_________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 348 | if let Some(ref mut expr) = *expr_opt { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^ ^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: equality checks against true are unnecessary [INFO] [stderr] --> src/type_checker.rs:363:20 [INFO] [stderr] | [INFO] [stderr] 363 | if res == true { [INFO] [stderr] | ^^^^^^^^^^^ help: try simplifying it as shown: `res` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::bool_comparison)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bool_comparison [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/type_checker.rs:409:40 [INFO] [stderr] | [INFO] [stderr] 409 | fn add_structs(&mut self, structs: &Vec) { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: change this to: `&[StructDefinition]` [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 don't need to add `&` to all patterns [INFO] [stderr] --> src/type_checker.rs:429:17 [INFO] [stderr] | [INFO] [stderr] 429 | / if let &Struct(_) = arg_type { [INFO] [stderr] 430 | | self.errors_found.push("Cannot pass structs yet".to_string()); [INFO] [stderr] 431 | | return false; [INFO] [stderr] 432 | | } [INFO] [stderr] | |_________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 429 | if let Struct(_) = *arg_type { [INFO] [stderr] | ^^^^^^^^^ ^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a Vec. Using `[]` is more clear and more concise [INFO] [stderr] --> src/type_checker.rs:445:46 [INFO] [stderr] | [INFO] [stderr] 445 | self.variable_to_type.insert(fun.args.get(i).unwrap().clone(), [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `fun.args[i]` [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/type_checker.rs:446:46 [INFO] [stderr] | [INFO] [stderr] 446 | fun.fn_type.arg_types.get(i).unwrap().clone()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `fun.fn_type.arg_types[i]` [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 boolean expression can be simplified [INFO] [stderr] --> src/type_checker_helper.rs:49:8 [INFO] [stderr] | [INFO] [stderr] 49 | if !right.typ.is_some() { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^ help: try: `right.typ.is_none()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::nonminimal_bool)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#nonminimal_bool [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/type_checker_helper.rs:53:5 [INFO] [stderr] | [INFO] [stderr] 53 | / if let &Struct(_) = left_t { [INFO] [stderr] 54 | | // Can't assign structs to one another [INFO] [stderr] 55 | | return false; [INFO] [stderr] 56 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 53 | if let Struct(_) = *left_t { [INFO] [stderr] | ^^^^^^^^^ ^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/type_checker_helper.rs:69:9 [INFO] [stderr] | [INFO] [stderr] 69 | / if let &Pointer(_, _) = left_t { [INFO] [stderr] 70 | | if let &Expression::Value(val) = &right.expr { [INFO] [stderr] 71 | | res = val == 0; [INFO] [stderr] 72 | | } [INFO] [stderr] 73 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 69 | if let Pointer(_, _) = *left_t { [INFO] [stderr] | ^^^^^^^^^^^^^ ^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to both the expression and the patterns [INFO] [stderr] --> src/type_checker_helper.rs:70:13 [INFO] [stderr] | [INFO] [stderr] 70 | / if let &Expression::Value(val) = &right.expr { [INFO] [stderr] 71 | | res = val == 0; [INFO] [stderr] 72 | | } [INFO] [stderr] | |_____________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 70 | if let Expression::Value(val) = right.expr { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: this boolean expression can be simplified [INFO] [stderr] --> src/type_checker_helper.rs:85:8 [INFO] [stderr] | [INFO] [stderr] 85 | if !left.typ.is_some() || !right.typ.is_some() { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `left.typ.is_none() || right.typ.is_none()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#nonminimal_bool [INFO] [stderr] [INFO] [stderr] warning: use of `expect` followed by a function call [INFO] [stderr] --> src/x86_code_generator.rs:112:14 [INFO] [stderr] | [INFO] [stderr] 112 | .expect(&format!("Unkown variable {}", varname)); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|| panic!("Unkown variable {}", varname))` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#expect_fun_call [INFO] [stderr] [INFO] [stderr] warning: use of `expect` followed by a function call [INFO] [stderr] --> src/x86_code_generator.rs:123:14 [INFO] [stderr] | [INFO] [stderr] 123 | .expect(&format!("Unkown variable {}", varname)); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|| panic!("Unkown variable {}", varname))` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#expect_fun_call [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/x86_code_generator.rs:140:27 [INFO] [stderr] | [INFO] [stderr] 140 | let var = self.identifier_to_var.get(name).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&self.identifier_to_var[name]` [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 HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/x86_code_generator.rs:212:33 [INFO] [stderr] | [INFO] [stderr] 212 | let label = self.string_to_label.get(v).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&self.string_to_label[v]` [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: you don't need to add `&` to all patterns [INFO] [stderr] --> src/x86_code_generator.rs:347:17 [INFO] [stderr] | [INFO] [stderr] 347 | / if let &Some(ref else_statements) = else_block_opt { [INFO] [stderr] 348 | | self.instructions.push(Comment("The start of else block".to_string())); [INFO] [stderr] 349 | | self.evaluate_block(else_statements); [INFO] [stderr] 350 | | let label = format!("L{}", self.label_num); [INFO] [stderr] 351 | | self.label_num += 1; [INFO] [stderr] 352 | | self.instructions.push(Instruction::Label(label.to_string())); [INFO] [stderr] 353 | | } [INFO] [stderr] | |_________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 347 | if let Some(ref else_statements) = *else_block_opt { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/x86_code_generator.rs:396:17 [INFO] [stderr] | [INFO] [stderr] 396 | / if let &Some(ref expr) = expr_opt { [INFO] [stderr] 397 | | let reg = self.evaluate_expression(expr); [INFO] [stderr] 398 | | self.move_value_to_var(reg, name); [INFO] [stderr] 399 | | } [INFO] [stderr] | |_________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 396 | if let Some(ref expr) = *expr_opt { [INFO] [stderr] | ^^^^^^^^^^^^^^ ^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: this argument is passed by reference, but would be more efficient if passed by value [INFO] [stderr] --> src/x86_code_generator.rs:438:31 [INFO] [stderr] | [INFO] [stderr] 438 | op: &BinaryOp, [INFO] [stderr] | ^^^^^^^^^ help: consider passing by value instead: `BinaryOp` [INFO] [stderr] | [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: called `.get().unwrap()` on a Vec. Using `[]` is more clear and more concise [INFO] [stderr] --> src/x86_code_generator.rs:557:43 [INFO] [stderr] | [INFO] [stderr] 557 | self.identifier_to_var.insert(fun.args.get(i).unwrap().clone(), var); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `fun.args[i]` [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: The function/method `instruction_list_to_asm` doesn't need a mutable reference [INFO] [stderr] --> src/x86_code_generator.rs:583:48 [INFO] [stderr] | [INFO] [stderr] 583 | code.push_str(&instruction_list_to_asm(&mut self.instructions)); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::unnecessary_mut_passed)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_mut_passed [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/main.rs:40:30 [INFO] [stderr] | [INFO] [stderr] 40 | fn write_code(complete_code: &String, path: &Path) { [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: redundant pattern matching, consider using `is_err()` [INFO] [stderr] --> src/main.rs:67:12 [INFO] [stderr] | [INFO] [stderr] 67 | if let Err(_) = result { [INFO] [stderr] | _____- ^^^^^^ [INFO] [stderr] 68 | | panic!("Error reading file {}", filename); [INFO] [stderr] 69 | | } [INFO] [stderr] | |_____- help: try this: `if result.is_err()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::redundant_pattern_matching)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_pattern_matching [INFO] [stderr] [INFO] [stderr] Finished dev [unoptimized + debuginfo] target(s) in 1.71s [INFO] running `"docker" "inspect" "e5393804b7aa56d1f79072394a4c0b3cf498bcf977620c8b66c7b2cc4e480d2d"` [INFO] running `"docker" "rm" "-f" "e5393804b7aa56d1f79072394a4c0b3cf498bcf977620c8b66c7b2cc4e480d2d"` [INFO] [stdout] e5393804b7aa56d1f79072394a4c0b3cf498bcf977620c8b66c7b2cc4e480d2d