8
8
// option. This file may not be copied, modified, or distributed
9
9
// except according to those terms.
10
10
11
+ // aux-build:union.rs
12
+
11
13
#![ feature( untagged_unions) ]
12
14
15
+ extern crate union;
13
16
use std:: mem:: { size_of, align_of, zeroed} ;
14
17
15
18
union U {
16
19
a : u8 ,
20
+ b : u16
17
21
}
18
22
19
- union U64 {
20
- a : u64 ,
21
- }
23
+ fn local ( ) {
24
+ assert_eq ! ( size_of :: < U > ( ) , 2 ) ;
25
+ assert_eq ! ( align_of :: < U > ( ) , 2 ) ;
22
26
23
- union W {
24
- a : u8 ,
25
- b : u64 ,
26
- }
27
+ let u = U { a : 10 } ;
28
+ unsafe {
29
+ assert_eq ! ( u. a, 10 ) ;
30
+ let U { a } = u;
31
+ assert_eq ! ( a, 10 ) ;
32
+ }
27
33
28
- #[ repr( C ) ]
29
- union Y {
30
- f1 : u16 ,
31
- f2 : [ u8 ; 4 ] ,
34
+ let mut w = U { b : 0 } ;
35
+ unsafe {
36
+ assert_eq ! ( w. a, 0 ) ;
37
+ assert_eq ! ( w. b, 0 ) ;
38
+ w. a = 1 ;
39
+ assert_eq ! ( w. a, 1 ) ;
40
+ assert_eq ! ( w. b, 1 ) ;
41
+ }
32
42
}
33
43
34
- fn main ( ) {
35
- assert_eq ! ( size_of:: <U >( ) , 1 ) ;
36
- assert_eq ! ( size_of:: <U64 >( ) , 8 ) ;
37
- assert_eq ! ( size_of:: <W >( ) , 8 ) ;
38
- assert_eq ! ( align_of:: <U >( ) , 1 ) ;
39
- assert_eq ! ( align_of:: <U64 >( ) , align_of:: <u64 >( ) ) ;
40
- assert_eq ! ( align_of:: <W >( ) , align_of:: <u64 >( ) ) ;
41
- assert_eq ! ( size_of:: <Y >( ) , 4 ) ;
42
- assert_eq ! ( align_of:: <Y >( ) , 2 ) ;
44
+ fn xcrate ( ) {
45
+ assert_eq ! ( size_of:: <union :: U >( ) , 2 ) ;
46
+ assert_eq ! ( align_of:: <union :: U >( ) , 2 ) ;
43
47
44
- let u = U { a : 10 } ;
48
+ let u = union :: U { a : 10 } ;
45
49
unsafe {
46
50
assert_eq ! ( u. a, 10 ) ;
47
- let U { a } = u;
51
+ let union :: U { a } = u;
48
52
assert_eq ! ( a, 10 ) ;
49
53
}
50
54
51
- let mut w = W { b : 0 } ;
55
+ let mut w = union :: U { b : 0 } ;
52
56
unsafe {
53
57
assert_eq ! ( w. a, 0 ) ;
54
58
assert_eq ! ( w. b, 0 ) ;
@@ -57,3 +61,8 @@ fn main() {
57
61
assert_eq ! ( w. b, 1 ) ;
58
62
}
59
63
}
64
+
65
+ fn main ( ) {
66
+ local ( ) ;
67
+ xcrate ( ) ;
68
+ }
0 commit comments