]> git.lizzy.rs Git - rust.git/blob - src/test/run-pass/mir_coercions.rs
Changed issue number to 36105
[rust.git] / src / test / run-pass / mir_coercions.rs
1 // Copyright 2015 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 #![feature(rustc_attrs, coerce_unsized, unsize)]
12
13 use std::ops::CoerceUnsized;
14 use std::marker::Unsize;
15
16 #[rustc_mir]
17 fn identity_coercion(x: &(Fn(u32)->u32 + Send)) -> &Fn(u32)->u32 {
18     x
19 }
20 #[rustc_mir]
21 fn fn_coercions(f: &fn(u32) -> u32) ->
22     (unsafe fn(u32) -> u32,
23      &(Fn(u32) -> u32+Send))
24 {
25     (*f, f)
26 }
27
28 #[rustc_mir]
29 fn simple_array_coercion(x: &[u8; 3]) -> &[u8] { x }
30
31 fn square(a: u32) -> u32 { a * a }
32
33 #[derive(PartialEq,Eq)]
34 struct PtrWrapper<'a, T: 'a+?Sized>(u32, u32, (), &'a T);
35 impl<'a, T: ?Sized+Unsize<U>, U: ?Sized>
36     CoerceUnsized<PtrWrapper<'a, U>> for PtrWrapper<'a, T> {}
37
38 struct TrivPtrWrapper<'a, T: 'a+?Sized>(&'a T);
39 impl<'a, T: ?Sized+Unsize<U>, U: ?Sized>
40     CoerceUnsized<TrivPtrWrapper<'a, U>> for TrivPtrWrapper<'a, T> {}
41
42 #[rustc_mir]
43 fn coerce_ptr_wrapper(p: PtrWrapper<[u8; 3]>) -> PtrWrapper<[u8]> {
44     p
45 }
46
47 #[rustc_mir]
48 fn coerce_triv_ptr_wrapper(p: TrivPtrWrapper<[u8; 3]>) -> TrivPtrWrapper<[u8]> {
49     p
50 }
51
52 #[rustc_mir]
53 fn coerce_fat_ptr_wrapper(p: PtrWrapper<Fn(u32) -> u32+Send>)
54                           -> PtrWrapper<Fn(u32) -> u32> {
55     p
56 }
57
58 #[rustc_mir]
59 fn coerce_ptr_wrapper_poly<'a, T, Trait: ?Sized>(p: PtrWrapper<'a, T>)
60                                                  -> PtrWrapper<'a, Trait>
61     where PtrWrapper<'a, T>: CoerceUnsized<PtrWrapper<'a, Trait>>
62 {
63     p
64 }
65
66 fn main() {
67     let a = [0,1,2];
68     let square_local : fn(u32) -> u32 = square;
69     let (f,g) = fn_coercions(&square_local);
70     assert_eq!(f as usize, square as usize);
71     assert_eq!(g(4), 16);
72     assert_eq!(identity_coercion(g)(5), 25);
73
74     assert_eq!(simple_array_coercion(&a), &a);
75     let w = coerce_ptr_wrapper(PtrWrapper(2,3,(),&a));
76     assert!(w == PtrWrapper(2,3,(),&a) as PtrWrapper<[u8]>);
77
78     let w = coerce_triv_ptr_wrapper(TrivPtrWrapper(&a));
79     assert_eq!(&w.0, &a);
80
81     let z = coerce_fat_ptr_wrapper(PtrWrapper(2,3,(),&square_local));
82     assert_eq!((z.3)(6), 36);
83
84     let z: PtrWrapper<Fn(u32) -> u32> =
85         coerce_ptr_wrapper_poly(PtrWrapper(2,3,(),&square_local));
86     assert_eq!((z.3)(6), 36);
87 }