2012-07-31 12:27:51 -05:00
|
|
|
// A dummy trait/impl that work close over any type. The trait will
|
2012-07-18 13:01:54 -05:00
|
|
|
// be parameterized by a region due to the &self/int constraint.
|
|
|
|
|
2012-07-31 12:27:51 -05:00
|
|
|
trait foo {
|
2012-07-18 13:01:54 -05:00
|
|
|
fn foo(i: &self/int) -> int;
|
|
|
|
}
|
|
|
|
|
2012-08-07 20:10:06 -05:00
|
|
|
impl<T:copy> T: foo {
|
2012-07-18 13:01:54 -05:00
|
|
|
fn foo(i: &self/int) -> int {*i}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn to_foo<T:copy>(t: T) {
|
|
|
|
// This version is ok because, although T may contain borrowed
|
|
|
|
// pointers, it never escapes the fn body. We know this because
|
|
|
|
// the type of foo includes a region which will be resolved to
|
|
|
|
// the fn body itself.
|
|
|
|
let v = &3;
|
|
|
|
let x = {f:t} as foo;
|
|
|
|
assert x.foo(v) == 3;
|
|
|
|
}
|
|
|
|
|
|
|
|
fn to_foo_2<T:copy>(t: T) -> foo {
|
|
|
|
// Not OK---T may contain borrowed ptrs and it is going to escape
|
|
|
|
// as part of the returned foo value
|
|
|
|
{f:t} as foo //~ ERROR value may contain borrowed pointers; use `owned` bound
|
|
|
|
}
|
|
|
|
|
|
|
|
fn to_foo_3<T:copy owned>(t: T) -> foo {
|
|
|
|
// OK---T may escape as part of the returned foo value, but it is
|
|
|
|
// owned and hence does not contain borrowed ptrs
|
|
|
|
{f:t} as foo
|
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
}
|