diff --git a/compiler/rustc_abi/src/layout.rs b/compiler/rustc_abi/src/layout.rs index 5004d0c80220f..45200a6fbc9da 100644 --- a/compiler/rustc_abi/src/layout.rs +++ b/compiler/rustc_abi/src/layout.rs @@ -317,9 +317,9 @@ impl LayoutCalculator { always_sized: bool, ) -> LayoutCalculatorResult { let (present_first, present_second) = { - let mut present_variants = variants - .iter_enumerated() - .filter_map(|(i, v)| if !repr.c() && absent(v) { None } else { Some(i) }); + let mut present_variants = variants.iter_enumerated().filter_map(|(i, v)| { + if !repr.inhibit_enum_layout_opt() && absent(v) { None } else { Some(i) } + }); (present_variants.next(), present_variants.next()) }; let present_first = match present_first { diff --git a/tests/ui/layout/enum.rs b/tests/ui/layout/enum.rs index 005faf8ee508d..c4eb943a83287 100644 --- a/tests/ui/layout/enum.rs +++ b/tests/ui/layout/enum.rs @@ -22,3 +22,13 @@ enum ScalarPairDifferingSign { //~ERROR: abi: ScalarPair A(u8), B(i8), } + +enum Never {} + +// See https://github.com/rust-lang/rust/issues/146984 +#[rustc_layout(size)] +#[repr(u32)] +enum DefinedLayoutAllUninhabited { //~ERROR: size: Size(4 bytes) + A(Never), + B(Never), +} diff --git a/tests/ui/layout/enum.stderr b/tests/ui/layout/enum.stderr index f95b577bfc9df..dc9a43eed10f5 100644 --- a/tests/ui/layout/enum.stderr +++ b/tests/ui/layout/enum.stderr @@ -16,5 +16,11 @@ error: abi: ScalarPair(Initialized { value: Int(I8, false), valid_range: 0..=1 } LL | enum ScalarPairDifferingSign { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -error: aborting due to 3 previous errors +error: size: Size(4 bytes) + --> $DIR/enum.rs:31:1 + | +LL | enum DefinedLayoutAllUninhabited { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 4 previous errors