| #### Note: this error code is no longer emitted by the compiler. |
| |
| A struct, enum, or union with the `repr(transparent)` representation hint |
| contains a zero-sized field that requires non-trivial alignment. |
| |
| Erroneous code example: |
| |
| ```ignore (error is no longer emitted) |
| #![feature(repr_align)] |
| |
| #[repr(align(32))] |
| struct ForceAlign32; |
| |
| #[repr(transparent)] |
| struct Wrapper(f32, ForceAlign32); // error: zero-sized field in transparent |
| // struct has alignment of 32, which |
| // is larger than 1 |
| ``` |
| |
| A transparent struct, enum, or union is supposed to be represented exactly like |
| the piece of data it contains. Zero-sized fields with different alignment |
| requirements potentially conflict with this property. In the example above, |
| `Wrapper` would have to be aligned to 32 bytes even though `f32` has a smaller |
| alignment requirement. |
| |
| Consider removing the over-aligned zero-sized field: |
| |
| ``` |
| #[repr(transparent)] |
| struct Wrapper(f32); |
| ``` |
| |
| Alternatively, `PhantomData<T>` has alignment 1 for all `T`, so you can use it |
| if you need to keep the field for some reason: |
| |
| ``` |
| #![feature(repr_align)] |
| |
| use std::marker::PhantomData; |
| |
| #[repr(align(32))] |
| struct ForceAlign32; |
| |
| #[repr(transparent)] |
| struct Wrapper(f32, PhantomData<ForceAlign32>); |
| ``` |
| |
| Note that empty arrays `[T; 0]` have the same alignment requirement as the |
| element type `T`. Also note that the error is conservatively reported even when |
| the alignment of the zero-sized type is less than or equal to the data field's |
| alignment. |