| A struct with the representation hint `repr(transparent)` had two or more fields | |
| that were not guaranteed to be zero-sized. | |
| Erroneous code example: | |
| ```compile_fail,E0690 | |
| #[repr(transparent)] | |
| struct LengthWithUnit<U> { // error: transparent struct needs at most one | |
| value: f32, // non-zero-sized field, but has 2 | |
| unit: U, | |
| } | |
| ``` | |
| Because transparent structs are represented exactly like one of their fields at | |
| run time, said field must be uniquely determined. If there are multiple fields, | |
| it is not clear how the struct should be represented. | |
| Note that fields of zero-sized types (e.g., `PhantomData`) can also exist | |
| alongside the field that contains the actual data, they do not count for this | |
| error. When generic types are involved (as in the above example), an error is | |
| reported because the type parameter could be non-zero-sized. | |
| To combine `repr(transparent)` with type parameters, `PhantomData` may be | |
| useful: | |
| ``` | |
| use std::marker::PhantomData; | |
| #[repr(transparent)] | |
| struct LengthWithUnit<U> { | |
| value: f32, | |
| unit: PhantomData<U>, | |
| } | |
| ``` |