]> git.lizzy.rs Git - rust.git/blob - src/test/run-pass/regions-mock-trans.rs
Add externfn macro and correctly label fixed_stack_segments
[rust.git] / src / test / run-pass / regions-mock-trans.rs
1 // Copyright 2012 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
4 //
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
10
11 use std::cast;
12 use std::libc;
13 use std::sys;
14
15 struct arena(());
16
17 struct Bcx<'self> {
18     fcx: &'self Fcx<'self>
19 }
20
21 struct Fcx<'self> {
22     arena: &'self arena,
23     ccx: &'self Ccx
24 }
25
26 struct Ccx {
27     x: int
28 }
29
30 #[fixed_stack_segment] #[inline(never)]
31 fn alloc<'a>(_bcx : &'a arena) -> &'a Bcx<'a> {
32     unsafe {
33         cast::transmute(libc::malloc(sys::size_of::<Bcx<'blk>>()
34             as libc::size_t))
35     }
36 }
37
38 fn h<'a>(bcx : &'a Bcx<'a>) -> &'a Bcx<'a> {
39     return alloc(bcx.fcx.arena);
40 }
41
42 #[fixed_stack_segment] #[inline(never)]
43 fn g(fcx : &Fcx) {
44     let bcx = Bcx { fcx: fcx };
45     let bcx2 = h(&bcx);
46     unsafe {
47         libc::free(cast::transmute(bcx2));
48     }
49 }
50
51 fn f(ccx : &Ccx) {
52     let a = arena(());
53     let fcx = Fcx { arena: &a, ccx: ccx };
54     return g(&fcx);
55 }
56
57 pub fn main() {
58     let ccx = Ccx { x: 0 };
59     f(&ccx);
60 }