@@ -743,20 +743,29 @@ impl<'a, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M
743743
744744 Discriminant ( ref place) => {
745745 let ty = self . place_ty ( place) ;
746+ let layout = self . layout_of ( ty) ?;
746747 let place = self . eval_place ( place) ?;
747748 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+ }
755766 }
756- self . write_primval ( dest, PrimVal :: Bytes ( discr_val) , dest_ty) ?;
757- } else {
758- bug ! ( "rustc only generates Rvalue::Discriminant for enums" ) ;
759767 }
768+ self . write_primval ( dest, PrimVal :: Bytes ( discr_val) , dest_ty) ?;
760769 }
761770 }
762771
0 commit comments