Skip to content

Commit 3215c44

Browse files
authored
Rollup merge of rust-lang#90910 - RalfJung:const-discriminant-empty-enum, r=petrochenkov
fix getting the discriminant of a zero-variant enum Fixes rust-lang#89765
2 parents 0c78c40 + 9ec8862 commit 3215c44

File tree

2 files changed

+10
-1
lines changed

2 files changed

+10
-1
lines changed

compiler/rustc_middle/src/ty/sty.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -2067,7 +2067,9 @@ impl<'tcx> TyS<'tcx> {
20672067
) -> Option<Discr<'tcx>> {
20682068
match self.kind() {
20692069
TyKind::Adt(adt, _) if adt.variants.is_empty() => {
2070-
bug!("discriminant_for_variant called on zero variant enum");
2070+
// This can actually happen during CTFE, see
2071+
// https://github.com/rust-lang/rust/issues/89765.
2072+
None
20712073
}
20722074
TyKind::Adt(adt, _) if adt.is_enum() => {
20732075
Some(adt.discriminant_for_variant(tcx, variant_index))

src/test/ui/consts/const_discriminant.rs

+7
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,13 @@ enum SingleVariant {
2525

2626
const TEST_V: Discriminant<SingleVariant> = discriminant(&SingleVariant::V);
2727

28+
pub const TEST_VOID: () = {
29+
// This is UB, but CTFE does not check validity so it does not detect this.
30+
// This is a regression test for https://github.com/rust-lang/rust/issues/89765.
31+
unsafe { std::mem::discriminant(&*(&() as *const () as *const Void)); };
32+
};
33+
34+
2835
fn main() {
2936
assert_eq!(TEST_A, TEST_A_OTHER);
3037
assert_eq!(TEST_A, discriminant(black_box(&Test::A(17))));

0 commit comments

Comments
 (0)