File tree Expand file tree Collapse file tree 2 files changed +27
-0
lines changed Expand file tree Collapse file tree 2 files changed +27
-0
lines changed Original file line number Diff line number Diff line change 11
11
- [ Function pointers] ( ./layout/function-pointers.md )
12
12
- [ Arrays and Slices] ( ./layout/arrays-and-slices.md )
13
13
- [ Packed SIMD vectors] ( ./layout/packed-simd-vectors.md )
14
+ - [ Validity] ( ./validity.md )
15
+ - [ Unions] ( ./validity/unions.md )
14
16
- [ Optimizations] ( ./optimizations.md )
15
17
- [ Return value optimization] ( ./optimizations/return_value_optimization.md )
Original file line number Diff line number Diff line change
1
+ # Validity of unions
2
+
3
+ ** Disclaimer** : This chapter is a work-in-progress. What's contained here
4
+ represents the consensus from issue [ #73 ] . The statements in here are not (yet)
5
+ "guaranteed" not to change until an RFC ratifies them.
6
+
7
+ The bit ` i ` of an union is allowed to have value ` v ` _ iff_ there is a variant of
8
+ the union such that bit ` i ` of the variant is allowed to have value ` v ` . We
9
+ assume all variants to be "filled up" to the same size with padding, which may
10
+ have any value.
11
+
12
+ ## Validity of unions with zero-sized fields
13
+
14
+ A union containing a zero-sized field can contain any value. An example of such
15
+ an union is [ ` MaybeUninit ` ] .
16
+
17
+ <details ><summary ><b >Rationale</b ></summary >
18
+
19
+ This follows from the definition of the values that ` union ` bits are allowed to
20
+ take. The zero-sized type has size ` 0 ` , and its variant is filled up to
21
+ the ` union ` size with padding. Since padding is allowed to take any value, any
22
+ bit in the ` union ` is allowed to take any value.
23
+
24
+ [ #73 ] : https://github.com/rust-lang/unsafe-code-guidelines/issues/73
25
+ [ `MaybeUninit` ] : https://doc.rust-lang.org/std/mem/union.MaybeUninit.html
You can’t perform that action at this time.
0 commit comments