lotsoftools

Understanding Rust Error E0690

What is Rust Error E0690?

Rust Error E0690 occurs when a struct with the representation hint repr(transparent) has two or more fields that are not guaranteed to be zero-sized. The purpose of transparent structs is to be represented exactly like one of their fields at runtime. However, when there are multiple non-zero-sized fields, the compiler cannot determine which field should be used for representation purposes.

Reasons for Rust Error E0690

A common reason for encountering Rust Error E0690 is the use of generic types as fields in transparent structs. In such cases, the size of the generic type cannot be reliably determined at compile time, which leads to ambiguity in struct representation.

Illustrating Rust Error E0690

Consider the following erroneous code example:

#![allow(unused)]
fn main() {
    #[repr(transparent)]
    struct LengthWithUnit<U> { // error: transparent struct needs at most one
        value: f32,            //        non-zero-sized field, but has 2
        unit: U,
    }
}

How to fix Rust Error E0690

To fix Rust Error E0690, ensure that the transparent struct has at most one non-zero-sized field. If you have multiple fields, consider whether the repr(transparent) attribute is necessary or can be removed. If the attribute is still required, you can use std::marker::PhantomData to enforce zero-sized fields in conjunction with type parameters.

Fixed code example:

#![allow(unused)]
fn main() {
    use std::marker::PhantomData;

    #[repr(transparent)]
    struct LengthWithUnit<U> {
        value: f32,
        unit: PhantomData<U>,
    }
}