@@ -1065,23 +1065,26 @@ where
1065
1065
variant_index : VariantIdx ,
1066
1066
dest : PlaceTy < ' tcx , M :: PointerTag > ,
1067
1067
) -> InterpResult < ' tcx > {
1068
- let variant_scalar = Scalar :: from_u32 ( variant_index. as_u32 ( ) ) . into ( ) ;
1068
+
1069
+ // Layout computation excludes uninhabited variants from consideration
1070
+ // therefore there's no way to represent those variants in the given layout.
1071
+ if dest. layout . for_variant ( self , variant_index) . abi . is_uninhabited ( ) {
1072
+ throw_ub ! ( Unreachable ) ;
1073
+ }
1069
1074
1070
1075
match dest. layout . variants {
1071
1076
layout:: Variants :: Single { index } => {
1072
- if index != variant_index {
1073
- throw_ub ! ( InvalidDiscriminant ( variant_scalar) ) ;
1074
- }
1077
+ assert_eq ! ( index, variant_index) ;
1075
1078
}
1076
1079
layout:: Variants :: Multiple {
1077
1080
discr_kind : layout:: DiscriminantKind :: Tag ,
1078
1081
discr : ref discr_layout,
1079
1082
discr_index,
1080
1083
..
1081
1084
} => {
1082
- if !dest . layout . ty . variant_range ( * self . tcx ) . unwrap ( ) . contains ( & variant_index ) {
1083
- throw_ub ! ( InvalidDiscriminant ( variant_scalar ) ) ;
1084
- }
1085
+ // No need to validate that the discriminant here because the
1086
+ // `TyLayout::for_variant()` call earlier already checks the variant is valid.
1087
+
1085
1088
let discr_val =
1086
1089
dest. layout . ty . discriminant_for_variant ( * self . tcx , variant_index) . unwrap ( ) . val ;
1087
1090
@@ -1104,9 +1107,9 @@ where
1104
1107
discr_index,
1105
1108
..
1106
1109
} => {
1107
- if !variant_index . as_usize ( ) < dest . layout . ty . ty_adt_def ( ) . unwrap ( ) . variants . len ( ) {
1108
- throw_ub ! ( InvalidDiscriminant ( variant_scalar ) ) ;
1109
- }
1110
+ // No need to validate that the discriminant here because the
1111
+ // `TyLayout::for_variant()` call earlier already checks the variant is valid.
1112
+
1110
1113
if variant_index != dataful_variant {
1111
1114
let variants_start = niche_variants. start ( ) . as_u32 ( ) ;
1112
1115
let variant_index_relative = variant_index. as_u32 ( )
0 commit comments