]> git.lizzy.rs Git - rust.git/blob - src/test/run-pass/mir_misc_casts.rs
Auto merge of #30641 - tsion:match-range, r=eddyb
[rust.git] / src / test / run-pass / mir_misc_casts.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(libc, rustc_attrs)]
12
13 extern crate libc;
14
15 fn func(){}
16
17 const STR: &'static str = "hello";
18 const BSTR: &'static [u8; 5] = b"hello";
19
20 #[rustc_mir]
21 fn from_ptr()
22 -> (isize, usize, i8, i16, i32, i64, u8, u16, u32, u64, *const ()) {
23     let f = 1_usize as *const libc::FILE;
24     let c1 = f as isize;
25     let c2 = f as usize;
26     let c3 = f as i8;
27     let c4 = f as i16;
28     let c5 = f as i32;
29     let c6 = f as i64;
30     let c7 = f as u8;
31     let c8 = f as u16;
32     let c9 = f as u32;
33     let c10 = f as u64;
34     let c11 = f as *const ();
35     (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11)
36 }
37
38 #[rustc_mir]
39 fn from_1()
40 -> (isize, usize, i8, i16, i32, i64, u8, u16, u32, u64, f32, f64, *const libc::FILE) {
41     let c1 = 1 as isize;
42     let c2 = 1 as usize;
43     let c3 = 1 as i8;
44     let c4 = 1 as i16;
45     let c5 = 1 as i32;
46     let c6 = 1 as i64;
47     let c7 = 1 as u8;
48     let c8 = 1 as u16;
49     let c9 = 1 as u32;
50     let c10 = 1 as u64;
51     let c11 = 1 as f32;
52     let c12 = 1 as f64;
53     let c13 = 1 as *const libc::FILE;
54     (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13)
55 }
56
57 #[rustc_mir]
58 fn from_1usize()
59 -> (isize, usize, i8, i16, i32, i64, u8, u16, u32, u64, f32, f64, *const libc::FILE) {
60     let c1 = 1_usize as isize;
61     let c2 = 1_usize as usize;
62     let c3 = 1_usize as i8;
63     let c4 = 1_usize as i16;
64     let c5 = 1_usize as i32;
65     let c6 = 1_usize as i64;
66     let c7 = 1_usize as u8;
67     let c8 = 1_usize as u16;
68     let c9 = 1_usize as u32;
69     let c10 = 1_usize as u64;
70     let c11 = 1_usize as f32;
71     let c12 = 1_usize as f64;
72     let c13 = 1_usize as *const libc::FILE;
73     (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13)
74 }
75
76 #[rustc_mir]
77 fn from_1isize()
78 -> (isize, usize, i8, i16, i32, i64, u8, u16, u32, u64, f32, f64, *const libc::FILE) {
79     let c1 = 1_isize as isize;
80     let c2 = 1_isize as usize;
81     let c3 = 1_isize as i8;
82     let c4 = 1_isize as i16;
83     let c5 = 1_isize as i32;
84     let c6 = 1_isize as i64;
85     let c7 = 1_isize as u8;
86     let c8 = 1_isize as u16;
87     let c9 = 1_isize as u32;
88     let c10 = 1_isize as u64;
89     let c11 = 1_isize as f32;
90     let c12 = 1_isize as f64;
91     let c13 = 1_isize as *const libc::FILE;
92     (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13)
93 }
94
95 #[rustc_mir]
96 fn from_1u8()
97 -> (isize, usize, i8, i16, i32, i64, u8, u16, u32, u64, f32, f64, *const libc::FILE) {
98     let c1 = 1_u8 as isize;
99     let c2 = 1_u8 as usize;
100     let c3 = 1_u8 as i8;
101     let c4 = 1_u8 as i16;
102     let c5 = 1_u8 as i32;
103     let c6 = 1_u8 as i64;
104     let c7 = 1_u8 as u8;
105     let c8 = 1_u8 as u16;
106     let c9 = 1_u8 as u32;
107     let c10 = 1_u8 as u64;
108     let c11 = 1_u8 as f32;
109     let c12 = 1_u8 as f64;
110     let c13 = 1_u8 as *const libc::FILE;
111     (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13)
112 }
113
114 #[rustc_mir]
115 fn from_1i8()
116 -> (isize, usize, i8, i16, i32, i64, u8, u16, u32, u64, f32, f64, *const libc::FILE) {
117     let c1 = 1_i8 as isize;
118     let c2 = 1_i8 as usize;
119     let c3 = 1_i8 as i8;
120     let c4 = 1_i8 as i16;
121     let c5 = 1_i8 as i32;
122     let c6 = 1_i8 as i64;
123     let c7 = 1_i8 as u8;
124     let c8 = 1_i8 as u16;
125     let c9 = 1_i8 as u32;
126     let c10 = 1_i8 as u64;
127     let c11 = 1_i8 as f32;
128     let c12 = 1_i8 as f64;
129     let c13 = 1_i8 as *const libc::FILE;
130     (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13)
131 }
132
133 #[rustc_mir]
134 fn from_1u16()
135 -> (isize, usize, i8, i16, i32, i64, u8, u16, u32, u64, f32, f64, *const libc::FILE) {
136     let c1 = 1_u16 as isize;
137     let c2 = 1_u16 as usize;
138     let c3 = 1_u16 as i8;
139     let c4 = 1_u16 as i16;
140     let c5 = 1_u16 as i32;
141     let c6 = 1_u16 as i64;
142     let c7 = 1_u16 as u8;
143     let c8 = 1_u16 as u16;
144     let c9 = 1_u16 as u32;
145     let c10 = 1_u16 as u64;
146     let c11 = 1_u16 as f32;
147     let c12 = 1_u16 as f64;
148     let c13 = 1_u16 as *const libc::FILE;
149     (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13)
150 }
151
152 #[rustc_mir]
153 fn from_1i16()
154 -> (isize, usize, i8, i16, i32, i64, u8, u16, u32, u64, f32, f64, *const libc::FILE) {
155     let c1 = 1_i16 as isize;
156     let c2 = 1_i16 as usize;
157     let c3 = 1_i16 as i8;
158     let c4 = 1_i16 as i16;
159     let c5 = 1_i16 as i32;
160     let c6 = 1_i16 as i64;
161     let c7 = 1_i16 as u8;
162     let c8 = 1_i16 as u16;
163     let c9 = 1_i16 as u32;
164     let c10 = 1_i16 as u64;
165     let c11 = 1_i16 as f32;
166     let c12 = 1_i16 as f64;
167     let c13 = 1_i16 as *const libc::FILE;
168     (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13)
169 }
170
171 #[rustc_mir]
172 fn from_1u32()
173 -> (isize, usize, i8, i16, i32, i64, u8, u16, u32, u64, f32, f64, *const libc::FILE) {
174     let c1 = 1_u32 as isize;
175     let c2 = 1_u32 as usize;
176     let c3 = 1_u32 as i8;
177     let c4 = 1_u32 as i16;
178     let c5 = 1_u32 as i32;
179     let c6 = 1_u32 as i64;
180     let c7 = 1_u32 as u8;
181     let c8 = 1_u32 as u16;
182     let c9 = 1_u32 as u32;
183     let c10 = 1_u32 as u64;
184     let c11 = 1_u32 as f32;
185     let c12 = 1_u32 as f64;
186     let c13 = 1_u32 as *const libc::FILE;
187     (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13)
188 }
189
190 #[rustc_mir]
191 fn from_1i32()
192 -> (isize, usize, i8, i16, i32, i64, u8, u16, u32, u64, f32, f64, *const libc::FILE) {
193     let c1 = 1_i32 as isize;
194     let c2 = 1_i32 as usize;
195     let c3 = 1_i32 as i8;
196     let c4 = 1_i32 as i16;
197     let c5 = 1_i32 as i32;
198     let c6 = 1_i32 as i64;
199     let c7 = 1_i32 as u8;
200     let c8 = 1_i32 as u16;
201     let c9 = 1_i32 as u32;
202     let c10 = 1_i32 as u64;
203     let c11 = 1_i32 as f32;
204     let c12 = 1_i32 as f64;
205     let c13 = 1_i32 as *const libc::FILE;
206     (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13)
207 }
208
209 #[rustc_mir]
210 fn from_1u64()
211 -> (isize, usize, i8, i16, i32, i64, u8, u16, u32, u64, f32, f64, *const libc::FILE) {
212     let c1 = 1_u64 as isize;
213     let c2 = 1_u64 as usize;
214     let c3 = 1_u64 as i8;
215     let c4 = 1_u64 as i16;
216     let c5 = 1_u64 as i32;
217     let c6 = 1_u64 as i64;
218     let c7 = 1_u64 as u8;
219     let c8 = 1_u64 as u16;
220     let c9 = 1_u64 as u32;
221     let c10 = 1_u64 as u64;
222     let c11 = 1_u64 as f32;
223     let c12 = 1_u64 as f64;
224     let c13 = 1_u64 as *const libc::FILE;
225     (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13)
226 }
227
228 #[rustc_mir]
229 fn from_1i64()
230 -> (isize, usize, i8, i16, i32, i64, u8, u16, u32, u64, f32, f64, *const libc::FILE) {
231     let c1 = 1_i64 as isize;
232     let c2 = 1_i64 as usize;
233     let c3 = 1_i64 as i8;
234     let c4 = 1_i64 as i16;
235     let c5 = 1_i64 as i32;
236     let c6 = 1_i64 as i64;
237     let c7 = 1_i64 as u8;
238     let c8 = 1_i64 as u16;
239     let c9 = 1_i64 as u32;
240     let c10 = 1_i64 as u64;
241     let c11 = 1_i64 as f32;
242     let c12 = 1_i64 as f64;
243     let c13 = 1_i64 as *const libc::FILE;
244     (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13)
245 }
246
247 #[rustc_mir]
248 fn from_bool()
249 -> (isize, usize, i8, i16, i32, i64, u8, u16, u32, u64) {
250     let c1 = true as isize;
251     let c2 = true as usize;
252     let c3 = true as i8;
253     let c4 = true as i16;
254     let c5 = true as i32;
255     let c6 = true as i64;
256     let c7 = true as u8;
257     let c8 = true as u16;
258     let c9 = true as u32;
259     let c10 = true as u64;
260     (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10)
261 }
262
263 #[rustc_mir]
264 fn from_1f32()
265 -> (isize, usize, i8, i16, i32, i64, u8, u16, u32, u64, f32, f64) {
266     let c1 = 1.0_f32 as isize;
267     let c2 = 1.0_f32 as usize;
268     let c3 = 1.0_f32 as i8;
269     let c4 = 1.0_f32 as i16;
270     let c5 = 1.0_f32 as i32;
271     let c6 = 1.0_f32 as i64;
272     let c7 = 1.0_f32 as u8;
273     let c8 = 1.0_f32 as u16;
274     let c9 = 1.0_f32 as u32;
275     let c10 = 1.0_f32 as u64;
276     let c11 = 1.0_f32 as f32;
277     let c12 = 1.0_f32 as f64;
278     (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12)
279 }
280
281 #[rustc_mir]
282 fn from_1f64()
283 -> (isize, usize, i8, i16, i32, i64, u8, u16, u32, u64, f32, f64) {
284     let c1 = 1.0f64 as isize;
285     let c2 = 1.0f64 as usize;
286     let c3 = 1.0f64 as i8;
287     let c4 = 1.0f64 as i16;
288     let c5 = 1.0f64 as i32;
289     let c6 = 1.0f64 as i64;
290     let c7 = 1.0f64 as u8;
291     let c8 = 1.0f64 as u16;
292     let c9 = 1.0f64 as u32;
293     let c10 = 1.0f64 as u64;
294     let c11 = 1.0f64 as f32;
295     let c12 = 1.0f64 as f64;
296     (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12)
297 }
298
299 #[rustc_mir]
300 fn other_casts()
301 -> (*const u8, *const isize, *const u8, *const u8) {
302     let c1 = func as *const u8;
303     let c2 = c1 as *const isize;
304
305     let r = &42u32;
306     let _ = r as *const u32;
307
308     // fat-ptr -> fat-ptr -> fat-raw-ptr -> thin-ptr
309     let c3 = STR as &str as *const str as *const u8;
310
311     let c4 = BSTR as *const [u8] as *const [u16] as *const u8;
312     (c1, c2, c3, c4)
313 }
314
315 pub fn assert_eq_13(l: (isize, usize, i8, i16, i32, i64, u8,
316                         u16, u32, u64, f32, f64, *const libc::FILE),
317                     r: (isize, usize, i8, i16, i32, i64, u8,
318                         u16, u32, u64, f32, f64, *const libc::FILE)) -> bool {
319     let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13) = l;
320     let (r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13) = r;
321     l1 == r1 && l2 == r2 && l3 == r3 && l4 == r4 && l5 == r5 && l6 == r6 && l7 == r7 &&
322     l8 == r8 && l9 == r9 && l10 == r10 && l11 == r11 && l12 == r12 && l13 == r13
323 }
324
325
326 pub fn main() {
327     let f = 1_usize as *const libc::FILE;
328     let t13 = (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.0, 1.0, f);
329     let t12 = (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.0, 1.0);
330     assert_eq_13(from_1(), t13);
331     assert_eq_13(from_1usize(), t13);
332     assert_eq_13(from_1isize(), t13);
333     assert_eq_13(from_1u8(), t13);
334     assert_eq_13(from_1i8(), t13);
335     assert_eq_13(from_1u16(), t13);
336     assert_eq_13(from_1i16(), t13);
337     assert_eq_13(from_1u32(), t13);
338     assert_eq_13(from_1i32(), t13);
339     assert_eq_13(from_1u64(), t13);
340     assert_eq_13(from_1i64(), t13);
341     assert_eq!(from_1f32(), t12);
342     assert_eq!(from_1f64(), t12);
343
344     assert_eq!(from_ptr(), (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 as *const ()));
345     assert_eq!(from_bool(), (1, 1, 1, 1, 1, 1, 1, 1, 1, 1));
346
347     assert_eq!(other_casts(), (func as *const u8, func as *const isize,
348                                STR as *const str as *const u8, BSTR as *const [u8] as *const u8));
349 }