diff options
| author | bors <bors@rust-lang.org> | 2018-05-14 18:04:11 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2018-05-14 18:04:11 +0000 |
| commit | 935a2f12b2a3ce44cbcbd0f7de1b388949cccca2 (patch) | |
| tree | a7c2c10a530f5744f72c38e0b254e185ce1d554a | |
| parent | cb1ce7ddf8e791faddc9760ca505d513ce1c00c9 (diff) | |
| parent | 29b4c7b9e0a5e32127c42f5aab9baefadc38033c (diff) | |
| download | rust-935a2f12b2a3ce44cbcbd0f7de1b388949cccca2.tar.gz rust-935a2f12b2a3ce44cbcbd0f7de1b388949cccca2.zip | |
Auto merge of #50735 - eddyb:issue-50731, r=nikomatsakis
rustc: don't trip an assertion for enums with present but uninhabited variants. Fixes #50731. r? @nikomatsakis
| -rw-r--r-- | src/librustc/ty/layout.rs | 5 | ||||
| -rw-r--r-- | src/test/run-pass/issue-50731.rs | 15 |
2 files changed, 20 insertions, 0 deletions
diff --git a/src/librustc/ty/layout.rs b/src/librustc/ty/layout.rs index b22c025e86c..bbfc6d883e9 100644 --- a/src/librustc/ty/layout.rs +++ b/src/librustc/ty/layout.rs @@ -888,6 +888,11 @@ impl<'a, 'tcx> LayoutCx<'tcx, TyCtxt<'a, 'tcx, 'tcx>> { if x < min { min = x; } if x > max { max = x; } } + // We might have no inhabited variants, so pretend there's at least one. + if (min, max) == (i128::max_value(), i128::min_value()) { + min = 0; + max = 0; + } assert!(min <= max, "discriminant range is {}...{}", min, max); let (min_ity, signed) = Integer::repr_discr(tcx, ty, &def.repr, min, max); diff --git a/src/test/run-pass/issue-50731.rs b/src/test/run-pass/issue-50731.rs new file mode 100644 index 00000000000..06df2b989af --- /dev/null +++ b/src/test/run-pass/issue-50731.rs @@ -0,0 +1,15 @@ +// Copyright 2018 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. + +enum Void {} +fn foo(_: Result<(Void, u32), (Void, String)>) {} +fn main() { + let _: fn(_) = foo; +} |
