E0691 - Error codes index (original) (raw)
Error codes index
Error code E0691
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:
#![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:
#![allow(unused)]
fn main() {
#[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:
#![allow(unused)]
#![feature(repr_align)]
fn main() {
use std:📑: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.