@@ -655,44 +655,45 @@ impl<'tcx> Constructor<'tcx> {
655655 . into_iter ( )
656656 . flat_map ( |pos_ctor| -> SmallVec < [ Constructor < ' tcx > ; 1 ] > {
657657 // Compute `pos_ctor \ neg_ctor`.
658- match ( & pos_ctor, neg_ctor) {
659- ( & FixedLenSlice ( pos_len) , & VarLenSlice ( neg_prefix, neg_suffix) ) => {
660- let neg_len = neg_prefix + neg_suffix;
661- if neg_len <= pos_len {
658+ match pos_ctor {
659+ FixedLenSlice ( pos_len) => match * neg_ctor {
660+ FixedLenSlice ( neg_len) if neg_len == pos_len => smallvec ! [ ] ,
661+ VarLenSlice ( neg_prefix, neg_suffix)
662+ if neg_prefix + neg_suffix <= pos_len =>
663+ {
662664 smallvec ! [ ]
663- } else {
664- smallvec ! [ pos_ctor]
665665 }
666- }
667- (
668- & VarLenSlice ( pos_prefix, pos_suffix) ,
669- & VarLenSlice ( neg_prefix, neg_suffix) ,
670- ) => {
671- let neg_len = neg_prefix + neg_suffix;
672- let pos_len = pos_prefix + pos_suffix;
673- if neg_len <= pos_len {
674- smallvec ! [ ]
675- } else {
676- ( pos_len..neg_len) . map ( FixedLenSlice ) . collect ( )
677- }
678- }
679- ( & VarLenSlice ( pos_prefix, pos_suffix) , & FixedLenSlice ( neg_len) ) => {
666+ _ => smallvec ! [ pos_ctor] ,
667+ } ,
668+ VarLenSlice ( pos_prefix, pos_suffix) => {
680669 let pos_len = pos_prefix + pos_suffix;
681- if neg_len < pos_len {
682- smallvec ! [ pos_ctor]
683- } else {
684- ( pos_len..neg_len)
685- . map ( FixedLenSlice )
686- // We know that `neg_len + 1 >= pos_len >= pos_suffix`.
687- . chain ( Some ( VarLenSlice (
688- neg_len + 1 - pos_suffix,
689- pos_suffix,
690- ) ) )
691- . collect ( )
670+ match * neg_ctor {
671+ FixedLenSlice ( neg_len) if neg_len >= pos_len => {
672+ ( pos_len..neg_len)
673+ . map ( FixedLenSlice )
674+ // We know that `neg_len + 1 >= pos_len >=
675+ // pos_suffix`.
676+ . chain ( Some ( VarLenSlice (
677+ neg_len + 1 - pos_suffix,
678+ pos_suffix,
679+ ) ) )
680+ . collect ( )
681+ }
682+ VarLenSlice ( neg_prefix, neg_suffix) => {
683+ let neg_len = neg_prefix + neg_suffix;
684+ if neg_len <= pos_len {
685+ smallvec ! [ ]
686+ } else {
687+ ( pos_len..neg_len) . map ( FixedLenSlice ) . collect ( )
688+ }
689+ }
690+ _ => smallvec ! [ pos_ctor] ,
692691 }
693692 }
694- _ if pos_ctor == * neg_ctor => smallvec ! [ ] ,
695- _ => smallvec ! [ pos_ctor] ,
693+ _ => bug ! (
694+ "unexpected ctor while subtracting from VarLenSlice: {:?}" ,
695+ pos_ctor
696+ ) ,
696697 }
697698 } )
698699 . collect ( ) ;
0 commit comments