Skip to content

Borrowck does not correctly do mutability checks on Trait objects #7464

@MarkJr94

Description

@MarkJr94

For a simple sample check this file: https://gist.github.com/MarkJr94/5888147

This is the Character trait:

pub trait Character {
    fn x(&self)-> int;
    fn y(&self)-> int;
    fn set_x(&mut self, int);
    fn set_y(&mut self, int);
    fn translate(&mut self, dx: int, dy: int);

    fn name(&self) -> ~str;
    fn new(x: int, y:int) -> Self;
    fn rest(&mut self);
    fn as_str(&self) -> ~str;

    fn hp(&self) -> uint;
    fn hp_mut<'r> (&'r mut self) -> &'r mut uint;
    fn stamina(&self) -> uint;
    fn attack(&mut self, player: &mut Character) -> uint;
}

The issue is specific to Trait objects. Changing player: &mut Character to a player: &mut Mummy works.

Moreover, there is a different issue, in that this problem is also solved by changing player: &mut Character to mut player: &mut Character which should not be necessary, as I do not reassign the player reference/pointer.

Minimal Example:

// traitfail.rs

trait Slide {
    fn new(x: int) -> Self;
    fn x_mut<'r> (&'r mut self) -> &'r mut int;
    fn x(&self) -> int;
}

struct Bead {
    x: int
}

impl Slide for Bead {
    pub fn new(x: int) -> Bead {
        Bead { x: x}
    }

    pub fn x(&self) -> int {
        self.x
    }

    pub fn x_mut<'r>(&'r mut self) -> &'r mut int {
        &'r mut self.x
    }
}

fn main() {
    let slide = &mut Slide::new::<Bead>(5) as &mut Slide;

    let x = slide.x();

    let x_mut = slide.x_mut();
    *x_mut += 2;
}
// Compiler output

traitfail.rs:30:13: 30:18 error: cannot borrow immutable local variable as mutable
traitfail.rs:30     let x_mut = slide.x_mut();
                                ^~~~~
error: aborting due to previous error

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions