2012-07-31 10:27:51 -07:00
|
|
|
// A dummy trait/impl that work close over any type. The trait will
|
2012-07-18 11:01:54 -07:00
|
|
|
// be parameterized by a region due to the &self/int constraint.
|
|
|
|
|
2012-07-31 10:27:51 -07:00
|
|
|
trait foo {
|
2012-07-18 11:01:54 -07:00
|
|
|
fn foo(i: &self/int) -> int;
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<T:copy> of foo for T {
|
|
|
|
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() {
|
|
|
|
}
|