@@ -1346,7 +1346,8 @@ pub(crate) struct DeconstructedPat<'p, 'tcx> {
13461346 fields : Fields < ' p , ' tcx > ,
13471347 ty : Ty < ' tcx > ,
13481348 span : Span ,
1349- reachable : Cell < bool > ,
1349+ /// Whether removing this arm would change the behavior of the match expression.
1350+ useful : Cell < bool > ,
13501351}
13511352
13521353impl < ' p , ' tcx > DeconstructedPat < ' p , ' tcx > {
@@ -1360,7 +1361,7 @@ impl<'p, 'tcx> DeconstructedPat<'p, 'tcx> {
13601361 ty : Ty < ' tcx > ,
13611362 span : Span ,
13621363 ) -> Self {
1363- DeconstructedPat { ctor, fields, ty, span, reachable : Cell :: new ( false ) }
1364+ DeconstructedPat { ctor, fields, ty, span, useful : Cell :: new ( false ) }
13641365 }
13651366
13661367 /// Note: the input patterns must have been lowered through
@@ -1635,38 +1636,38 @@ impl<'p, 'tcx> DeconstructedPat<'p, 'tcx> {
16351636 }
16361637 }
16371638
1638- /// We keep track for each pattern if it was ever reachable during the analysis. This is used
1639- /// with `unreachable_spans ` to report unreachable subpatterns arising from or patterns.
1640- pub ( super ) fn set_reachable ( & self ) {
1641- self . reachable . set ( true )
1639+ /// We keep track for each pattern if it was ever useful during the analysis. This is used
1640+ /// with `redundant_spans ` to report redundant subpatterns arising from or patterns.
1641+ pub ( super ) fn set_useful ( & self ) {
1642+ self . useful . set ( true )
16421643 }
1643- pub ( super ) fn is_reachable ( & self ) -> bool {
1644- if self . reachable . get ( ) {
1644+ pub ( super ) fn is_useful ( & self ) -> bool {
1645+ if self . useful . get ( ) {
16451646 true
1646- } else if self . is_or_pat ( ) && self . iter_fields ( ) . any ( |f| f. is_reachable ( ) ) {
1647+ } else if self . is_or_pat ( ) && self . iter_fields ( ) . any ( |f| f. is_useful ( ) ) {
16471648 // We always expand or patterns in the matrix, so we will never see the actual
16481649 // or-pattern (the one with constructor `Or`) in the column. As such, it will not be
1649- // marked as reachable itself, only its children will. We recover this information here.
1650- self . set_reachable ( ) ;
1650+ // marked as useful itself, only its children will. We recover this information here.
1651+ self . set_useful ( ) ;
16511652 true
16521653 } else {
16531654 false
16541655 }
16551656 }
16561657
1657- /// Report the spans of subpatterns that were not reachable , if any.
1658- pub ( super ) fn unreachable_spans ( & self ) -> Vec < Span > {
1658+ /// Report the spans of subpatterns that were not useful , if any.
1659+ pub ( super ) fn redundant_spans ( & self ) -> Vec < Span > {
16591660 let mut spans = Vec :: new ( ) ;
1660- self . collect_unreachable_spans ( & mut spans) ;
1661+ self . collect_redundant_spans ( & mut spans) ;
16611662 spans
16621663 }
1663- fn collect_unreachable_spans ( & self , spans : & mut Vec < Span > ) {
1664- // We don't look at subpatterns if we already reported the whole pattern as unreachable .
1665- if !self . is_reachable ( ) {
1664+ fn collect_redundant_spans ( & self , spans : & mut Vec < Span > ) {
1665+ // We don't look at subpatterns if we already reported the whole pattern as redundant .
1666+ if !self . is_useful ( ) {
16661667 spans. push ( self . span ) ;
16671668 } else {
16681669 for p in self . iter_fields ( ) {
1669- p. collect_unreachable_spans ( spans) ;
1670+ p. collect_redundant_spans ( spans) ;
16701671 }
16711672 }
16721673 }
0 commit comments