]> git.lizzy.rs Git - rust.git/blob - tests/ui/mir/mir_refs_correct.rs
Rollup merge of #106427 - mejrs:translation_errors, r=davidtwco
[rust.git] / tests / ui / mir / mir_refs_correct.rs
1 // run-pass
2 // aux-build:mir_external_refs.rs
3
4 extern crate mir_external_refs as ext;
5
6 struct S(#[allow(unused_tuple_struct_fields)] u8);
7 #[derive(Debug, PartialEq, Eq)]
8 struct Unit;
9
10 impl S {
11     fn hey() -> u8 { 42 }
12     fn hey2(&self) -> u8 { 44 }
13 }
14
15 trait X {
16     fn hoy(&self) -> u8 { 43 }
17     fn hoy2() -> u8 { 45 }
18 }
19
20 trait F<U> {
21     fn f(self, other: U) -> u64;
22 }
23
24 impl F<u32> for u32 {
25     fn f(self, other: u32) -> u64 { self as u64 + other as u64 }
26 }
27
28 impl F<u64> for u32 {
29     fn f(self, other: u64) -> u64 { self as u64 - other }
30 }
31
32 impl F<u64> for u64 {
33     fn f(self, other: u64) -> u64 { self * other }
34 }
35
36 impl F<u32> for u64 {
37     fn f(self, other: u32) -> u64 { self ^ other as u64 }
38 }
39
40 trait T<I, O> {
41     fn staticmeth(i: I, o: O) -> (I, O) { (i, o) }
42 }
43
44 impl<I, O> T<I, O> for O {}
45
46 impl X for S {}
47
48 enum E {
49     U(#[allow(unused_tuple_struct_fields)] u8)
50 }
51
52 #[derive(PartialEq, Debug, Eq)]
53 enum CEnum {
54     A = 0x321,
55     B = 0x123
56 }
57
58 const C: u8 = 84;
59 const C2: [u8; 5] = [42; 5];
60 const C3: [u8; 3] = [42, 41, 40];
61 const C4: fn(u8) -> S = S;
62
63 fn regular() -> u8 {
64     21
65 }
66
67 fn parametric<T>(u: T) -> T {
68     u
69 }
70
71 fn t1() -> fn()->u8 {
72     regular
73 }
74
75 fn t2() -> fn(u8)->E {
76     E::U
77 }
78
79 fn t3() -> fn(u8)->S {
80     S
81 }
82
83 fn t4() -> fn()->u8 {
84     S::hey
85 }
86
87 fn t5() -> fn(&S)-> u8 {
88     <S as X>::hoy
89 }
90
91
92 fn t6() -> fn()->u8{
93     ext::regular_fn
94 }
95
96 fn t7() -> fn(u8)->ext::E {
97     ext::E::U
98 }
99
100 fn t8() -> fn(u8)->ext::S {
101     ext::S
102 }
103
104 fn t9() -> fn()->u8 {
105     ext::S::hey
106 }
107
108 fn t10() -> fn(&ext::S)->u8 {
109     <ext::S as ext::X>::hoy
110 }
111
112 fn t11() -> fn(u8)->u8 {
113     parametric
114 }
115
116 fn t12() -> u8 {
117     C
118 }
119
120 fn t13() -> [u8; 5] {
121     C2
122 }
123
124 fn t13_2() -> [u8; 3] {
125     C3
126 }
127
128 fn t14() -> fn()-> u8 {
129     <S as X>::hoy2
130 }
131
132 fn t15() -> fn(&S)-> u8 {
133     S::hey2
134 }
135
136 fn t16() -> fn(u32, u32)->u64 {
137     F::f
138 }
139
140 fn t17() -> fn(u32, u64)->u64 {
141     F::f
142 }
143
144 fn t18() -> fn(u64, u64)->u64 {
145     F::f
146 }
147
148 fn t19() -> fn(u64, u32)->u64 {
149     F::f
150 }
151
152 fn t20() -> fn(u64, u32)->(u64, u32) {
153     <u32 as T<_, _>>::staticmeth
154 }
155
156 fn t21() -> Unit {
157     Unit
158 }
159
160 fn t22() -> Option<u8> {
161     None
162 }
163
164 fn t23() -> (CEnum, CEnum) {
165     (CEnum::A, CEnum::B)
166 }
167
168 fn t24() -> fn(u8) -> S {
169     C4
170 }
171
172 fn main() {
173     assert_eq!(t1()(), regular());
174
175     assert_eq!(t2() as *mut (), E::U as *mut ());
176     assert_eq!(t3() as *mut (), S as *mut ());
177
178     assert_eq!(t4()(), S::hey());
179     let s = S(42);
180     assert_eq!(t5()(&s), <S as X>::hoy(&s));
181
182
183     assert_eq!(t6()(), ext::regular_fn());
184     assert_eq!(t7() as *mut (), ext::E::U as *mut ());
185     assert_eq!(t8() as *mut (), ext::S as *mut ());
186
187     assert_eq!(t9()(), ext::S::hey());
188     let sext = ext::S(6);
189     assert_eq!(t10()(&sext), <ext::S as ext::X>::hoy(&sext));
190
191     let p = parametric::<u8>;
192     assert_eq!(t11() as *mut (), p as *mut ());
193
194     assert_eq!(t12(), C);
195     assert_eq!(t13(), C2);
196     assert_eq!(t13_2(), C3);
197
198     assert_eq!(t14()(), <S as X>::hoy2());
199     assert_eq!(t15()(&s), S::hey2(&s));
200     assert_eq!(t16()(10u32, 20u32), F::f(10u32, 20u32));
201     assert_eq!(t17()(30u32, 10u64), F::f(30u32, 10u64));
202     assert_eq!(t18()(50u64, 5u64), F::f(50u64, 5u64));
203     assert_eq!(t19()(322u64, 2u32), F::f(322u64, 2u32));
204     assert_eq!(t20()(123u64, 38u32), <u32 as T<_, _>>::staticmeth(123, 38));
205     assert_eq!(t21(), Unit);
206     assert_eq!(t22(), None);
207     assert_eq!(t23(), (CEnum::A, CEnum::B));
208     assert_eq!(t24(), C4);
209 }