@@ -669,6 +669,23 @@ impl<'a, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M
669
669
( Value :: ByVal ( _) , _) => bug ! ( "expected fat ptr" ) ,
670
670
}
671
671
} else {
672
+ let src_layout = self . layout_of ( src. ty ) ?;
673
+ match src_layout. variants {
674
+ layout:: Variants :: Single { index } => {
675
+ if let Some ( def) = src. ty . ty_adt_def ( ) {
676
+ let discr_val = def
677
+ . discriminant_for_variant ( * self . tcx , index)
678
+ . val ;
679
+ return self . write_primval (
680
+ dest,
681
+ PrimVal :: Bytes ( discr_val) ,
682
+ dest_ty) ;
683
+ }
684
+ }
685
+ layout:: Variants :: Tagged { .. } |
686
+ layout:: Variants :: NicheFilling { .. } => { } ,
687
+ }
688
+
672
689
let src_val = self . value_to_primval ( src) ?;
673
690
let dest_val = self . cast_primval ( src_val, src. ty , dest_ty) ?;
674
691
let valty = ValTy {
@@ -856,7 +873,10 @@ impl<'a, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M
856
873
857
874
match layout. variants {
858
875
layout:: Variants :: Single { index } => {
859
- return Ok ( index as u128 ) ;
876
+ let discr_val = ty. ty_adt_def ( ) . map_or (
877
+ index as u128 ,
878
+ |def| def. discriminant_for_variant ( * self . tcx , index) . val ) ;
879
+ return Ok ( discr_val) ;
860
880
}
861
881
layout:: Variants :: Tagged { .. } |
862
882
layout:: Variants :: NicheFilling { .. } => { } ,
0 commit comments