11//! As explained in [`crate::usefulness`], values and patterns are made from constructors applied to
22//! fields. This file defines types that represent patterns in this way.
3- use std:: cell:: Cell ;
43use std:: fmt;
54
65use smallvec:: { smallvec, SmallVec } ;
@@ -11,11 +10,7 @@ use crate::{Captures, TypeCx};
1110use self :: Constructor :: * ;
1211
1312/// Values and patterns can be represented as a constructor applied to some fields. This represents
14- /// a pattern in this form.
15- /// This also uses interior mutability to keep track of whether the pattern has been found reachable
16- /// during analysis. For this reason they cannot be cloned.
17- /// A `DeconstructedPat` will almost always come from user input; the only exception are some
18- /// `Wildcard`s introduced during specialization.
13+ /// a pattern in this form. A `DeconstructedPat` will always come from user input.
1914///
2015/// Note that the number of fields may not match the fields declared in the original struct/variant.
2116/// This happens if a private or `non_exhaustive` field is uninhabited, because the code mustn't
@@ -28,13 +23,11 @@ pub struct DeconstructedPat<'p, Cx: TypeCx> {
2823 /// Extra data to store in a pattern. `None` if the pattern is a wildcard that does not
2924 /// correspond to a user-supplied pattern.
3025 data : Option < Cx :: PatData > ,
31- /// Whether removing this arm would change the behavior of the match expression.
32- pub ( crate ) useful : Cell < bool > ,
3326}
3427
3528impl < ' p , Cx : TypeCx > DeconstructedPat < ' p , Cx > {
3629 pub fn wildcard ( ty : Cx :: Ty ) -> Self {
37- DeconstructedPat { ctor : Wildcard , fields : & [ ] , ty, data : None , useful : Cell :: new ( false ) }
30+ DeconstructedPat { ctor : Wildcard , fields : & [ ] , ty, data : None }
3831 }
3932
4033 pub fn new (
@@ -43,7 +36,7 @@ impl<'p, Cx: TypeCx> DeconstructedPat<'p, Cx> {
4336 ty : Cx :: Ty ,
4437 data : Cx :: PatData ,
4538 ) -> Self {
46- DeconstructedPat { ctor, fields, ty, data : Some ( data) , useful : Cell :: new ( false ) }
39+ DeconstructedPat { ctor, fields, ty, data : Some ( data) }
4740 }
4841
4942 pub ( crate ) fn is_or_pat ( & self ) -> bool {
@@ -101,12 +94,6 @@ impl<'p, Cx: TypeCx> DeconstructedPat<'p, Cx> {
10194 }
10295 }
10396
104- /// We keep track for each pattern if it was ever useful during the analysis. This is used with
105- /// `redundant_subpatterns` to report redundant subpatterns arising from or patterns.
106- pub ( crate ) fn set_useful ( & self ) {
107- self . useful . set ( true )
108- }
109-
11097 /// Walk top-down and call `it` in each place where a pattern occurs
11198 /// starting with the root pattern `walk` is called on. If `it` returns
11299 /// false then we will descend no further but siblings will be processed.
@@ -184,12 +171,6 @@ impl<'p, Cx: TypeCx> PatOrWild<'p, Cx> {
184171 PatOrWild :: Pat ( pat) => pat. specialize ( other_ctor, ctor_arity) ,
185172 }
186173 }
187-
188- pub ( crate ) fn set_useful ( & self ) {
189- if let PatOrWild :: Pat ( pat) = self {
190- pat. set_useful ( )
191- }
192- }
193174}
194175
195176impl < ' p , Cx : TypeCx > fmt:: Debug for PatOrWild < ' p , Cx > {
0 commit comments