diff options
| author | Wesley Wiser <wwiser@gmail.com> | 2019-11-28 21:36:06 -0500 |
|---|---|---|
| committer | Wesley Wiser <wwiser@gmail.com> | 2019-12-03 06:11:29 -0500 |
| commit | 0be80f2909e0b5246c884db241a602a2f6d90488 (patch) | |
| tree | e57888e4c7ef17c827afa7515b56b59c4ffafedd /src/librustc_mir/interpret | |
| parent | 4007d4ef26eab44bdabc2b7574d032152264d3ad (diff) | |
| download | rust-0be80f2909e0b5246c884db241a602a2f6d90488.tar.gz rust-0be80f2909e0b5246c884db241a602a2f6d90488.zip | |
[const-prop] Fix ICE calculating enum discriminant
Fixes #66787
Diffstat (limited to 'src/librustc_mir/interpret')
| -rw-r--r-- | src/librustc_mir/interpret/place.rs | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/src/librustc_mir/interpret/place.rs b/src/librustc_mir/interpret/place.rs index 5b263f76801..3a204c350b4 100644 --- a/src/librustc_mir/interpret/place.rs +++ b/src/librustc_mir/interpret/place.rs @@ -1038,13 +1038,16 @@ where variant_index: VariantIdx, dest: PlaceTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx> { - let variant_scalar = Scalar::from_u32(variant_index.as_u32()).into(); + + // Layout computation excludes uninhabited variants from consideration + // therefore there's no way to represent those variants in the given layout. + if dest.layout.for_variant(self, variant_index).abi.is_uninhabited() { + throw_ub!(Unreachable); + } match dest.layout.variants { layout::Variants::Single { index } => { - if index != variant_index { - throw_ub!(InvalidDiscriminant(variant_scalar)); - } + assert_eq!(index, variant_index); } layout::Variants::Multiple { discr_kind: layout::DiscriminantKind::Tag, @@ -1052,9 +1055,9 @@ where discr_index, .. } => { - if !dest.layout.ty.variant_range(*self.tcx).unwrap().contains(&variant_index) { - throw_ub!(InvalidDiscriminant(variant_scalar)); - } + // No need to validate that the discriminant here because the + // `TyLayout::for_variant()` call earlier already checks the variant is valid. + let discr_val = dest.layout.ty.discriminant_for_variant(*self.tcx, variant_index).unwrap().val; @@ -1077,9 +1080,9 @@ where discr_index, .. } => { - if !variant_index.as_usize() < dest.layout.ty.ty_adt_def().unwrap().variants.len() { - throw_ub!(InvalidDiscriminant(variant_scalar)); - } + // No need to validate that the discriminant here because the + // `TyLayout::for_variant()` call earlier already checks the variant is valid. + if variant_index != dataful_variant { let variants_start = niche_variants.start().as_u32(); let variant_index_relative = variant_index.as_u32() |
