]>
Commit | Line | Data |
---|---|---|
b7449926 | 1 | // run-pass |
0bf4aa26 | 2 | #![allow(dead_code)] |
b7449926 | 3 | |
e74abb32 XL |
4 | use std::mem::ManuallyDrop; |
5 | ||
9e0c209e | 6 | union MaybeItem<T: Iterator> { |
e74abb32 | 7 | elem: ManuallyDrop<T::Item>, |
9e0c209e SL |
8 | none: (), |
9 | } | |
10 | ||
e74abb32 | 11 | union U<A, B> where A: Copy, B: Copy { |
9e0c209e SL |
12 | a: A, |
13 | b: B, | |
14 | } | |
15 | ||
e74abb32 | 16 | unsafe fn union_transmute<A, B>(a: A) -> B where A: Copy, B: Copy { |
29967ef6 | 17 | U { a }.b |
9e0c209e SL |
18 | } |
19 | ||
20 | fn main() { | |
21 | unsafe { | |
9e0c209e SL |
22 | let b = union_transmute::<(u8, u8), u16>((1, 1)); |
23 | assert_eq!(b, (1 << 8) + 1); | |
24 | ||
25 | let v: Vec<u8> = vec![1, 2, 3]; | |
26 | let mut i = v.iter(); | |
27 | i.next(); | |
e74abb32 XL |
28 | let mi = MaybeItem::<std::slice::Iter<_>> { elem: ManuallyDrop::new(i.next().unwrap()) }; |
29 | assert_eq!(**mi.elem, 2); | |
9e0c209e SL |
30 | } |
31 | } |