| A `repr(transparent)` type was also annotated with other, incompatible |
| representation hints. |
| |
| Erroneous code example: |
| |
| ```compile_fail,E0692 |
| #[repr(transparent, C)] // error: incompatible representation hints |
| struct Grams(f32); |
| ``` |
| |
| A type annotated as `repr(transparent)` delegates all representation concerns to |
| another type, so adding more representation hints is contradictory. Remove |
| either the `transparent` hint or the other hints, like this: |
| |
| ``` |
| #[repr(transparent)] |
| struct Grams(f32); |
| ``` |
| |
| Alternatively, move the other attributes to the contained type: |
| |
| ``` |
| #[repr(C)] |
| struct Foo { |
| x: i32, |
| // ... |
| } |
| |
| #[repr(transparent)] |
| struct FooWrapper(Foo); |
| ``` |
| |
| Note that introducing another `struct` just to have a place for the other |
| attributes may have unintended side effects on the representation: |
| |
| ``` |
| #[repr(transparent)] |
| struct Grams(f32); |
| |
| #[repr(C)] |
| struct Float(f32); |
| |
| #[repr(transparent)] |
| struct Grams2(Float); // this is not equivalent to `Grams` above |
| ``` |
| |
| Here, `Grams2` is a not equivalent to `Grams` -- the former transparently wraps |
| a (non-transparent) struct containing a single float, while `Grams` is a |
| transparent wrapper around a float. This can make a difference for the ABI. |