You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Outdated docs claim that #[repr(transparent)] on empty structs is not permitted #129029
#[repr(transparent)] can only be used on a struct or single-variant enum that has a single non-zero-sized field (there may be additional zero-sized fields). The effect is that the layout and ABI of the whole struct/enum is guaranteed to be the same as that one field.
... it seems like the compiler should reject that code, with diagnostics similar to those it emits for an empty transparent enum:
error[E0084]: unsupported representation for zero-variant enum
--> src/lib.rs:2:1
|
2 | #[repr(transparent)] enum E {}
| ^^^^^^^^^^^^^^^^^^^^ ------ zero-variant enum
error[E0731]: transparent enum needs exactly one variant, but has 0
--> src/lib.rs:2:22
|
2 | #[repr(transparent)] enum E {}
| ^^^^^^ needs exactly one variant, but has 0
Some errors have detailed explanations: E0084, E0731.
changed the title [-]Compiler does not reject `#[repr(transparent)]` for empty struct[/-][+]Compiler allows `#[repr(transparent)]` for empty struct[/+]on Aug 12, 2024
Notably, the difference between empty (variantless) enums and empty (fieldless) structs are that the former are uninhabited. Fieldless structs just have 0 size.
Actually, is the reference out of date? The reference says:
The transparent representation can only be used on a struct or an enum with a single variant that has:
* a single field with non-zero size, and
* any number of fields with size 0 and alignment 1
changed the title [-]Compiler allows `#[repr(transparent)]` for empty struct[/-][+]Outdated docs claim that `#[repr(transparent)]` on empty struct is not permitted[/+]on Aug 13, 2024
changed the title [-]Outdated docs claim that `#[repr(transparent)]` on empty struct is not permitted[/-][+]Outdated docs claim that `#[repr(transparent)]` on empty structs is not permitted[/+]on Aug 13, 2024
Activity
[-]Compiler does not reject `#[repr(transparent)]` for empty struct[/-][+]Compiler allows `#[repr(transparent)]` for empty struct[/+]compiler-errors commentedon Aug 12, 2024
This regressed somewhere in 1.55
compiler-errors commentedon Aug 13, 2024
This is intentional: #86279
compiler-errors commentedon Aug 13, 2024
Notably, the difference between empty (variantless) enums and empty (fieldless) structs are that the former are uninhabited. Fieldless structs just have 0 size.
compiler-errors commentedon Aug 13, 2024
Actually, is the reference out of date? The reference says:
compiler-errors commentedon Aug 13, 2024
We should update the reference anyways to note this change in rules. I still don't consider this to be a bug according to these rules:
#77841 (comment)
scovich commentedon Aug 13, 2024
Yes, reading the RFC, there is no bug, but the stale documentation needs to be fixed so people are not misled.
[-]Compiler allows `#[repr(transparent)]` for empty struct[/-][+]Outdated docs claim that `#[repr(transparent)]` on empty struct is not permitted[/+][-]Outdated docs claim that `#[repr(transparent)]` on empty struct is not permitted[/-][+]Outdated docs claim that `#[repr(transparent)]` on empty structs is not permitted[/+]