[INFO] updating cached repository photz/toy-compiler [INFO] running `"git" "fetch" "--all"` [INFO] [stdout] Fetching origin [INFO] [stderr] From git://github.com/photz/toy-compiler [INFO] [stderr] * branch HEAD -> FETCH_HEAD [INFO] running `"git" "clone" "work/cache/sources/gh/photz/toy-compiler" "work/ex/clippy-test-run/sources/stable/gh/photz/toy-compiler"` [INFO] [stderr] Cloning into 'work/ex/clippy-test-run/sources/stable/gh/photz/toy-compiler'... [INFO] [stderr] done. [INFO] running `"git" "clone" "work/cache/sources/gh/photz/toy-compiler" "work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/photz/toy-compiler"` [INFO] [stderr] Cloning into 'work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/photz/toy-compiler'... [INFO] [stderr] done. [INFO] running `"git" "rev-parse" "HEAD"` [INFO] [stdout] 02c911b80a1658af4432b87a77ad3381dc2d7859 [INFO] sha for GitHub repo photz/toy-compiler: 02c911b80a1658af4432b87a77ad3381dc2d7859 [INFO] validating manifest of photz/toy-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 photz/toy-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 photz/toy-compiler [INFO] finished frobbing photz/toy-compiler [INFO] frobbed toml for photz/toy-compiler written to work/ex/clippy-test-run/sources/stable/gh/photz/toy-compiler/Cargo.toml [INFO] started frobbing photz/toy-compiler [INFO] finished frobbing photz/toy-compiler [INFO] frobbed toml for photz/toy-compiler written to work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/photz/toy-compiler/Cargo.toml [INFO] crate photz/toy-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 photz/toy-compiler against stable for clippy-test-run [INFO] running `"docker" "create" "-v" "/mnt/big/crater/work/local/target-dirs/clippy-test-run/worker-6/stable:/opt/crater/target:rw,Z" "-v" "/mnt/big/crater/work/ex/clippy-test-run/sources/stable/gh/photz/toy-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] 86d0abf4743bd293b54016d8bab7595b86fdb22641c95d60e9a2f0d11c32b4ac [INFO] running `"docker" "start" "-a" "86d0abf4743bd293b54016d8bab7595b86fdb22641c95d60e9a2f0d11c32b4ac"` [INFO] [stderr] Checking rust-compiler v0.1.0 (/opt/crater/workdir) [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/main.rs:132:3 [INFO] [stderr] | [INFO] [stderr] 132 | / match e { [INFO] [stderr] 133 | | &Expr::Integer(value) => { [INFO] [stderr] 134 | | (Data::Constant(value), vec![]) [INFO] [stderr] 135 | | }, [INFO] [stderr] ... | [INFO] [stderr] 204 | | } [INFO] [stderr] 205 | | } [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] 132 | match *e { [INFO] [stderr] 133 | Expr::Integer(value) => { [INFO] [stderr] 134 | (Data::Constant(value), vec![]) [INFO] [stderr] 135 | }, [INFO] [stderr] 136 | Expr::BinaryExpr(ref l, ref op, ref r) => { [INFO] [stderr] 137 | [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/main.rs:148:24 [INFO] [stderr] | [INFO] [stderr] 148 | let next_instr = match op { [INFO] [stderr] | ________________________^ [INFO] [stderr] 149 | | &Op::Add => [INFO] [stderr] 150 | | Instruction::Add { source: source_l.clone(), [INFO] [stderr] 151 | | dest: free_register.clone() }, [INFO] [stderr] ... | [INFO] [stderr] 157 | | _ => panic!("can only generate code for additions and multipl.") [INFO] [stderr] 158 | | }; [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] 148 | let next_instr = match *op { [INFO] [stderr] 149 | Op::Add => [INFO] [stderr] 150 | Instruction::Add { source: source_l.clone(), [INFO] [stderr] 151 | dest: free_register.clone() }, [INFO] [stderr] 152 | [INFO] [stderr] 153 | Op::Mul => [INFO] [stderr] | [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/main.rs:160:7 [INFO] [stderr] | [INFO] [stderr] 160 | / match source_l { [INFO] [stderr] 161 | | Data::Loc(Location::Register(n)) => { [INFO] [stderr] 162 | | loc_manager.free(Location::Register(n)); [INFO] [stderr] 163 | | }, [INFO] [stderr] 164 | | _ => {} [INFO] [stderr] 165 | | } [INFO] [stderr] | |_______^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::single_match)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 160 | if let Data::Loc(Location::Register(n)) = source_l { [INFO] [stderr] 161 | loc_manager.free(Location::Register(n)); [INFO] [stderr] 162 | } [INFO] [stderr] | [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/main.rs:167:7 [INFO] [stderr] | [INFO] [stderr] 167 | / match source_r { [INFO] [stderr] 168 | | Data::Loc(Location::Register(n)) => { [INFO] [stderr] 169 | | loc_manager.free(Location::Register(n)); [INFO] [stderr] 170 | | }, [INFO] [stderr] 171 | | _ => {} [INFO] [stderr] 172 | | } [INFO] [stderr] | |_______^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 167 | if let Data::Loc(Location::Register(n)) = source_r { [INFO] [stderr] 168 | loc_manager.free(Location::Register(n)); [INFO] [stderr] 169 | } [INFO] [stderr] | [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/main.rs:176:7 [INFO] [stderr] | [INFO] [stderr] 176 | / match op { [INFO] [stderr] 177 | | &Op::Mul => { [INFO] [stderr] 178 | | let backup_eax = Instruction::Move { [INFO] [stderr] 179 | | source: Data::Loc(Location::Register(0)), [INFO] [stderr] ... | [INFO] [stderr] 185 | | _ => {} [INFO] [stderr] 186 | | } [INFO] [stderr] | |_______^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 176 | if let &Op::Mul = op { [INFO] [stderr] 177 | let backup_eax = Instruction::Move { [INFO] [stderr] 178 | source: Data::Loc(Location::Register(0)), [INFO] [stderr] 179 | dest: free_register.clone() [INFO] [stderr] 180 | }; [INFO] [stderr] 181 | [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/main.rs:176:7 [INFO] [stderr] | [INFO] [stderr] 176 | / match op { [INFO] [stderr] 177 | | &Op::Mul => { [INFO] [stderr] 178 | | let backup_eax = Instruction::Move { [INFO] [stderr] 179 | | source: Data::Loc(Location::Register(0)), [INFO] [stderr] ... | [INFO] [stderr] 185 | | _ => {} [INFO] [stderr] 186 | | } [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] 176 | match *op { [INFO] [stderr] 177 | Op::Mul => { [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/main.rs:208:25 [INFO] [stderr] | [INFO] [stderr] 208 | fn generate(statements: &Vec) { [INFO] [stderr] | ^^^^^^^^^^^^^^^ help: change this to: `&[Statement]` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::ptr_arg)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/main.rs:222:5 [INFO] [stderr] | [INFO] [stderr] 222 | / match statement { [INFO] [stderr] 223 | | &Statement::Assignment(ref id, ref expr) => { [INFO] [stderr] 224 | | [INFO] [stderr] 225 | | match table.lookup(id) { [INFO] [stderr] ... | [INFO] [stderr] 266 | | } [INFO] [stderr] 267 | | } [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] 222 | match *statement { [INFO] [stderr] 223 | Statement::Assignment(ref id, ref expr) => { [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: manual implementation of an assign operation [INFO] [stderr] --> src/main.rs:236:13 [INFO] [stderr] | [INFO] [stderr] 236 | stack_index = stack_index + 1; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `stack_index += 1` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::assign_op_pattern)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#assign_op_pattern [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/main.rs:273:33 [INFO] [stderr] | [INFO] [stderr] 273 | fn program_to_gas(instructions: &Vec, out: String) { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^ help: change this to: `&[Instruction]` [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] error: handle written amount returned or use `Write::write_all` instead [INFO] [stderr] --> src/main.rs:279:3 [INFO] [stderr] | [INFO] [stderr] 279 | file.write(b".global _start\n").unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[deny(clippy::unused_io_amount)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unused_io_amount [INFO] [stderr] [INFO] [stderr] error: handle written amount returned or use `Write::write_all` instead [INFO] [stderr] --> src/main.rs:280:3 [INFO] [stderr] | [INFO] [stderr] 280 | file.write(b".text\n").unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unused_io_amount [INFO] [stderr] [INFO] [stderr] error: handle written amount returned or use `Write::write_all` instead [INFO] [stderr] --> src/main.rs:281:3 [INFO] [stderr] | [INFO] [stderr] 281 | file.write(b"_start:\n").unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unused_io_amount [INFO] [stderr] [INFO] [stderr] error: handle written amount returned or use `Write::write_all` instead [INFO] [stderr] --> src/main.rs:287:5 [INFO] [stderr] | [INFO] [stderr] 287 | file.write(as_str.as_bytes()).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unused_io_amount [INFO] [stderr] [INFO] [stderr] error: handle written amount returned or use `Write::write_all` instead [INFO] [stderr] --> src/main.rs:288:5 [INFO] [stderr] | [INFO] [stderr] 288 | file.write(b"\n").unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unused_io_amount [INFO] [stderr] [INFO] [stderr] error: handle written amount returned or use `Write::write_all` instead [INFO] [stderr] --> src/main.rs:291:3 [INFO] [stderr] | [INFO] [stderr] 291 | file.write(b"ret\n").unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unused_io_amount [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/main.rs:296:3 [INFO] [stderr] | [INFO] [stderr] 296 | / match reg { [INFO] [stderr] 297 | | &Location::Register(n) => { [INFO] [stderr] 298 | | match n { [INFO] [stderr] 299 | | 0 => "%rbx".to_string(), [INFO] [stderr] ... | [INFO] [stderr] 313 | | } [INFO] [stderr] 314 | | } [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] 296 | match *reg { [INFO] [stderr] 297 | Location::Register(n) => { [INFO] [stderr] 298 | match n { [INFO] [stderr] 299 | 0 => "%rbx".to_string(), [INFO] [stderr] 300 | 1 => "%rcx".to_string(), [INFO] [stderr] 301 | 2 => "%rdx".to_string(), [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/main.rs:318:3 [INFO] [stderr] | [INFO] [stderr] 318 | / match data { [INFO] [stderr] 319 | | &Data::Loc(ref l) => { [INFO] [stderr] 320 | | reg_to_gas(&l) [INFO] [stderr] 321 | | }, [INFO] [stderr] ... | [INFO] [stderr] 326 | | } [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_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 318 | match *data { [INFO] [stderr] 319 | Data::Loc(ref l) => { [INFO] [stderr] 320 | reg_to_gas(&l) [INFO] [stderr] 321 | }, [INFO] [stderr] 322 | Data::Constant(n) => { [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/main.rs:331:3 [INFO] [stderr] | [INFO] [stderr] 331 | / match instruction { [INFO] [stderr] 332 | | &Instruction::Add { ref source, ref dest } => { [INFO] [stderr] 333 | | let mut s = "addq ".to_string(); [INFO] [stderr] 334 | | s.push_str(&data_to_gas(source)); [INFO] [stderr] ... | [INFO] [stderr] 357 | | } [INFO] [stderr] 358 | | } [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] 331 | match *instruction { [INFO] [stderr] 332 | Instruction::Add { ref source, ref dest } => { [INFO] [stderr] 333 | let mut s = "addq ".to_string(); [INFO] [stderr] 334 | s.push_str(&data_to_gas(source)); [INFO] [stderr] 335 | s.push_str(", "); [INFO] [stderr] 336 | s.push_str(®_to_gas(dest)); [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: this loop could be written as a `while let` loop [INFO] [stderr] --> src/main.rs:388:5 [INFO] [stderr] | [INFO] [stderr] 388 | / loop { [INFO] [stderr] 389 | | match it.peek() { [INFO] [stderr] 390 | | Some(&ch) => match ch { [INFO] [stderr] 391 | | '0' ... '9' => { [INFO] [stderr] ... | [INFO] [stderr] 448 | | } [INFO] [stderr] 449 | | } [INFO] [stderr] | |_____^ help: try: `while let Some(&ch) = it.peek() { .. }` [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: you don't need to add `&` to all patterns [INFO] [stderr] --> src/main.rs:471:3 [INFO] [stderr] | [INFO] [stderr] 471 | / match it.next().unwrap() { [INFO] [stderr] 472 | | &Token::Identifier { ref name } => Expr::Identifier(name.to_string()), [INFO] [stderr] 473 | | &Token::Number { value } => Expr::Integer(value), [INFO] [stderr] 474 | | &Token::LeftParenthesis => { [INFO] [stderr] ... | [INFO] [stderr] 488 | | _ => panic!("unexpected token") [INFO] [stderr] 489 | | } [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] 471 | match *it.next().unwrap() { [INFO] [stderr] 472 | Token::Identifier { ref name } => Expr::Identifier(name.to_string()), [INFO] [stderr] 473 | Token::Number { value } => Expr::Integer(value), [INFO] [stderr] 474 | Token::LeftParenthesis => { [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/main.rs:480:7 [INFO] [stderr] | [INFO] [stderr] 480 | / match next { [INFO] [stderr] 481 | | &Token::RightParenthesis => {}, [INFO] [stderr] 482 | | _ => panic!("unexpecting a )") [INFO] [stderr] 483 | | } [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] 480 | match *next { [INFO] [stderr] 481 | Token::RightParenthesis => {}, [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] error: using `clone` on a double-reference; this will copy the reference instead of cloning the inner type [INFO] [stderr] --> src/main.rs:500:16 [INFO] [stderr] | [INFO] [stderr] 500 | let next = it.peek().unwrap().clone(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[deny(clippy::clone_double_ref)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_double_ref [INFO] [stderr] help: try dereferencing it [INFO] [stderr] | [INFO] [stderr] 500 | let next = &(*it.peek().unwrap()).clone(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] help: or try being explicit about what type to clone [INFO] [stderr] | [INFO] [stderr] 500 | let next = &Token::clone(it.peek().unwrap()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/main.rs:502:5 [INFO] [stderr] | [INFO] [stderr] 502 | / match next { [INFO] [stderr] 503 | | &Token::Div => { [INFO] [stderr] 504 | | it.next(); [INFO] [stderr] 505 | | [INFO] [stderr] ... | [INFO] [stderr] 522 | | _ => break [INFO] [stderr] 523 | | } [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] 502 | match *next { [INFO] [stderr] 503 | Token::Div => { [INFO] [stderr] 504 | it.next(); [INFO] [stderr] 505 | [INFO] [stderr] 506 | let more = parse_factor(it); [INFO] [stderr] 507 | [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] error: using `clone` on a double-reference; this will copy the reference instead of cloning the inner type [INFO] [stderr] --> src/main.rs:537:16 [INFO] [stderr] | [INFO] [stderr] 537 | let next = it.peek().unwrap().clone(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_double_ref [INFO] [stderr] help: try dereferencing it [INFO] [stderr] | [INFO] [stderr] 537 | let next = &(*it.peek().unwrap()).clone(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] help: or try being explicit about what type to clone [INFO] [stderr] | [INFO] [stderr] 537 | let next = &Token::clone(it.peek().unwrap()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/main.rs:539:5 [INFO] [stderr] | [INFO] [stderr] 539 | / match next { [INFO] [stderr] 540 | | &Token::Add => { [INFO] [stderr] 541 | | it.next(); [INFO] [stderr] 542 | | [INFO] [stderr] ... | [INFO] [stderr] 549 | | _ => break [INFO] [stderr] 550 | | } [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] 539 | match *next { [INFO] [stderr] 540 | Token::Add => { [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/main.rs:567:22 [INFO] [stderr] | [INFO] [stderr] 567 | let identifier = match next { [INFO] [stderr] | ______________________^ [INFO] [stderr] 568 | | [INFO] [stderr] 569 | | &Token::Identifier { ref name } => { [INFO] [stderr] 570 | | name [INFO] [stderr] ... | [INFO] [stderr] 574 | | [INFO] [stderr] 575 | | }; [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] 567 | let identifier = match *next { [INFO] [stderr] 568 | [INFO] [stderr] 569 | Token::Identifier { ref name } => { [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/main.rs:579:5 [INFO] [stderr] | [INFO] [stderr] 579 | / match next { [INFO] [stderr] 580 | | &Token::Assignment => {}, [INFO] [stderr] 581 | | _ => panic!("expected a =") [INFO] [stderr] 582 | | } [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] 579 | match *next { [INFO] [stderr] 580 | Token::Assignment => {}, [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/main.rs:588:5 [INFO] [stderr] | [INFO] [stderr] 588 | / match next { [INFO] [stderr] 589 | | &Token::Semi => { [INFO] [stderr] 590 | | let statement = Statement::Assignment(identifier.to_string(), expr); [INFO] [stderr] 591 | | [INFO] [stderr] ... | [INFO] [stderr] 594 | | _ => panic!("expected a semicolon") [INFO] [stderr] 595 | | } [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] 588 | match *next { [INFO] [stderr] 589 | Token::Semi => { [INFO] [stderr] | [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/main.rs:597:5 [INFO] [stderr] | [INFO] [stderr] 597 | / match it.peek() { [INFO] [stderr] 598 | | None => break, [INFO] [stderr] 599 | | _ => {} [INFO] [stderr] 600 | | } [INFO] [stderr] | |_____^ help: try this: `if let None = it.peek() { break }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] [INFO] [stderr] error: aborting due to 8 previous errors [INFO] [stderr] [INFO] [stderr] error: Could not compile `rust-compiler`. [INFO] [stderr] warning: build failed, waiting for other jobs to finish... [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/main.rs:132:3 [INFO] [stderr] | [INFO] [stderr] 132 | / match e { [INFO] [stderr] 133 | | &Expr::Integer(value) => { [INFO] [stderr] 134 | | (Data::Constant(value), vec![]) [INFO] [stderr] 135 | | }, [INFO] [stderr] ... | [INFO] [stderr] 204 | | } [INFO] [stderr] 205 | | } [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] 132 | match *e { [INFO] [stderr] 133 | Expr::Integer(value) => { [INFO] [stderr] 134 | (Data::Constant(value), vec![]) [INFO] [stderr] 135 | }, [INFO] [stderr] 136 | Expr::BinaryExpr(ref l, ref op, ref r) => { [INFO] [stderr] 137 | [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/main.rs:148:24 [INFO] [stderr] | [INFO] [stderr] 148 | let next_instr = match op { [INFO] [stderr] | ________________________^ [INFO] [stderr] 149 | | &Op::Add => [INFO] [stderr] 150 | | Instruction::Add { source: source_l.clone(), [INFO] [stderr] 151 | | dest: free_register.clone() }, [INFO] [stderr] ... | [INFO] [stderr] 157 | | _ => panic!("can only generate code for additions and multipl.") [INFO] [stderr] 158 | | }; [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] 148 | let next_instr = match *op { [INFO] [stderr] 149 | Op::Add => [INFO] [stderr] 150 | Instruction::Add { source: source_l.clone(), [INFO] [stderr] 151 | dest: free_register.clone() }, [INFO] [stderr] 152 | [INFO] [stderr] 153 | Op::Mul => [INFO] [stderr] | [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/main.rs:160:7 [INFO] [stderr] | [INFO] [stderr] 160 | / match source_l { [INFO] [stderr] 161 | | Data::Loc(Location::Register(n)) => { [INFO] [stderr] 162 | | loc_manager.free(Location::Register(n)); [INFO] [stderr] 163 | | }, [INFO] [stderr] 164 | | _ => {} [INFO] [stderr] 165 | | } [INFO] [stderr] | |_______^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::single_match)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 160 | if let Data::Loc(Location::Register(n)) = source_l { [INFO] [stderr] 161 | loc_manager.free(Location::Register(n)); [INFO] [stderr] 162 | } [INFO] [stderr] | [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/main.rs:167:7 [INFO] [stderr] | [INFO] [stderr] 167 | / match source_r { [INFO] [stderr] 168 | | Data::Loc(Location::Register(n)) => { [INFO] [stderr] 169 | | loc_manager.free(Location::Register(n)); [INFO] [stderr] 170 | | }, [INFO] [stderr] 171 | | _ => {} [INFO] [stderr] 172 | | } [INFO] [stderr] | |_______^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 167 | if let Data::Loc(Location::Register(n)) = source_r { [INFO] [stderr] 168 | loc_manager.free(Location::Register(n)); [INFO] [stderr] 169 | } [INFO] [stderr] | [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/main.rs:176:7 [INFO] [stderr] | [INFO] [stderr] 176 | / match op { [INFO] [stderr] 177 | | &Op::Mul => { [INFO] [stderr] 178 | | let backup_eax = Instruction::Move { [INFO] [stderr] 179 | | source: Data::Loc(Location::Register(0)), [INFO] [stderr] ... | [INFO] [stderr] 185 | | _ => {} [INFO] [stderr] 186 | | } [INFO] [stderr] | |_______^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 176 | if let &Op::Mul = op { [INFO] [stderr] 177 | let backup_eax = Instruction::Move { [INFO] [stderr] 178 | source: Data::Loc(Location::Register(0)), [INFO] [stderr] 179 | dest: free_register.clone() [INFO] [stderr] 180 | }; [INFO] [stderr] 181 | [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/main.rs:176:7 [INFO] [stderr] | [INFO] [stderr] 176 | / match op { [INFO] [stderr] 177 | | &Op::Mul => { [INFO] [stderr] 178 | | let backup_eax = Instruction::Move { [INFO] [stderr] 179 | | source: Data::Loc(Location::Register(0)), [INFO] [stderr] ... | [INFO] [stderr] 185 | | _ => {} [INFO] [stderr] 186 | | } [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] 176 | match *op { [INFO] [stderr] 177 | Op::Mul => { [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/main.rs:208:25 [INFO] [stderr] | [INFO] [stderr] 208 | fn generate(statements: &Vec) { [INFO] [stderr] | ^^^^^^^^^^^^^^^ help: change this to: `&[Statement]` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::ptr_arg)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/main.rs:222:5 [INFO] [stderr] | [INFO] [stderr] 222 | / match statement { [INFO] [stderr] 223 | | &Statement::Assignment(ref id, ref expr) => { [INFO] [stderr] 224 | | [INFO] [stderr] 225 | | match table.lookup(id) { [INFO] [stderr] ... | [INFO] [stderr] 266 | | } [INFO] [stderr] 267 | | } [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] 222 | match *statement { [INFO] [stderr] 223 | Statement::Assignment(ref id, ref expr) => { [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: manual implementation of an assign operation [INFO] [stderr] --> src/main.rs:236:13 [INFO] [stderr] | [INFO] [stderr] 236 | stack_index = stack_index + 1; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `stack_index += 1` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::assign_op_pattern)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#assign_op_pattern [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/main.rs:273:33 [INFO] [stderr] | [INFO] [stderr] 273 | fn program_to_gas(instructions: &Vec, out: String) { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^ help: change this to: `&[Instruction]` [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] error: handle written amount returned or use `Write::write_all` instead [INFO] [stderr] --> src/main.rs:279:3 [INFO] [stderr] | [INFO] [stderr] 279 | file.write(b".global _start\n").unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[deny(clippy::unused_io_amount)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unused_io_amount [INFO] [stderr] [INFO] [stderr] error: handle written amount returned or use `Write::write_all` instead [INFO] [stderr] --> src/main.rs:280:3 [INFO] [stderr] | [INFO] [stderr] 280 | file.write(b".text\n").unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unused_io_amount [INFO] [stderr] [INFO] [stderr] error: handle written amount returned or use `Write::write_all` instead [INFO] [stderr] --> src/main.rs:281:3 [INFO] [stderr] | [INFO] [stderr] 281 | file.write(b"_start:\n").unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unused_io_amount [INFO] [stderr] [INFO] [stderr] error: handle written amount returned or use `Write::write_all` instead [INFO] [stderr] --> src/main.rs:287:5 [INFO] [stderr] | [INFO] [stderr] 287 | file.write(as_str.as_bytes()).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unused_io_amount [INFO] [stderr] [INFO] [stderr] error: handle written amount returned or use `Write::write_all` instead [INFO] [stderr] --> src/main.rs:288:5 [INFO] [stderr] | [INFO] [stderr] 288 | file.write(b"\n").unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unused_io_amount [INFO] [stderr] [INFO] [stderr] error: handle written amount returned or use `Write::write_all` instead [INFO] [stderr] --> src/main.rs:291:3 [INFO] [stderr] | [INFO] [stderr] 291 | file.write(b"ret\n").unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unused_io_amount [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/main.rs:296:3 [INFO] [stderr] | [INFO] [stderr] 296 | / match reg { [INFO] [stderr] 297 | | &Location::Register(n) => { [INFO] [stderr] 298 | | match n { [INFO] [stderr] 299 | | 0 => "%rbx".to_string(), [INFO] [stderr] ... | [INFO] [stderr] 313 | | } [INFO] [stderr] 314 | | } [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] 296 | match *reg { [INFO] [stderr] 297 | Location::Register(n) => { [INFO] [stderr] 298 | match n { [INFO] [stderr] 299 | 0 => "%rbx".to_string(), [INFO] [stderr] 300 | 1 => "%rcx".to_string(), [INFO] [stderr] 301 | 2 => "%rdx".to_string(), [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/main.rs:318:3 [INFO] [stderr] | [INFO] [stderr] 318 | / match data { [INFO] [stderr] 319 | | &Data::Loc(ref l) => { [INFO] [stderr] 320 | | reg_to_gas(&l) [INFO] [stderr] 321 | | }, [INFO] [stderr] ... | [INFO] [stderr] 326 | | } [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_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 318 | match *data { [INFO] [stderr] 319 | Data::Loc(ref l) => { [INFO] [stderr] 320 | reg_to_gas(&l) [INFO] [stderr] 321 | }, [INFO] [stderr] 322 | Data::Constant(n) => { [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/main.rs:331:3 [INFO] [stderr] | [INFO] [stderr] 331 | / match instruction { [INFO] [stderr] 332 | | &Instruction::Add { ref source, ref dest } => { [INFO] [stderr] 333 | | let mut s = "addq ".to_string(); [INFO] [stderr] 334 | | s.push_str(&data_to_gas(source)); [INFO] [stderr] ... | [INFO] [stderr] 357 | | } [INFO] [stderr] 358 | | } [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] 331 | match *instruction { [INFO] [stderr] 332 | Instruction::Add { ref source, ref dest } => { [INFO] [stderr] 333 | let mut s = "addq ".to_string(); [INFO] [stderr] 334 | s.push_str(&data_to_gas(source)); [INFO] [stderr] 335 | s.push_str(", "); [INFO] [stderr] 336 | s.push_str(®_to_gas(dest)); [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: this loop could be written as a `while let` loop [INFO] [stderr] --> src/main.rs:388:5 [INFO] [stderr] | [INFO] [stderr] 388 | / loop { [INFO] [stderr] 389 | | match it.peek() { [INFO] [stderr] 390 | | Some(&ch) => match ch { [INFO] [stderr] 391 | | '0' ... '9' => { [INFO] [stderr] ... | [INFO] [stderr] 448 | | } [INFO] [stderr] 449 | | } [INFO] [stderr] | |_____^ help: try: `while let Some(&ch) = it.peek() { .. }` [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: you don't need to add `&` to all patterns [INFO] [stderr] --> src/main.rs:471:3 [INFO] [stderr] | [INFO] [stderr] 471 | / match it.next().unwrap() { [INFO] [stderr] 472 | | &Token::Identifier { ref name } => Expr::Identifier(name.to_string()), [INFO] [stderr] 473 | | &Token::Number { value } => Expr::Integer(value), [INFO] [stderr] 474 | | &Token::LeftParenthesis => { [INFO] [stderr] ... | [INFO] [stderr] 488 | | _ => panic!("unexpected token") [INFO] [stderr] 489 | | } [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] 471 | match *it.next().unwrap() { [INFO] [stderr] 472 | Token::Identifier { ref name } => Expr::Identifier(name.to_string()), [INFO] [stderr] 473 | Token::Number { value } => Expr::Integer(value), [INFO] [stderr] 474 | Token::LeftParenthesis => { [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/main.rs:480:7 [INFO] [stderr] | [INFO] [stderr] 480 | / match next { [INFO] [stderr] 481 | | &Token::RightParenthesis => {}, [INFO] [stderr] 482 | | _ => panic!("unexpecting a )") [INFO] [stderr] 483 | | } [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] 480 | match *next { [INFO] [stderr] 481 | Token::RightParenthesis => {}, [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] error: using `clone` on a double-reference; this will copy the reference instead of cloning the inner type [INFO] [stderr] --> src/main.rs:500:16 [INFO] [stderr] | [INFO] [stderr] 500 | let next = it.peek().unwrap().clone(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[deny(clippy::clone_double_ref)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_double_ref [INFO] [stderr] help: try dereferencing it [INFO] [stderr] | [INFO] [stderr] 500 | let next = &(*it.peek().unwrap()).clone(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] help: or try being explicit about what type to clone [INFO] [stderr] | [INFO] [stderr] 500 | let next = &Token::clone(it.peek().unwrap()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/main.rs:502:5 [INFO] [stderr] | [INFO] [stderr] 502 | / match next { [INFO] [stderr] 503 | | &Token::Div => { [INFO] [stderr] 504 | | it.next(); [INFO] [stderr] 505 | | [INFO] [stderr] ... | [INFO] [stderr] 522 | | _ => break [INFO] [stderr] 523 | | } [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] 502 | match *next { [INFO] [stderr] 503 | Token::Div => { [INFO] [stderr] 504 | it.next(); [INFO] [stderr] 505 | [INFO] [stderr] 506 | let more = parse_factor(it); [INFO] [stderr] 507 | [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] error: using `clone` on a double-reference; this will copy the reference instead of cloning the inner type [INFO] [stderr] --> src/main.rs:537:16 [INFO] [stderr] | [INFO] [stderr] 537 | let next = it.peek().unwrap().clone(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_double_ref [INFO] [stderr] help: try dereferencing it [INFO] [stderr] | [INFO] [stderr] 537 | let next = &(*it.peek().unwrap()).clone(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] help: or try being explicit about what type to clone [INFO] [stderr] | [INFO] [stderr] 537 | let next = &Token::clone(it.peek().unwrap()); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/main.rs:539:5 [INFO] [stderr] | [INFO] [stderr] 539 | / match next { [INFO] [stderr] 540 | | &Token::Add => { [INFO] [stderr] 541 | | it.next(); [INFO] [stderr] 542 | | [INFO] [stderr] ... | [INFO] [stderr] 549 | | _ => break [INFO] [stderr] 550 | | } [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] 539 | match *next { [INFO] [stderr] 540 | Token::Add => { [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/main.rs:567:22 [INFO] [stderr] | [INFO] [stderr] 567 | let identifier = match next { [INFO] [stderr] | ______________________^ [INFO] [stderr] 568 | | [INFO] [stderr] 569 | | &Token::Identifier { ref name } => { [INFO] [stderr] 570 | | name [INFO] [stderr] ... | [INFO] [stderr] 574 | | [INFO] [stderr] 575 | | }; [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] 567 | let identifier = match *next { [INFO] [stderr] 568 | [INFO] [stderr] 569 | Token::Identifier { ref name } => { [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/main.rs:579:5 [INFO] [stderr] | [INFO] [stderr] 579 | / match next { [INFO] [stderr] 580 | | &Token::Assignment => {}, [INFO] [stderr] 581 | | _ => panic!("expected a =") [INFO] [stderr] 582 | | } [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] 579 | match *next { [INFO] [stderr] 580 | Token::Assignment => {}, [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/main.rs:588:5 [INFO] [stderr] | [INFO] [stderr] 588 | / match next { [INFO] [stderr] 589 | | &Token::Semi => { [INFO] [stderr] 590 | | let statement = Statement::Assignment(identifier.to_string(), expr); [INFO] [stderr] 591 | | [INFO] [stderr] ... | [INFO] [stderr] 594 | | _ => panic!("expected a semicolon") [INFO] [stderr] 595 | | } [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] 588 | match *next { [INFO] [stderr] 589 | Token::Semi => { [INFO] [stderr] | [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/main.rs:597:5 [INFO] [stderr] | [INFO] [stderr] 597 | / match it.peek() { [INFO] [stderr] 598 | | None => break, [INFO] [stderr] 599 | | _ => {} [INFO] [stderr] 600 | | } [INFO] [stderr] | |_____^ help: try this: `if let None = it.peek() { break }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] [INFO] [stderr] error: aborting due to 8 previous errors [INFO] [stderr] [INFO] [stderr] error: Could not compile `rust-compiler`. [INFO] [stderr] [INFO] [stderr] To learn more, run the command again with --verbose. [INFO] running `"docker" "inspect" "86d0abf4743bd293b54016d8bab7595b86fdb22641c95d60e9a2f0d11c32b4ac"` [INFO] running `"docker" "rm" "-f" "86d0abf4743bd293b54016d8bab7595b86fdb22641c95d60e9a2f0d11c32b4ac"` [INFO] [stdout] 86d0abf4743bd293b54016d8bab7595b86fdb22641c95d60e9a2f0d11c32b4ac