@@ -10,10 +10,8 @@ use rustc_hir as hir;
10
10
use rustc_hir:: def_id:: { DefId , LocalDefId , LocalModDefId } ;
11
11
use rustc_hir:: lang_items:: LangItem ;
12
12
use rustc_hir:: ItemKind ;
13
- use rustc_infer:: infer:: outlives:: env:: { OutlivesEnvironment , RegionBoundPairs } ;
14
- use rustc_infer:: infer:: outlives:: obligations:: TypeOutlives ;
13
+ use rustc_infer:: infer:: outlives:: env:: OutlivesEnvironment ;
15
14
use rustc_infer:: infer:: { self , InferCtxt , TyCtxtInferExt } ;
16
- use rustc_middle:: mir:: ConstraintCategory ;
17
15
use rustc_middle:: query:: Providers ;
18
16
use rustc_middle:: ty:: print:: with_no_trimmed_paths;
19
17
use rustc_middle:: ty:: trait_def:: TraitSpecializationKind ;
@@ -26,6 +24,7 @@ use rustc_session::parse::feature_err;
26
24
use rustc_span:: symbol:: { sym, Ident , Symbol } ;
27
25
use rustc_span:: { Span , DUMMY_SP } ;
28
26
use rustc_target:: spec:: abi:: Abi ;
27
+ use rustc_trait_selection:: regions:: InferCtxtRegionExt ;
29
28
use rustc_trait_selection:: traits:: error_reporting:: TypeErrCtxtExt ;
30
29
use rustc_trait_selection:: traits:: misc:: {
31
30
type_allowed_to_implement_const_param_ty, ConstParamTyImplementationError ,
@@ -136,7 +135,7 @@ where
136
135
infcx. implied_bounds_tys_compat ( param_env, body_def_id, & assumed_wf_types, false ) ;
137
136
let outlives_env = OutlivesEnvironment :: with_bounds ( param_env, implied_bounds) ;
138
137
139
- let errors = infcx. resolve_regions ( & outlives_env) ;
138
+ let errors = infcx. resolve_regions_normalizing_outlives_obligations ( & outlives_env) ;
140
139
if errors. is_empty ( ) {
141
140
return Ok ( ( ) ) ;
142
141
}
@@ -177,7 +176,8 @@ where
177
176
let implied_bounds =
178
177
infcx_compat. implied_bounds_tys_compat ( param_env, body_def_id, & assumed_wf_types, true ) ;
179
178
let outlives_env = OutlivesEnvironment :: with_bounds ( param_env, implied_bounds) ;
180
- let errors_compat = infcx_compat. resolve_regions ( & outlives_env) ;
179
+ let errors_compat =
180
+ infcx_compat. resolve_regions_normalizing_outlives_obligations ( & outlives_env) ;
181
181
if errors_compat. is_empty ( ) {
182
182
Ok ( ( ) )
183
183
} else {
@@ -731,10 +731,12 @@ fn ty_known_to_outlive<'tcx>(
731
731
ty : Ty < ' tcx > ,
732
732
region : ty:: Region < ' tcx > ,
733
733
) -> bool {
734
- resolve_regions_with_wf_tys ( tcx, id, param_env, wf_tys, |infcx, region_bound_pairs| {
735
- let origin = infer:: RelateParamBound ( DUMMY_SP , ty, None ) ;
736
- let outlives = & mut TypeOutlives :: new ( infcx, tcx, region_bound_pairs, None , param_env) ;
737
- outlives. type_must_outlive ( origin, ty, region, ConstraintCategory :: BoringNoLocation ) ;
734
+ test_region_obligations ( tcx, id, param_env, wf_tys, |infcx| {
735
+ infcx. register_region_obligation ( infer:: RegionObligation {
736
+ sub_region : region,
737
+ sup_type : ty,
738
+ origin : infer:: RelateParamBound ( DUMMY_SP , ty, None ) ,
739
+ } ) ;
738
740
} )
739
741
}
740
742
@@ -748,42 +750,34 @@ fn region_known_to_outlive<'tcx>(
748
750
region_a : ty:: Region < ' tcx > ,
749
751
region_b : ty:: Region < ' tcx > ,
750
752
) -> bool {
751
- resolve_regions_with_wf_tys ( tcx, id, param_env, wf_tys, |mut infcx, _| {
752
- use rustc_infer:: infer:: outlives:: obligations:: TypeOutlivesDelegate ;
753
- let origin = infer:: RelateRegionParamBound ( DUMMY_SP ) ;
754
- // `region_a: region_b` -> `region_b <= region_a`
755
- infcx. push_sub_region_constraint (
756
- origin,
757
- region_b,
758
- region_a,
759
- ConstraintCategory :: BoringNoLocation ,
760
- ) ;
753
+ test_region_obligations ( tcx, id, param_env, wf_tys, |infcx| {
754
+ infcx. sub_regions ( infer:: RelateRegionParamBound ( DUMMY_SP ) , region_b, region_a) ;
761
755
} )
762
756
}
763
757
764
758
/// Given a known `param_env` and a set of well formed types, set up an
765
759
/// `InferCtxt`, call the passed function (to e.g. set up region constraints
766
760
/// to be tested), then resolve region and return errors
767
- fn resolve_regions_with_wf_tys < ' tcx > (
761
+ fn test_region_obligations < ' tcx > (
768
762
tcx : TyCtxt < ' tcx > ,
769
763
id : LocalDefId ,
770
764
param_env : ty:: ParamEnv < ' tcx > ,
771
765
wf_tys : & FxIndexSet < Ty < ' tcx > > ,
772
- add_constraints : impl for < ' a > FnOnce ( & ' a InferCtxt < ' tcx > , & ' a RegionBoundPairs < ' tcx > ) ,
766
+ add_constraints : impl FnOnce ( & InferCtxt < ' tcx > ) ,
773
767
) -> bool {
774
768
// Unfortunately, we have to use a new `InferCtxt` each call, because
775
769
// region constraints get added and solved there and we need to test each
776
770
// call individually.
777
771
let infcx = tcx. infer_ctxt ( ) . build ( ) ;
772
+
773
+ add_constraints ( & infcx) ;
774
+
778
775
let outlives_environment = OutlivesEnvironment :: with_bounds (
779
776
param_env,
780
777
infcx. implied_bounds_tys ( param_env, id, wf_tys) ,
781
778
) ;
782
- let region_bound_pairs = outlives_environment. region_bound_pairs ( ) ;
783
-
784
- add_constraints ( & infcx, region_bound_pairs) ;
785
779
786
- let errors = infcx. resolve_regions ( & outlives_environment) ;
780
+ let errors = infcx. resolve_regions_normalizing_outlives_obligations ( & outlives_environment) ;
787
781
debug ! ( ?errors, "errors" ) ;
788
782
789
783
// If we were able to prove that the type outlives the region without
0 commit comments