@@ -10,10 +10,8 @@ use rustc_hir as hir;
1010use rustc_hir:: def_id:: { DefId , LocalDefId , LocalModDefId } ;
1111use rustc_hir:: lang_items:: LangItem ;
1212use 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 ;
1514use rustc_infer:: infer:: { self , InferCtxt , TyCtxtInferExt } ;
16- use rustc_middle:: mir:: ConstraintCategory ;
1715use rustc_middle:: query:: Providers ;
1816use rustc_middle:: ty:: print:: with_no_trimmed_paths;
1917use rustc_middle:: ty:: trait_def:: TraitSpecializationKind ;
@@ -26,6 +24,7 @@ use rustc_session::parse::feature_err;
2624use rustc_span:: symbol:: { sym, Ident , Symbol } ;
2725use rustc_span:: { Span , DUMMY_SP } ;
2826use rustc_target:: spec:: abi:: Abi ;
27+ use rustc_trait_selection:: regions:: InferCtxtRegionExt ;
2928use rustc_trait_selection:: traits:: error_reporting:: TypeErrCtxtExt ;
3029use rustc_trait_selection:: traits:: misc:: {
3130 type_allowed_to_implement_const_param_ty, ConstParamTyImplementationError ,
@@ -731,10 +730,12 @@ fn ty_known_to_outlive<'tcx>(
731730 ty : Ty < ' tcx > ,
732731 region : ty:: Region < ' tcx > ,
733732) -> 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 ) ;
733+ test_region_obligations ( tcx, id, param_env, wf_tys, |infcx| {
734+ infcx. register_region_obligation ( infer:: RegionObligation {
735+ sub_region : region,
736+ sup_type : ty,
737+ origin : infer:: RelateParamBound ( DUMMY_SP , ty, None ) ,
738+ } ) ;
738739 } )
739740}
740741
@@ -748,40 +749,32 @@ fn region_known_to_outlive<'tcx>(
748749 region_a : ty:: Region < ' tcx > ,
749750 region_b : ty:: Region < ' tcx > ,
750751) -> 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- ) ;
752+ test_region_obligations ( tcx, id, param_env, wf_tys, |infcx| {
753+ infcx. sub_regions ( infer:: RelateRegionParamBound ( DUMMY_SP ) , region_b, region_a) ;
761754 } )
762755}
763756
764757/// Given a known `param_env` and a set of well formed types, set up an
765758/// `InferCtxt`, call the passed function (to e.g. set up region constraints
766759/// to be tested), then resolve region and return errors
767- fn resolve_regions_with_wf_tys < ' tcx > (
760+ fn test_region_obligations < ' tcx > (
768761 tcx : TyCtxt < ' tcx > ,
769762 id : LocalDefId ,
770763 param_env : ty:: ParamEnv < ' tcx > ,
771764 wf_tys : & FxIndexSet < Ty < ' tcx > > ,
772- add_constraints : impl for < ' a > FnOnce ( & ' a InferCtxt < ' tcx > , & ' a RegionBoundPairs < ' tcx > ) ,
765+ add_constraints : impl FnOnce ( & InferCtxt < ' tcx > ) ,
773766) -> bool {
774767 // Unfortunately, we have to use a new `InferCtxt` each call, because
775768 // region constraints get added and solved there and we need to test each
776769 // call individually.
777770 let infcx = tcx. infer_ctxt ( ) . build ( ) ;
771+
772+ add_constraints ( & infcx) ;
773+
778774 let outlives_environment = OutlivesEnvironment :: with_bounds (
779775 param_env,
780776 infcx. implied_bounds_tys ( param_env, id, wf_tys) ,
781777 ) ;
782- let region_bound_pairs = outlives_environment. region_bound_pairs ( ) ;
783-
784- add_constraints ( & infcx, region_bound_pairs) ;
785778
786779 let errors = infcx. resolve_regions ( & outlives_environment) ;
787780 debug ! ( ?errors, "errors" ) ;
0 commit comments