]>
Commit | Line | Data |
---|---|---|
b7449926 | 1 | // run-pass |
0bf4aa26 | 2 | #![allow(dead_code)] |
b7449926 XL |
3 | #![allow(unions_with_drop_fields)] |
4 | ||
9e0c209e SL |
5 | #![feature(untagged_unions)] |
6 | ||
7 | union MaybeItem<T: Iterator> { | |
8 | elem: T::Item, | |
9 | none: (), | |
10 | } | |
11 | ||
12 | union U<A, B> { | |
13 | a: A, | |
14 | b: B, | |
15 | } | |
16 | ||
17 | unsafe fn union_transmute<A, B>(a: A) -> B { | |
18 | U { a: a }.b | |
19 | } | |
20 | ||
21 | fn main() { | |
22 | unsafe { | |
23 | let u = U::<String, Vec<u8>> { a: String::from("abcd") }; | |
24 | ||
25 | assert_eq!(u.b.len(), 4); | |
26 | assert_eq!(u.b[0], b'a'); | |
27 | ||
28 | let b = union_transmute::<(u8, u8), u16>((1, 1)); | |
29 | assert_eq!(b, (1 << 8) + 1); | |
30 | ||
31 | let v: Vec<u8> = vec![1, 2, 3]; | |
32 | let mut i = v.iter(); | |
33 | i.next(); | |
34 | let mi = MaybeItem::<std::slice::Iter<_>> { elem: i.next().unwrap() }; | |
35 | assert_eq!(*mi.elem, 2); | |
36 | } | |
37 | } |