]> git.lizzy.rs Git - rust.git/blob - tests/ui/mir/mir_coercions.rs
Rollup merge of #106244 - atouchet:readme3, r=workingjubilee
[rust.git] / tests / ui / mir / mir_coercions.rs
1 // run-pass
2 #![feature(coerce_unsized, unsize)]
3
4 use std::ops::CoerceUnsized;
5 use std::marker::Unsize;
6
7 fn identity_coercion(x: &(dyn Fn(u32)->u32 + Send)) -> &dyn Fn(u32)->u32 {
8     x
9 }
10 fn fn_coercions(f: &fn(u32) -> u32) ->
11     (unsafe fn(u32) -> u32,
12      &(dyn Fn(u32) -> u32+Send))
13 {
14     (*f, f)
15 }
16
17 fn simple_array_coercion(x: &[u8; 3]) -> &[u8] { x }
18
19 fn square(a: u32) -> u32 { a * a }
20
21 #[derive(PartialEq,Eq)]
22 struct PtrWrapper<'a, T: 'a+?Sized>(u32, u32, (), &'a T);
23 impl<'a, T: ?Sized+Unsize<U>, U: ?Sized>
24     CoerceUnsized<PtrWrapper<'a, U>> for PtrWrapper<'a, T> {}
25
26 struct TrivPtrWrapper<'a, T: 'a+?Sized>(&'a T);
27 impl<'a, T: ?Sized+Unsize<U>, U: ?Sized>
28     CoerceUnsized<TrivPtrWrapper<'a, U>> for TrivPtrWrapper<'a, T> {}
29
30 fn coerce_ptr_wrapper(p: PtrWrapper<[u8; 3]>) -> PtrWrapper<[u8]> {
31     p
32 }
33
34 fn coerce_triv_ptr_wrapper(p: TrivPtrWrapper<[u8; 3]>) -> TrivPtrWrapper<[u8]> {
35     p
36 }
37
38 fn coerce_fat_ptr_wrapper(p: PtrWrapper<dyn Fn(u32) -> u32+Send>)
39                           -> PtrWrapper<dyn Fn(u32) -> u32> {
40     p
41 }
42
43 fn coerce_ptr_wrapper_poly<'a, T, Trait: ?Sized>(p: PtrWrapper<'a, T>)
44                                                  -> PtrWrapper<'a, Trait>
45     where PtrWrapper<'a, T>: CoerceUnsized<PtrWrapper<'a, Trait>>
46 {
47     p
48 }
49
50 fn main() {
51     let a = [0,1,2];
52     let square_local : fn(u32) -> u32 = square;
53     let (f,g) = fn_coercions(&square_local);
54     assert_eq!(f as usize, square as usize);
55     assert_eq!(g(4), 16);
56     assert_eq!(identity_coercion(g)(5), 25);
57
58     assert_eq!(simple_array_coercion(&a), &a);
59     let w = coerce_ptr_wrapper(PtrWrapper(2,3,(),&a));
60     assert!(w == PtrWrapper(2,3,(),&a) as PtrWrapper<[u8]>);
61
62     let w = coerce_triv_ptr_wrapper(TrivPtrWrapper(&a));
63     assert_eq!(&w.0, &a);
64
65     let z = coerce_fat_ptr_wrapper(PtrWrapper(2,3,(),&square_local));
66     assert_eq!((z.3)(6), 36);
67
68     let z: PtrWrapper<dyn Fn(u32) -> u32> =
69         coerce_ptr_wrapper_poly(PtrWrapper(2,3,(),&square_local));
70     assert_eq!((z.3)(6), 36);
71 }