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