This is actually bug 3148: https://github.com/mozilla/rust/issues/3148

You can use explicit type declarations as a workaround for the time being. Your rewrite also works in the same manner: it overcomes a shortcoming in the region inferencer. I hope we can fix this soon, it's not terribly difficult.





Niko

Steven Blenkinsop wrote:
Turns out the issue was borrowing from a reborrowed value. i.e. this doesn't work:

fn rereborrow(v: &r/int) -> &r/int {
&*&*v
}

I've filed an issue: https://github.com/mozilla/rust/issues/4285

Incidentally, I can make my original code work by eliminating the intermediate borrow:

struct T1 { value: int }
struct T2 { t1: option::Option<~T1> }

fn value(t2: &r/T2, def: &r/int) -> &r/int {
        match t2.t1 {
                Some(~T1{value: ref value}) => value,
                None => def
        }
}

fn main() {
        let t2 = ~T2{ t1: Some(~T1{ value: 5 }) };
        let def = ~0;
        io::println(fmt!("%d", *value(t2, def)));
}
_______________________________________________
Rust-dev mailing list
Rust-dev@mozilla.org
https://mail.mozilla.org/listinfo/rust-dev
_______________________________________________
Rust-dev mailing list
Rust-dev@mozilla.org
https://mail.mozilla.org/listinfo/rust-dev

Reply via email to