@@ -743,20 +743,29 @@ impl<'a, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M
743
743
744
744
Discriminant ( ref place) => {
745
745
let ty = self . place_ty ( place) ;
746
+ let layout = self . layout_of ( ty) ?;
746
747
let place = self . eval_place ( place) ?;
747
748
let discr_val = self . read_discriminant_value ( place, ty) ?;
748
- if let ty:: TyAdt ( adt_def, _) = ty. sty {
749
- trace ! ( "Read discriminant {}, valid discriminants {:?}" , discr_val, adt_def. discriminants( * self . tcx) . collect:: <Vec <_>>( ) ) ;
750
- if adt_def. discriminants ( * self . tcx ) . all ( |v| {
751
- discr_val != v. val
752
- } )
753
- {
754
- return err ! ( InvalidDiscriminant ) ;
749
+ match layout. variants {
750
+ layout:: Variants :: Single { index } => {
751
+ assert_eq ! ( discr_val, index as u128 ) ;
752
+ }
753
+ layout:: Variants :: Tagged { .. } |
754
+ layout:: Variants :: NicheFilling { .. } => {
755
+ if let ty:: TyAdt ( adt_def, _) = ty. sty {
756
+ trace ! ( "Read discriminant {}, valid discriminants {:?}" , discr_val, adt_def. discriminants( * self . tcx) . collect:: <Vec <_>>( ) ) ;
757
+ if adt_def. discriminants ( * self . tcx ) . all ( |v| {
758
+ discr_val != v. val
759
+ } )
760
+ {
761
+ return err ! ( InvalidDiscriminant ) ;
762
+ }
763
+ } else {
764
+ bug ! ( "rustc only generates Rvalue::Discriminant for enums" ) ;
765
+ }
755
766
}
756
- self . write_primval ( dest, PrimVal :: Bytes ( discr_val) , dest_ty) ?;
757
- } else {
758
- bug ! ( "rustc only generates Rvalue::Discriminant for enums" ) ;
759
767
}
768
+ self . write_primval ( dest, PrimVal :: Bytes ( discr_val) , dest_ty) ?;
760
769
}
761
770
}
762
771
0 commit comments