@@ -1346,7 +1346,8 @@ pub(crate) struct DeconstructedPat<'p, 'tcx> {
1346
1346
fields : Fields < ' p , ' tcx > ,
1347
1347
ty : Ty < ' tcx > ,
1348
1348
span : Span ,
1349
- reachable : Cell < bool > ,
1349
+ /// Whether removing this arm would change the behavior of the match expression.
1350
+ useful : Cell < bool > ,
1350
1351
}
1351
1352
1352
1353
impl < ' p , ' tcx > DeconstructedPat < ' p , ' tcx > {
@@ -1360,7 +1361,7 @@ impl<'p, 'tcx> DeconstructedPat<'p, 'tcx> {
1360
1361
ty : Ty < ' tcx > ,
1361
1362
span : Span ,
1362
1363
) -> Self {
1363
- DeconstructedPat { ctor, fields, ty, span, reachable : Cell :: new ( false ) }
1364
+ DeconstructedPat { ctor, fields, ty, span, useful : Cell :: new ( false ) }
1364
1365
}
1365
1366
1366
1367
/// Note: the input patterns must have been lowered through
@@ -1635,38 +1636,38 @@ impl<'p, 'tcx> DeconstructedPat<'p, 'tcx> {
1635
1636
}
1636
1637
}
1637
1638
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 )
1642
1643
}
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 ( ) {
1645
1646
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 ( ) ) {
1647
1648
// We always expand or patterns in the matrix, so we will never see the actual
1648
1649
// 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 ( ) ;
1651
1652
true
1652
1653
} else {
1653
1654
false
1654
1655
}
1655
1656
}
1656
1657
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 > {
1659
1660
let mut spans = Vec :: new ( ) ;
1660
- self . collect_unreachable_spans ( & mut spans) ;
1661
+ self . collect_redundant_spans ( & mut spans) ;
1661
1662
spans
1662
1663
}
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 ( ) {
1666
1667
spans. push ( self . span ) ;
1667
1668
} else {
1668
1669
for p in self . iter_fields ( ) {
1669
- p. collect_unreachable_spans ( spans) ;
1670
+ p. collect_redundant_spans ( spans) ;
1670
1671
}
1671
1672
}
1672
1673
}
0 commit comments