]> git.proxmox.com Git - rustc.git/blob - src/test/codegen-units/unsizing.rs
Imported Upstream version 1.9.0+dfsg1
[rustc.git] / src / test / codegen-units / unsizing.rs
1 // Copyright 2012-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 // ignore-tidy-linelength
12 // compile-flags:-Zprint-trans-items=eager
13
14 #![deny(dead_code)]
15 #![feature(coerce_unsized)]
16 #![feature(unsize)]
17
18 use std::marker::Unsize;
19 use std::ops::CoerceUnsized;
20
21 trait Trait {
22 fn foo(&self);
23 }
24
25 // Simple Case
26 impl Trait for bool {
27 fn foo(&self) {}
28 }
29
30 impl Trait for char {
31 fn foo(&self) {}
32 }
33
34 // Struct Field Case
35 struct Struct<T: ?Sized> {
36 _a: u32,
37 _b: i32,
38 _c: T
39 }
40
41 impl Trait for f64 {
42 fn foo(&self) {}
43 }
44
45 // Custom Coercion Case
46 impl Trait for u32 {
47 fn foo(&self) {}
48 }
49
50 #[derive(Clone, Copy)]
51 struct Wrapper<T: ?Sized>(*const T);
52
53 impl<T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<Wrapper<U>> for Wrapper<T> {}
54
55 //~ TRANS_ITEM fn unsizing::main[0]
56 fn main()
57 {
58 // simple case
59 let bool_sized = &true;
60 //~ TRANS_ITEM fn unsizing::{{impl}}[0]::foo[0]
61 let _bool_unsized = bool_sized as &Trait;
62
63 let char_sized = &true;
64 //~ TRANS_ITEM fn unsizing::{{impl}}[1]::foo[0]
65 let _char_unsized = char_sized as &Trait;
66
67 // struct field
68 let struct_sized = &Struct {
69 _a: 1,
70 _b: 2,
71 _c: 3.0f64
72 };
73 //~ TRANS_ITEM fn unsizing::{{impl}}[2]::foo[0]
74 let _struct_unsized = struct_sized as &Struct<Trait>;
75
76 // custom coercion
77 let wrapper_sized = Wrapper(&0u32);
78 //~ TRANS_ITEM fn unsizing::{{impl}}[3]::foo[0]
79 let _wrapper_sized = wrapper_sized as Wrapper<Trait>;
80 }