diff options
| author | Simon Sapin <simon.sapin@exyr.org> | 2017-12-05 22:37:51 +0100 |
|---|---|---|
| committer | Simon Sapin <simon.sapin@exyr.org> | 2017-12-05 23:50:41 +0100 |
| commit | d4fabb987b753c0856c22b4d2252abdbfd33f76c (patch) | |
| tree | ec0c1e1dc8e72eab5b4ad4df96286f2b763730d6 | |
| parent | abe85ab0b232e744b602d20a65fbe92aa71c6045 (diff) | |
| download | rust-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.rs | 12 | ||||
| -rw-r--r-- | src/test/run-pass/issue-46519.rs | 37 |
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") + } +} |
