about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRalf Jung <post@ralfj.de>2021-11-14 13:28:47 -0500
committerRalf Jung <post@ralfj.de>2021-11-14 13:29:21 -0500
commiteebf676bf8f76fcdfa610e7e46ab6c135a9cd2d0 (patch)
tree214d029f6c2f58a6ba84b5e830db1856e2159144
parentc8e94975a6541e947a1bd4971e084c8ba637f2b6 (diff)
downloadrust-eebf676bf8f76fcdfa610e7e46ab6c135a9cd2d0.tar.gz
rust-eebf676bf8f76fcdfa610e7e46ab6c135a9cd2d0.zip
fix getting the discriminant of a zero-variant enum
-rw-r--r--compiler/rustc_middle/src/ty/sty.rs4
-rw-r--r--src/test/ui/consts/const_discriminant.rs6
2 files changed, 9 insertions, 1 deletions
diff --git a/compiler/rustc_middle/src/ty/sty.rs b/compiler/rustc_middle/src/ty/sty.rs
index e57075ed338..59601e14849 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..a9c0217ae24 100644
--- a/src/test/ui/consts/const_discriminant.rs
+++ b/src/test/ui/consts/const_discriminant.rs
@@ -25,6 +25,12 @@ 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.
+    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))));