2012-12-10 19:32:48 -06:00
|
|
|
// 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 <LICENSE-APACHE or
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
|
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
|
|
// option. This file may not be copied, modified, or distributed
|
|
|
|
// except according to those terms.
|
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2013-02-14 13:47:00 -06:00
|
|
|
impl<T:Copy> foo for T {
|
2012-07-18 13:01:54 -05:00
|
|
|
fn foo(i: &self/int) -> int {*i}
|
|
|
|
}
|
|
|
|
|
2012-09-07 16:52:28 -05:00
|
|
|
fn to_foo<T:Copy>(t: T) {
|
2012-07-18 13:01:54 -05:00
|
|
|
// 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;
|
2013-02-21 17:19:40 -06:00
|
|
|
struct F<T> { f: T }
|
|
|
|
let x = F {f:t} as foo;
|
2012-07-18 13:01:54 -05:00
|
|
|
assert x.foo(v) == 3;
|
|
|
|
}
|
|
|
|
|
2012-09-07 16:52:28 -05:00
|
|
|
fn to_foo_2<T:Copy>(t: T) -> foo {
|
2012-07-18 13:01:54 -05:00
|
|
|
// Not OK---T may contain borrowed ptrs and it is going to escape
|
|
|
|
// as part of the returned foo value
|
2013-02-21 17:19:40 -06:00
|
|
|
struct F<T> { f: T }
|
|
|
|
F {f:t} as foo //~ ERROR value may contain borrowed pointers; use `&static` bound
|
2012-07-18 13:01:54 -05:00
|
|
|
}
|
|
|
|
|
2013-02-20 19:07:17 -06:00
|
|
|
fn to_foo_3<T:Copy + &static>(t: T) -> foo {
|
2012-07-18 13:01:54 -05:00
|
|
|
// OK---T may escape as part of the returned foo value, but it is
|
|
|
|
// owned and hence does not contain borrowed ptrs
|
2013-02-21 17:19:40 -06:00
|
|
|
struct F<T> { f: T }
|
|
|
|
F {f:t} as foo
|
2012-07-18 13:01:54 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {
|
2013-02-14 13:47:00 -06:00
|
|
|
}
|