@@ -1038,23 +1038,26 @@ where
1038
1038
variant_index : VariantIdx ,
1039
1039
dest : PlaceTy < ' tcx , M :: PointerTag > ,
1040
1040
) -> InterpResult < ' tcx > {
1041
- let variant_scalar = Scalar :: from_u32 ( variant_index. as_u32 ( ) ) . into ( ) ;
1041
+
1042
+ // Layout computation excludes uninhabited variants from consideration
1043
+ // therefore there's no way to represent those variants in the given layout.
1044
+ if dest. layout . for_variant ( self , variant_index) . abi . is_uninhabited ( ) {
1045
+ throw_ub ! ( Unreachable ) ;
1046
+ }
1042
1047
1043
1048
match dest. layout . variants {
1044
1049
layout:: Variants :: Single { index } => {
1045
- if index != variant_index {
1046
- throw_ub ! ( InvalidDiscriminant ( variant_scalar) ) ;
1047
- }
1050
+ assert_eq ! ( index, variant_index) ;
1048
1051
}
1049
1052
layout:: Variants :: Multiple {
1050
1053
discr_kind : layout:: DiscriminantKind :: Tag ,
1051
1054
discr : ref discr_layout,
1052
1055
discr_index,
1053
1056
..
1054
1057
} => {
1055
- if !dest . layout . ty . variant_range ( * self . tcx ) . unwrap ( ) . contains ( & variant_index ) {
1056
- throw_ub ! ( InvalidDiscriminant ( variant_scalar ) ) ;
1057
- }
1058
+ // No need to validate that the discriminant here because the
1059
+ // `TyLayout::for_variant()` call earlier already checks the variant is valid.
1060
+
1058
1061
let discr_val =
1059
1062
dest. layout . ty . discriminant_for_variant ( * self . tcx , variant_index) . unwrap ( ) . val ;
1060
1063
@@ -1077,9 +1080,9 @@ where
1077
1080
discr_index,
1078
1081
..
1079
1082
} => {
1080
- if !variant_index . as_usize ( ) < dest . layout . ty . ty_adt_def ( ) . unwrap ( ) . variants . len ( ) {
1081
- throw_ub ! ( InvalidDiscriminant ( variant_scalar ) ) ;
1082
- }
1083
+ // No need to validate that the discriminant here because the
1084
+ // `TyLayout::for_variant()` call earlier already checks the variant is valid.
1085
+
1083
1086
if variant_index != dataful_variant {
1084
1087
let variants_start = niche_variants. start ( ) . as_u32 ( ) ;
1085
1088
let variant_index_relative = variant_index. as_u32 ( )
0 commit comments