diff options
| author | Yuki Okushi <jtitor@2k36.org> | 2021-11-16 15:59:41 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-11-16 15:59:41 +0900 |
| commit | 6d9c3a1b979273a541ccf1f1c718c8ea733833ed (patch) | |
| tree | aff4fe948e4e1ff72060087be19e015b46710f18 | |
| parent | d44cec3453ce1645c1b17b54b8fbec989d4ab0d3 (diff) | |
| parent | 9ec88626eac5e3e7c5fd719135545f1ac31fab8b (diff) | |
| download | rust-6d9c3a1b979273a541ccf1f1c718c8ea733833ed.tar.gz rust-6d9c3a1b979273a541ccf1f1c718c8ea733833ed.zip | |
Rollup merge of #90910 - RalfJung:const-discriminant-empty-enum, r=petrochenkov
fix getting the discriminant of a zero-variant enum Fixes https://github.com/rust-lang/rust/issues/89765
| -rw-r--r-- | compiler/rustc_middle/src/ty/sty.rs | 4 | ||||
| -rw-r--r-- | src/test/ui/consts/const_discriminant.rs | 7 |
2 files changed, 10 insertions, 1 deletions
diff --git a/compiler/rustc_middle/src/ty/sty.rs b/compiler/rustc_middle/src/ty/sty.rs index 5e807b2f55c..610f9bd8f82 100644 --- a/compiler/rustc_middle/src/ty/sty.rs +++ b/compiler/rustc_middle/src/ty/sty.rs @@ -2067,7 +2067,9 @@ impl<'tcx> TyS<'tcx> { ) -> Option<Discr<'tcx>> { match self.kind() { TyKind::Adt(adt, _) if adt.variants.is_empty() => { - bug!("discriminant_for_variant called on zero variant enum"); + // This can actually happen during CTFE, see + // https://github.com/rust-lang/rust/issues/89765. + None } TyKind::Adt(adt, _) if adt.is_enum() => { Some(adt.discriminant_for_variant(tcx, variant_index)) diff --git a/src/test/ui/consts/const_discriminant.rs b/src/test/ui/consts/const_discriminant.rs index a47f6af0296..f623c5101f4 100644 --- a/src/test/ui/consts/const_discriminant.rs +++ b/src/test/ui/consts/const_discriminant.rs @@ -25,6 +25,13 @@ enum SingleVariant { const TEST_V: Discriminant<SingleVariant> = discriminant(&SingleVariant::V); +pub const TEST_VOID: () = { + // This is UB, but CTFE does not check validity so it does not detect this. + // This is a regression test for https://github.com/rust-lang/rust/issues/89765. + unsafe { std::mem::discriminant(&*(&() as *const () as *const Void)); }; +}; + + fn main() { assert_eq!(TEST_A, TEST_A_OTHER); assert_eq!(TEST_A, discriminant(black_box(&Test::A(17)))); |
