// xfail-test // xfail'd because to_foo() doesn't work. // Copyright 2012 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // // Licensed under the Apache License, Version 2.0 or the MIT license // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. // A dummy trait/impl that work close over any type. The trait will // be parameterized by a region due to the &'self int constraint. trait foo { fn foo(&self, i: &'self int) -> int; } impl foo for T { fn foo(&self, i: &'self int) -> int {*i} } fn to_foo(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; struct F { f: T } let x = @F {f:t} as @foo; assert!(x.foo(v) == 3); } fn to_foo_2(t: T) -> @foo { // Not OK---T may contain borrowed ptrs and it is going to escape // as part of the returned foo value struct F { f: T } @F {f:t} as @foo //~ ERROR value may contain borrowed pointers; use `'static` bound } fn to_foo_3(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 struct F { f: T } @F {f:t} as @foo } fn main() { }