@@ -445,6 +445,7 @@ impl<'p, 'tcx: 'p> RustcMatchCheckCtxt<'p, 'tcx> {
445445 let cx = self ;
446446 let ty = cx. reveal_opaque_ty ( pat. ty ) ;
447447 let ctor;
448+ let arity;
448449 let mut fields: Vec < _ > ;
449450 match & pat. kind {
450451 PatKind :: AscribeUserType { subpattern, .. }
@@ -453,9 +454,11 @@ impl<'p, 'tcx: 'p> RustcMatchCheckCtxt<'p, 'tcx> {
453454 PatKind :: Binding { subpattern : None , .. } | PatKind :: Wild => {
454455 ctor = Wildcard ;
455456 fields = vec ! [ ] ;
457+ arity = 0 ;
456458 }
457459 PatKind :: Deref { subpattern } => {
458460 fields = vec ! [ self . lower_pat( subpattern) ] ;
461+ arity = 1 ;
459462 ctor = match ty. kind ( ) {
460463 // This is a box pattern.
461464 ty:: Adt ( adt, ..) if adt. is_box ( ) => Struct ,
@@ -467,6 +470,7 @@ impl<'p, 'tcx: 'p> RustcMatchCheckCtxt<'p, 'tcx> {
467470 match ty. kind ( ) {
468471 ty:: Tuple ( fs) => {
469472 ctor = Struct ;
473+ arity = fs. len ( ) ;
470474 fields = fs
471475 . iter ( )
472476 . map ( |ty| cx. reveal_opaque_ty ( ty) )
@@ -497,6 +501,7 @@ impl<'p, 'tcx: 'p> RustcMatchCheckCtxt<'p, 'tcx> {
497501 } ;
498502 ctor = Struct ;
499503 fields = vec ! [ pat] ;
504+ arity = 1 ;
500505 }
501506 ty:: Adt ( adt, _) => {
502507 ctor = match pat. kind {
@@ -507,6 +512,7 @@ impl<'p, 'tcx: 'p> RustcMatchCheckCtxt<'p, 'tcx> {
507512 } ;
508513 let variant =
509514 & adt. variant ( RustcMatchCheckCtxt :: variant_index_for_adt ( & ctor, * adt) ) ;
515+ arity = variant. fields . len ( ) ;
510516 fields = cx
511517 . variant_sub_tys ( ty, variant)
512518 . map ( |( _, ty) | DeconstructedPat :: wildcard ( ty) )
@@ -526,6 +532,7 @@ impl<'p, 'tcx: 'p> RustcMatchCheckCtxt<'p, 'tcx> {
526532 None => Opaque ( OpaqueId :: new ( ) ) ,
527533 } ;
528534 fields = vec ! [ ] ;
535+ arity = 0 ;
529536 }
530537 ty:: Char | ty:: Int ( _) | ty:: Uint ( _) => {
531538 ctor = match value. try_eval_bits ( cx. tcx , cx. param_env ) {
@@ -542,6 +549,7 @@ impl<'p, 'tcx: 'p> RustcMatchCheckCtxt<'p, 'tcx> {
542549 None => Opaque ( OpaqueId :: new ( ) ) ,
543550 } ;
544551 fields = vec ! [ ] ;
552+ arity = 0 ;
545553 }
546554 ty:: Float ( ty:: FloatTy :: F32 ) => {
547555 ctor = match value. try_eval_bits ( cx. tcx , cx. param_env ) {
@@ -553,6 +561,7 @@ impl<'p, 'tcx: 'p> RustcMatchCheckCtxt<'p, 'tcx> {
553561 None => Opaque ( OpaqueId :: new ( ) ) ,
554562 } ;
555563 fields = vec ! [ ] ;
564+ arity = 0 ;
556565 }
557566 ty:: Float ( ty:: FloatTy :: F64 ) => {
558567 ctor = match value. try_eval_bits ( cx. tcx , cx. param_env ) {
@@ -564,6 +573,7 @@ impl<'p, 'tcx: 'p> RustcMatchCheckCtxt<'p, 'tcx> {
564573 None => Opaque ( OpaqueId :: new ( ) ) ,
565574 } ;
566575 fields = vec ! [ ] ;
576+ arity = 0 ;
567577 }
568578 ty:: Ref ( _, t, _) if t. is_str ( ) => {
569579 // We want a `&str` constant to behave like a `Deref` pattern, to be compatible
@@ -574,16 +584,18 @@ impl<'p, 'tcx: 'p> RustcMatchCheckCtxt<'p, 'tcx> {
574584 // subfields.
575585 // Note: `t` is `str`, not `&str`.
576586 let ty = self . reveal_opaque_ty ( * t) ;
577- let subpattern = DeconstructedPat :: new ( Str ( * value) , Vec :: new ( ) , ty, pat) ;
587+ let subpattern = DeconstructedPat :: new ( Str ( * value) , Vec :: new ( ) , 0 , ty, pat) ;
578588 ctor = Ref ;
579- fields = vec ! [ subpattern]
589+ fields = vec ! [ subpattern] ;
590+ arity = 1 ;
580591 }
581592 // All constants that can be structurally matched have already been expanded
582593 // into the corresponding `Pat`s by `const_to_pat`. Constants that remain are
583594 // opaque.
584595 _ => {
585596 ctor = Opaque ( OpaqueId :: new ( ) ) ;
586597 fields = vec ! [ ] ;
598+ arity = 0 ;
587599 }
588600 }
589601 }
@@ -621,6 +633,7 @@ impl<'p, 'tcx: 'p> RustcMatchCheckCtxt<'p, 'tcx> {
621633 _ => bug ! ( "invalid type for range pattern: {}" , ty. inner( ) ) ,
622634 } ;
623635 fields = vec ! [ ] ;
636+ arity = 0 ;
624637 }
625638 PatKind :: Array { prefix, slice, suffix } | PatKind :: Slice { prefix, slice, suffix } => {
626639 let array_len = match ty. kind ( ) {
@@ -637,25 +650,29 @@ impl<'p, 'tcx: 'p> RustcMatchCheckCtxt<'p, 'tcx> {
637650 } ;
638651 ctor = Slice ( Slice :: new ( array_len, kind) ) ;
639652 fields = prefix. iter ( ) . chain ( suffix. iter ( ) ) . map ( |p| self . lower_pat ( & * p) ) . collect ( ) ;
653+ arity = kind. arity ( ) ;
640654 }
641655 PatKind :: Or { .. } => {
642656 ctor = Or ;
643657 let pats = expand_or_pat ( pat) ;
644658 fields = pats. into_iter ( ) . map ( |p| self . lower_pat ( p) ) . collect ( ) ;
659+ arity = fields. len ( ) ;
645660 }
646661 PatKind :: Never => {
647662 // A never pattern matches all the values of its type (namely none). Moreover it
648663 // must be compatible with other constructors, since we can use `!` on a type like
649664 // `Result<!, !>` which has other constructors. Hence we lower it as a wildcard.
650665 ctor = Wildcard ;
651666 fields = vec ! [ ] ;
667+ arity = 0 ;
652668 }
653669 PatKind :: Error ( _) => {
654670 ctor = Opaque ( OpaqueId :: new ( ) ) ;
655671 fields = vec ! [ ] ;
672+ arity = 0 ;
656673 }
657674 }
658- DeconstructedPat :: new ( ctor, fields, ty, pat)
675+ DeconstructedPat :: new ( ctor, fields, arity , ty, pat)
659676 }
660677
661678 /// Convert back to a `thir::PatRangeBoundary` for diagnostic purposes.
0 commit comments