@@ -718,7 +718,7 @@ use std::fmt;
718718
719719use crate :: constructor:: { Constructor , ConstructorSet , IntRange } ;
720720use crate :: pat:: { DeconstructedPat , PatOrWild , WitnessPat } ;
721- use crate :: { Captures , MatchArm , MatchCtxt , TypeCx } ;
721+ use crate :: { Captures , MatchArm , TypeCx } ;
722722
723723use self :: ValidityConstraint :: * ;
724724
@@ -729,12 +729,20 @@ pub fn ensure_sufficient_stack<R>(f: impl FnOnce() -> R) -> R {
729729 f ( )
730730}
731731
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+
732740/// Context that provides information local to a place under investigation.
733741#[ derive( derivative:: Derivative ) ]
734742#[ derivative( Debug ( bound = "" ) , Clone ( bound = "" ) , Copy ( bound = "" ) ) ]
735743struct PlaceCtxt < ' a , Cx : TypeCx > {
736744 #[ derivative( Debug = "ignore" ) ]
737- pub ( crate ) mcx : MatchCtxt < ' a , Cx > ,
745+ pub ( crate ) mcx : UsefulnessCtxt < ' a , Cx > ,
738746 /// Type of the place under investigation.
739747 #[ derivative( Clone ( clone_with = "Clone::clone" ) ) ] // See rust-derivative#90
740748 pub ( crate ) ty : & ' a Cx :: Ty ,
@@ -1322,7 +1330,7 @@ impl<Cx: TypeCx> WitnessMatrix<Cx> {
13221330/// We can however get false negatives because exhaustiveness does not explore all cases. See the
13231331/// section on relevancy at the top of the file.
13241332fn collect_overlapping_range_endpoints < ' p , Cx : TypeCx > (
1325- mcx : MatchCtxt < ' _ , Cx > ,
1333+ mcx : UsefulnessCtxt < ' _ , Cx > ,
13261334 overlap_range : IntRange ,
13271335 matrix : & Matrix < ' p , Cx > ,
13281336 specialized_matrix : & Matrix < ' p , Cx > ,
@@ -1395,7 +1403,7 @@ fn collect_overlapping_range_endpoints<'p, Cx: TypeCx>(
13951403/// This is all explained at the top of the file.
13961404#[ instrument( level = "debug" , skip( mcx, is_top_level) , ret) ]
13971405fn compute_exhaustiveness_and_usefulness < ' a , ' p , Cx : TypeCx > (
1398- mcx : MatchCtxt < ' a , Cx > ,
1406+ mcx : UsefulnessCtxt < ' a , Cx > ,
13991407 matrix : & mut Matrix < ' p , Cx > ,
14001408 is_top_level : bool ,
14011409) -> Result < WitnessMatrix < Cx > , Cx :: Error > {
@@ -1545,13 +1553,14 @@ pub struct UsefulnessReport<'p, Cx: TypeCx> {
15451553}
15461554
15471555/// Computes whether a match is exhaustive and which of its arms are useful.
1548- #[ instrument( skip( cx , arms) , level = "debug" ) ]
1556+ #[ instrument( skip( tycx , arms) , level = "debug" ) ]
15491557pub fn compute_match_usefulness < ' p , Cx : TypeCx > (
1550- cx : MatchCtxt < ' _ , Cx > ,
1558+ tycx : & Cx ,
15511559 arms : & [ MatchArm < ' p , Cx > ] ,
15521560 scrut_ty : Cx :: Ty ,
15531561 scrut_validity : ValidityConstraint ,
15541562) -> Result < UsefulnessReport < ' p , Cx > , Cx :: Error > {
1563+ let cx = UsefulnessCtxt { tycx } ;
15551564 let mut matrix = Matrix :: new ( arms, scrut_ty, scrut_validity) ;
15561565 let non_exhaustiveness_witnesses =
15571566 compute_exhaustiveness_and_usefulness ( cx, & mut matrix, true ) ?;
0 commit comments