@@ -718,7 +718,7 @@ use std::fmt;
718
718
719
719
use crate :: constructor:: { Constructor , ConstructorSet , IntRange } ;
720
720
use crate :: pat:: { DeconstructedPat , PatOrWild , WitnessPat } ;
721
- use crate :: { Captures , MatchArm , MatchCtxt , TypeCx } ;
721
+ use crate :: { Captures , MatchArm , TypeCx } ;
722
722
723
723
use self :: ValidityConstraint :: * ;
724
724
@@ -729,12 +729,20 @@ pub fn ensure_sufficient_stack<R>(f: impl FnOnce() -> R) -> R {
729
729
f ( )
730
730
}
731
731
732
+ /// Context that provides information for usefulness checking.
733
+ #[ derive( derivative:: Derivative ) ]
734
+ #[ derivative( Clone ( bound = "" ) , Copy ( bound = "" ) ) ]
735
+ pub struct UsefulnessCtxt < ' a , Cx : TypeCx > {
736
+ /// The context for type information.
737
+ pub tycx : & ' a Cx ,
738
+ }
739
+
732
740
/// Context that provides information local to a place under investigation.
733
741
#[ derive( derivative:: Derivative ) ]
734
742
#[ derivative( Debug ( bound = "" ) , Clone ( bound = "" ) , Copy ( bound = "" ) ) ]
735
743
struct PlaceCtxt < ' a , Cx : TypeCx > {
736
744
#[ derivative( Debug = "ignore" ) ]
737
- pub ( crate ) mcx : MatchCtxt < ' a , Cx > ,
745
+ pub ( crate ) mcx : UsefulnessCtxt < ' a , Cx > ,
738
746
/// Type of the place under investigation.
739
747
#[ derivative( Clone ( clone_with = "Clone::clone" ) ) ] // See rust-derivative#90
740
748
pub ( crate ) ty : & ' a Cx :: Ty ,
@@ -1324,7 +1332,7 @@ impl<Cx: TypeCx> WitnessMatrix<Cx> {
1324
1332
/// We can however get false negatives because exhaustiveness does not explore all cases. See the
1325
1333
/// section on relevancy at the top of the file.
1326
1334
fn collect_overlapping_range_endpoints < ' p , Cx : TypeCx > (
1327
- mcx : MatchCtxt < ' _ , Cx > ,
1335
+ mcx : UsefulnessCtxt < ' _ , Cx > ,
1328
1336
overlap_range : IntRange ,
1329
1337
matrix : & Matrix < ' p , Cx > ,
1330
1338
specialized_matrix : & Matrix < ' p , Cx > ,
@@ -1397,7 +1405,7 @@ fn collect_overlapping_range_endpoints<'p, Cx: TypeCx>(
1397
1405
/// This is all explained at the top of the file.
1398
1406
#[ instrument( level = "debug" , skip( mcx, is_top_level) , ret) ]
1399
1407
fn compute_exhaustiveness_and_usefulness < ' a , ' p , Cx : TypeCx > (
1400
- mcx : MatchCtxt < ' a , Cx > ,
1408
+ mcx : UsefulnessCtxt < ' a , Cx > ,
1401
1409
matrix : & mut Matrix < ' p , Cx > ,
1402
1410
is_top_level : bool ,
1403
1411
) -> Result < WitnessMatrix < Cx > , Cx :: Error > {
@@ -1547,13 +1555,14 @@ pub struct UsefulnessReport<'p, Cx: TypeCx> {
1547
1555
}
1548
1556
1549
1557
/// Computes whether a match is exhaustive and which of its arms are useful.
1550
- #[ instrument( skip( cx , arms) , level = "debug" ) ]
1558
+ #[ instrument( skip( tycx , arms) , level = "debug" ) ]
1551
1559
pub fn compute_match_usefulness < ' p , Cx : TypeCx > (
1552
- cx : MatchCtxt < ' _ , Cx > ,
1560
+ tycx : & Cx ,
1553
1561
arms : & [ MatchArm < ' p , Cx > ] ,
1554
1562
scrut_ty : Cx :: Ty ,
1555
1563
scrut_validity : ValidityConstraint ,
1556
1564
) -> Result < UsefulnessReport < ' p , Cx > , Cx :: Error > {
1565
+ let cx = UsefulnessCtxt { tycx } ;
1557
1566
let mut matrix = Matrix :: new ( arms, scrut_ty, scrut_validity) ;
1558
1567
let non_exhaustiveness_witnesses =
1559
1568
compute_exhaustiveness_and_usefulness ( cx, & mut matrix, true ) ?;
0 commit comments