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,8 @@ use crate::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 almost always come from user input; the only
14+ /// exception are some `Wildcard`s introduced during pattern lowering.
1915///
2016/// Note that the number of fields may not match the fields declared in the original struct/variant.
2117/// This happens if a private or `non_exhaustive` field is uninhabited, because the code mustn't
@@ -28,19 +24,11 @@ pub struct DeconstructedPat<Cx: TypeCx> {
2824 /// Extra data to store in a pattern. `None` if the pattern is a wildcard that does not
2925 /// correspond to a user-supplied pattern.
3026 data : Option < Cx :: PatData > ,
31- /// Whether removing this arm would change the behavior of the match expression.
32- pub ( crate ) useful : Cell < bool > ,
3327}
3428
3529impl < Cx : TypeCx > DeconstructedPat < Cx > {
3630 pub fn wildcard ( ty : Cx :: Ty ) -> Self {
37- DeconstructedPat {
38- ctor : Wildcard ,
39- fields : Vec :: new ( ) ,
40- ty,
41- data : None ,
42- useful : Cell :: new ( false ) ,
43- }
31+ DeconstructedPat { ctor : Wildcard , fields : Vec :: new ( ) , ty, data : None }
4432 }
4533
4634 pub fn new (
@@ -49,7 +37,7 @@ impl<Cx: TypeCx> DeconstructedPat<Cx> {
4937 ty : Cx :: Ty ,
5038 data : Cx :: PatData ,
5139 ) -> Self {
52- DeconstructedPat { ctor, fields, ty, data : Some ( data) , useful : Cell :: new ( false ) }
40+ DeconstructedPat { ctor, fields, ty, data : Some ( data) }
5341 }
5442
5543 pub ( crate ) fn is_or_pat ( & self ) -> bool {
@@ -107,12 +95,6 @@ impl<Cx: TypeCx> DeconstructedPat<Cx> {
10795 }
10896 }
10997
110- /// We keep track for each pattern if it was ever useful during the analysis. This is used with
111- /// `redundant_subpatterns` to report redundant subpatterns arising from or patterns.
112- pub ( crate ) fn set_useful ( & self ) {
113- self . useful . set ( true )
114- }
115-
11698 /// Walk top-down and call `it` in each place where a pattern occurs
11799 /// starting with the root pattern `walk` is called on. If `it` returns
118100 /// false then we will descend no further but siblings will be processed.
@@ -267,12 +249,6 @@ impl<'p, Cx: TypeCx> PatOrWild<'p, Cx> {
267249 PatOrWild :: Pat ( pat) => pat. specialize ( other_ctor, ctor_arity) ,
268250 }
269251 }
270-
271- pub ( crate ) fn set_useful ( & self ) {
272- if let PatOrWild :: Pat ( pat) = self {
273- pat. set_useful ( )
274- }
275- }
276252}
277253
278254impl < ' p , Cx : TypeCx > fmt:: Debug for PatOrWild < ' p , Cx > {
0 commit comments