blob: a5bedd61e927309d6df6617932b3ad6ff6f69c33 [file] [log] [blame] [view]
#### 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.