@@ -445,6 +445,7 @@ impl<'p, 'tcx: 'p> RustcMatchCheckCtxt<'p, 'tcx> {
445
445
let cx = self ;
446
446
let ty = cx. reveal_opaque_ty ( pat. ty ) ;
447
447
let ctor;
448
+ let arity;
448
449
let mut fields: Vec < _ > ;
449
450
match & pat. kind {
450
451
PatKind :: AscribeUserType { subpattern, .. }
@@ -453,9 +454,11 @@ impl<'p, 'tcx: 'p> RustcMatchCheckCtxt<'p, 'tcx> {
453
454
PatKind :: Binding { subpattern : None , .. } | PatKind :: Wild => {
454
455
ctor = Wildcard ;
455
456
fields = vec ! [ ] ;
457
+ arity = 0 ;
456
458
}
457
459
PatKind :: Deref { subpattern } => {
458
460
fields = vec ! [ self . lower_pat( subpattern) ] ;
461
+ arity = 1 ;
459
462
ctor = match ty. kind ( ) {
460
463
// This is a box pattern.
461
464
ty:: Adt ( adt, ..) if adt. is_box ( ) => Struct ,
@@ -467,6 +470,7 @@ impl<'p, 'tcx: 'p> RustcMatchCheckCtxt<'p, 'tcx> {
467
470
match ty. kind ( ) {
468
471
ty:: Tuple ( fs) => {
469
472
ctor = Struct ;
473
+ arity = fs. len ( ) ;
470
474
fields = fs
471
475
. iter ( )
472
476
. map ( |ty| cx. reveal_opaque_ty ( ty) )
@@ -497,6 +501,7 @@ impl<'p, 'tcx: 'p> RustcMatchCheckCtxt<'p, 'tcx> {
497
501
} ;
498
502
ctor = Struct ;
499
503
fields = vec ! [ pat] ;
504
+ arity = 1 ;
500
505
}
501
506
ty:: Adt ( adt, _) => {
502
507
ctor = match pat. kind {
@@ -507,6 +512,7 @@ impl<'p, 'tcx: 'p> RustcMatchCheckCtxt<'p, 'tcx> {
507
512
} ;
508
513
let variant =
509
514
& adt. variant ( RustcMatchCheckCtxt :: variant_index_for_adt ( & ctor, * adt) ) ;
515
+ arity = variant. fields . len ( ) ;
510
516
fields = cx
511
517
. variant_sub_tys ( ty, variant)
512
518
. map ( |( _, ty) | DeconstructedPat :: wildcard ( ty) )
@@ -526,6 +532,7 @@ impl<'p, 'tcx: 'p> RustcMatchCheckCtxt<'p, 'tcx> {
526
532
None => Opaque ( OpaqueId :: new ( ) ) ,
527
533
} ;
528
534
fields = vec ! [ ] ;
535
+ arity = 0 ;
529
536
}
530
537
ty:: Char | ty:: Int ( _) | ty:: Uint ( _) => {
531
538
ctor = match value. try_eval_bits ( cx. tcx , cx. param_env ) {
@@ -542,6 +549,7 @@ impl<'p, 'tcx: 'p> RustcMatchCheckCtxt<'p, 'tcx> {
542
549
None => Opaque ( OpaqueId :: new ( ) ) ,
543
550
} ;
544
551
fields = vec ! [ ] ;
552
+ arity = 0 ;
545
553
}
546
554
ty:: Float ( ty:: FloatTy :: F32 ) => {
547
555
ctor = match value. try_eval_bits ( cx. tcx , cx. param_env ) {
@@ -553,6 +561,7 @@ impl<'p, 'tcx: 'p> RustcMatchCheckCtxt<'p, 'tcx> {
553
561
None => Opaque ( OpaqueId :: new ( ) ) ,
554
562
} ;
555
563
fields = vec ! [ ] ;
564
+ arity = 0 ;
556
565
}
557
566
ty:: Float ( ty:: FloatTy :: F64 ) => {
558
567
ctor = match value. try_eval_bits ( cx. tcx , cx. param_env ) {
@@ -564,6 +573,7 @@ impl<'p, 'tcx: 'p> RustcMatchCheckCtxt<'p, 'tcx> {
564
573
None => Opaque ( OpaqueId :: new ( ) ) ,
565
574
} ;
566
575
fields = vec ! [ ] ;
576
+ arity = 0 ;
567
577
}
568
578
ty:: Ref ( _, t, _) if t. is_str ( ) => {
569
579
// 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> {
574
584
// subfields.
575
585
// Note: `t` is `str`, not `&str`.
576
586
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) ;
578
588
ctor = Ref ;
579
- fields = vec ! [ subpattern]
589
+ fields = vec ! [ subpattern] ;
590
+ arity = 1 ;
580
591
}
581
592
// All constants that can be structurally matched have already been expanded
582
593
// into the corresponding `Pat`s by `const_to_pat`. Constants that remain are
583
594
// opaque.
584
595
_ => {
585
596
ctor = Opaque ( OpaqueId :: new ( ) ) ;
586
597
fields = vec ! [ ] ;
598
+ arity = 0 ;
587
599
}
588
600
}
589
601
}
@@ -623,6 +635,7 @@ impl<'p, 'tcx: 'p> RustcMatchCheckCtxt<'p, 'tcx> {
623
635
_ => bug ! ( "invalid type for range pattern: {}" , ty. inner( ) ) ,
624
636
} ;
625
637
fields = vec ! [ ] ;
638
+ arity = 0 ;
626
639
}
627
640
PatKind :: Array { prefix, slice, suffix } | PatKind :: Slice { prefix, slice, suffix } => {
628
641
let array_len = match ty. kind ( ) {
@@ -639,25 +652,29 @@ impl<'p, 'tcx: 'p> RustcMatchCheckCtxt<'p, 'tcx> {
639
652
} ;
640
653
ctor = Slice ( Slice :: new ( array_len, kind) ) ;
641
654
fields = prefix. iter ( ) . chain ( suffix. iter ( ) ) . map ( |p| self . lower_pat ( & * p) ) . collect ( ) ;
655
+ arity = kind. arity ( ) ;
642
656
}
643
657
PatKind :: Or { .. } => {
644
658
ctor = Or ;
645
659
let pats = expand_or_pat ( pat) ;
646
660
fields = pats. into_iter ( ) . map ( |p| self . lower_pat ( p) ) . collect ( ) ;
661
+ arity = fields. len ( ) ;
647
662
}
648
663
PatKind :: Never => {
649
664
// A never pattern matches all the values of its type (namely none). Moreover it
650
665
// must be compatible with other constructors, since we can use `!` on a type like
651
666
// `Result<!, !>` which has other constructors. Hence we lower it as a wildcard.
652
667
ctor = Wildcard ;
653
668
fields = vec ! [ ] ;
669
+ arity = 0 ;
654
670
}
655
671
PatKind :: Error ( _) => {
656
672
ctor = Opaque ( OpaqueId :: new ( ) ) ;
657
673
fields = vec ! [ ] ;
674
+ arity = 0 ;
658
675
}
659
676
}
660
- DeconstructedPat :: new ( ctor, fields, ty, pat)
677
+ DeconstructedPat :: new ( ctor, fields, arity , ty, pat)
661
678
}
662
679
663
680
/// Convert back to a `thir::PatRangeBoundary` for diagnostic purposes.
0 commit comments