@@ -346,3 +346,55 @@ enum Enum1<T> {
346
346
Absent2,
347
347
}
348
348
```
349
+
350
+ ## Unresolved questions
351
+
352
+ ### Layout of single variant enums
353
+
354
+ [Issue #79 .](https:// github.com/rust-rfcs/unsafe-code-guidelines/issues/79)
355
+
356
+ Enums that contain a **single variant** and which do not have an
357
+ explicit `#[repr]` annotation are an important special case . Since
358
+ there is only a single variant, the enum must be instantiated with
359
+ that variant, which means that the enum is in fact equivalent to a
360
+ struct . The question then is to what extent we should ** guarantee**
361
+ that the two share an equivalent layout, and also how to define the
362
+ interaction with uninhabited types.
363
+
364
+ As presently implemented, the compiler will use the same layout for
365
+ structs and for single variant enums (as long as they do not have a
366
+ ` #[repr] ` annotation that overrides that choice). So, for example, the
367
+ struct ` SomeStruct ` and the enum ` SomeEnum ` would have an equivalent
368
+ layout ([ playground] ( https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=3697ac684c3d021892694956df957653 ) )::
369
+
370
+ ``` rust
371
+ struct SomeStruct ;
372
+ enum SomeEnum {
373
+ SomeVariant ,
374
+ }
375
+ ```
376
+
377
+ Similarly, the struct ` SomeStruct ` and the enum ` SomeVariant ` in this
378
+ example would also be equivalent in their layout
379
+ ([playground](https:// play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=924724764419f846c788a8763da45992)):
380
+
381
+ ```rust
382
+ struct SomeStruct { x: u32 }
383
+ enum SomeEnum {
384
+ SomeVariant { x: u32 },
385
+ }
386
+ ```
387
+
388
+ In fact, the compiler will use this optimized layout even for enums
389
+ that define multiple variants, as long as all but one of the variants
390
+ is uninhabited
391
+ ([playground](https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=3cc1484c5b91097f3dc2015b7c207a0e)):
392
+
393
+ ```rust
394
+ struct SomeStruct { x: u32 }
395
+ enum SomeEnum {
396
+ SomeVariant { x: u32 },
397
+ UninhabitedVariant { y: Void },
398
+ }
399
+ ```
400
+
0 commit comments