@@ -377,7 +377,7 @@ fn check_exhaustive(cx: &MatchCheckCtxt, sp: Span, matrix: &Matrix, source: hir:
377377 hir:: MatchSource :: ForLoopDesugar => {
378378 // `witnesses[0]` has the form `Some(<head>)`, peel off the `Some`
379379 let witness = match witnesses[ 0 ] . node {
380- PatKind :: Enum ( _, Some ( ref pats) ) => match & pats[ ..] {
380+ PatKind :: TupleStruct ( _, Some ( ref pats) ) => match & pats[ ..] {
381381 [ ref pat] => & * * pat,
382382 _ => unreachable ! ( ) ,
383383 } ,
@@ -466,7 +466,7 @@ impl<'map> ast_util::IdVisitingOperation for RenamingRecorder<'map> {
466466impl < ' a , ' tcx > Folder for StaticInliner < ' a , ' tcx > {
467467 fn fold_pat ( & mut self , pat : P < Pat > ) -> P < Pat > {
468468 return match pat. node {
469- PatKind :: Ident ( ..) | PatKind :: Enum ( ..) | PatKind :: QPath ( ..) => {
469+ PatKind :: Ident ( ..) | PatKind :: Path ( ..) | PatKind :: QPath ( ..) => {
470470 let def = self . tcx . def_map . borrow ( ) . get ( & pat. id ) . map ( |d| d. full_def ( ) ) ;
471471 match def {
472472 Some ( Def :: AssociatedConst ( did) ) |
@@ -534,22 +534,28 @@ fn construct_witness<'a,'tcx>(cx: &MatchCheckCtxt<'a,'tcx>, ctor: &Constructor,
534534
535535 ty:: TyEnum ( adt, _) | ty:: TyStruct ( adt, _) => {
536536 let v = adt. variant_of_ctor ( ctor) ;
537- if let VariantKind :: Struct = v. kind ( ) {
538- let field_pats: hir:: HirVec < _ > = v. fields . iter ( )
539- . zip ( pats)
540- . filter ( |& ( _, ref pat) | pat. node != PatKind :: Wild )
541- . map ( |( field, pat) | Spanned {
542- span : DUMMY_SP ,
543- node : hir:: FieldPat {
544- name : field. name ,
545- pat : pat,
546- is_shorthand : false ,
547- }
548- } ) . collect ( ) ;
549- let has_more_fields = field_pats. len ( ) < pats_len;
550- PatKind :: Struct ( def_to_path ( cx. tcx , v. did ) , field_pats, has_more_fields)
551- } else {
552- PatKind :: Enum ( def_to_path ( cx. tcx , v. did ) , Some ( pats. collect ( ) ) )
537+ match v. kind ( ) {
538+ VariantKind :: Struct => {
539+ let field_pats: hir:: HirVec < _ > = v. fields . iter ( )
540+ . zip ( pats)
541+ . filter ( |& ( _, ref pat) | pat. node != PatKind :: Wild )
542+ . map ( |( field, pat) | Spanned {
543+ span : DUMMY_SP ,
544+ node : hir:: FieldPat {
545+ name : field. name ,
546+ pat : pat,
547+ is_shorthand : false ,
548+ }
549+ } ) . collect ( ) ;
550+ let has_more_fields = field_pats. len ( ) < pats_len;
551+ PatKind :: Struct ( def_to_path ( cx. tcx , v. did ) , field_pats, has_more_fields)
552+ }
553+ VariantKind :: Tuple => {
554+ PatKind :: TupleStruct ( def_to_path ( cx. tcx , v. did ) , Some ( pats. collect ( ) ) )
555+ }
556+ VariantKind :: Unit => {
557+ PatKind :: Path ( def_to_path ( cx. tcx , v. did ) )
558+ }
553559 }
554560 }
555561
@@ -769,34 +775,20 @@ fn pat_constructors(cx: &MatchCheckCtxt, p: &Pat,
769775 left_ty : Ty , max_slice_length : usize ) -> Vec < Constructor > {
770776 let pat = raw_pat ( p) ;
771777 match pat. node {
772- PatKind :: Ident ( ..) =>
773- match cx. tcx . def_map . borrow ( ) . get ( & pat. id ) . map ( |d| d. full_def ( ) ) {
774- Some ( Def :: Const ( ..) ) | Some ( Def :: AssociatedConst ( ..) ) =>
775- cx. tcx . sess . span_bug ( pat. span , "const pattern should've \
776- been rewritten") ,
777- Some ( Def :: Struct ( ..) ) => vec ! ( Single ) ,
778- Some ( Def :: Variant ( _, id) ) => vec ! ( Variant ( id) ) ,
779- _ => vec ! ( )
780- } ,
781- PatKind :: Enum ( ..) =>
782- match cx. tcx . def_map . borrow ( ) . get ( & pat. id ) . map ( |d| d. full_def ( ) ) {
783- Some ( Def :: Const ( ..) ) | Some ( Def :: AssociatedConst ( ..) ) =>
778+ PatKind :: Struct ( ..) | PatKind :: TupleStruct ( ..) | PatKind :: Path ( ..) | PatKind :: Ident ( ..) =>
779+ match cx. tcx . def_map . borrow ( ) . get ( & pat. id ) . unwrap ( ) . full_def ( ) {
780+ Def :: Const ( ..) | Def :: AssociatedConst ( ..) =>
784781 cx. tcx . sess . span_bug ( pat. span , "const pattern should've \
785782 been rewritten") ,
786- Some ( Def :: Variant ( _, id) ) => vec ! ( Variant ( id) ) ,
787- _ => vec ! ( Single )
783+ Def :: Struct ( ..) | Def :: TyAlias ( ..) => vec ! [ Single ] ,
784+ Def :: Variant ( _, id) => vec ! [ Variant ( id) ] ,
785+ Def :: Local ( ..) => vec ! [ ] ,
786+ def => cx. tcx . sess . span_bug ( pat. span , & format ! ( "pat_constructors: unexpected \
787+ definition {:?}", def) ) ,
788788 } ,
789789 PatKind :: QPath ( ..) =>
790790 cx. tcx . sess . span_bug ( pat. span , "const pattern should've \
791791 been rewritten") ,
792- PatKind :: Struct ( ..) =>
793- match cx. tcx . def_map . borrow ( ) . get ( & pat. id ) . map ( |d| d. full_def ( ) ) {
794- Some ( Def :: Const ( ..) ) | Some ( Def :: AssociatedConst ( ..) ) =>
795- cx. tcx . sess . span_bug ( pat. span , "const pattern should've \
796- been rewritten") ,
797- Some ( Def :: Variant ( _, id) ) => vec ! ( Variant ( id) ) ,
798- _ => vec ! ( Single )
799- } ,
800792 PatKind :: Lit ( ref expr) =>
801793 vec ! ( ConstantValue ( eval_const_expr( cx. tcx, & expr) ) ) ,
802794 PatKind :: Range ( ref lo, ref hi) =>
@@ -880,22 +872,21 @@ pub fn specialize<'a>(cx: &MatchCheckCtxt, r: &[&'a Pat],
880872 PatKind :: Wild =>
881873 Some ( vec ! [ DUMMY_WILD_PAT ; arity] ) ,
882874
883- PatKind :: Ident ( _ , _ , _ ) => {
884- let opt_def = cx. tcx . def_map . borrow ( ) . get ( & pat_id) . map ( |d| d . full_def ( ) ) ;
885- match opt_def {
886- Some ( Def :: Const ( ..) ) | Some ( Def :: AssociatedConst ( ..) ) =>
875+ PatKind :: Path ( .. ) | PatKind :: Ident ( .. ) => {
876+ let def = cx. tcx . def_map . borrow ( ) . get ( & pat_id) . unwrap ( ) . full_def ( ) ;
877+ match def {
878+ Def :: Const ( ..) | Def :: AssociatedConst ( ..) =>
887879 cx. tcx . sess . span_bug ( pat_span, "const pattern should've \
888880 been rewritten") ,
889- Some ( Def :: Variant ( _, id) ) => if * constructor == Variant ( id) {
890- Some ( vec ! ( ) )
891- } else {
892- None
893- } ,
894- _ => Some ( vec ! [ DUMMY_WILD_PAT ; arity] )
881+ Def :: Variant ( _, id) if * constructor != Variant ( id) => None ,
882+ Def :: Variant ( ..) | Def :: Struct ( ..) => Some ( Vec :: new ( ) ) ,
883+ Def :: Local ( ..) => Some ( vec ! [ DUMMY_WILD_PAT ; arity] ) ,
884+ _ => cx. tcx . sess . span_bug ( pat_span, & format ! ( "specialize: unexpected \
885+ definition {:?}", def) ) ,
895886 }
896887 }
897888
898- PatKind :: Enum ( _, ref args) => {
889+ PatKind :: TupleStruct ( _, ref args) => {
899890 let def = cx. tcx . def_map . borrow ( ) . get ( & pat_id) . unwrap ( ) . full_def ( ) ;
900891 match def {
901892 Def :: Const ( ..) | Def :: AssociatedConst ( ..) =>
0 commit comments