about summary refs log tree commit diff
diff options
context:
space:
mode:
authorSimon Sapin <simon.sapin@exyr.org>2017-12-05 22:37:51 +0100
committerSimon Sapin <simon.sapin@exyr.org>2017-12-05 23:50:41 +0100
commitd4fabb987b753c0856c22b4d2252abdbfd33f76c (patch)
treeec0c1e1dc8e72eab5b4ad4df96286f2b763730d6
parentabe85ab0b232e744b602d20a65fbe92aa71c6045 (diff)
downloadrust-d4fabb987b753c0856c22b4d2252abdbfd33f76c.tar.gz
rust-d4fabb987b753c0856c22b4d2252abdbfd33f76c.zip
rustc_trans: don't write discriminants for uninhabited variants
Fixes #46519.

Patch as suggested by eddyb:
https://github.com/rust-lang/rust/issues/46519#issuecomment-349443519
-rw-r--r--src/librustc_trans/mir/place.rs12
-rw-r--r--src/test/run-pass/issue-46519.rs37
2 files changed, 42 insertions, 7 deletions
diff --git a/src/librustc_trans/mir/place.rs b/src/librustc_trans/mir/place.rs
index 3bcbb7f3b46..47d0e6f4ecf 100644
--- a/src/librustc_trans/mir/place.rs
+++ b/src/librustc_trans/mir/place.rs
@@ -359,14 +359,12 @@ impl<'a, 'tcx> PlaceRef<'tcx> {
     /// Set the discriminant for a new value of the given case of the given
     /// representation.
     pub fn trans_set_discr(&self, bcx: &Builder<'a, 'tcx>, variant_index: usize) {
-        match self.layout.variants {
+            if self.layout.for_variant(bcx.ccx, variant_index).abi == layout::Abi::Uninhabited {
+                return;
+            }
+            match self.layout.variants {
             layout::Variants::Single { index } => {
-                if index != variant_index {
-                    // If the layout of an enum is `Single`, all
-                    // other variants are necessarily uninhabited.
-                    assert_eq!(self.layout.for_variant(bcx.ccx, variant_index).abi,
-                               layout::Abi::Uninhabited);
-                }
+                assert_eq!(index, variant_index);
             }
             layout::Variants::Tagged { .. } => {
                 let ptr = self.project_field(bcx, 0);
diff --git a/src/test/run-pass/issue-46519.rs b/src/test/run-pass/issue-46519.rs
new file mode 100644
index 00000000000..878cae4e387
--- /dev/null
+++ b/src/test/run-pass/issue-46519.rs
@@ -0,0 +1,37 @@
+// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// compile-flags:--test -O
+
+#[test]
+#[should_panic(expected = "creating inhabited type")]
+fn test() {
+    FontLanguageOverride::system_font(SystemFont::new());
+}
+
+pub enum FontLanguageOverride {
+    Normal,
+    Override(&'static str),
+    System(SystemFont)
+}
+
+pub enum SystemFont {}
+
+impl FontLanguageOverride {
+    fn system_font(f: SystemFont) -> Self {
+        FontLanguageOverride::System(f)
+    }
+}
+
+impl SystemFont {
+    fn new() -> Self {
+        panic!("creating inhabited type")
+    }
+}