Skip to content

Missing Clone implementation leads to mysterious errors down the line #91532

Closed
@jimblandy

Description

@jimblandy

Given the following code: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=0fc37a6dfe3b8c2232f2b4eb2ab8615c

struct Board;

fn do_part1(boards: &Vec<Board>) {
    let mut boards = boards.clone();
    boards[0] = Board;
}

The current output is:

warning: variable does not need to be mutable
 --> src/lib.rs:4:9
  |
4 |     let mut boards = boards.clone();
  |         ----^^^^^^
  |         |
  |         help: remove this `mut`
  |
  = note: `#[warn(unused_mut)]` on by default

error[E0596]: cannot borrow `*boards` as mutable, as it is behind a `&` reference
 --> src/lib.rs:5:5
  |
4 |     let mut boards = boards.clone();
  |         ---------- help: consider changing this to be a mutable reference: `&mut Vec<Board>`
5 |     boards[0] = Board;
  |     ^^^^^^ `boards` is a `&` reference, so the data it refers to cannot be borrowed as mutable

For more information about this error, try `rustc --explain E0596`.

The actual problem here is a missing Clone implementation for Board. Its absence causes Rust to choose the Clone implementation on shared references, so the type of boards here is actually &Vec<Board>; this can be verified by adding an explicit type annotation to the let-bound boards.

The help is not helpful.

It would be much nicer if Rust could somehow point out the missing Clone implementation. Perhaps it should be suspicious of missing mutability and a uselessly cloned shared reference?

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-diagnosticsArea: Messages for errors, warnings, and lintsT-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions