diff options
| author | lcnr <rust@lcnr.de> | 2025-08-22 13:39:38 +0200 |
|---|---|---|
| committer | lcnr <rust@lcnr.de> | 2025-08-22 13:39:38 +0200 |
| commit | 17ac2fc96d7dc93b5a02b8f2fe5f03edade6f739 (patch) | |
| tree | 3461f816dae42360712dcd9eddec8a163b6c9df8 /compiler/rustc_hir_analysis/src/check/check.rs | |
| parent | 831e291d3be4cacc4fe178424c4d6baa264d8b5a (diff) | |
| download | rust-17ac2fc96d7dc93b5a02b8f2fe5f03edade6f739.tar.gz rust-17ac2fc96d7dc93b5a02b8f2fe5f03edade6f739.zip | |
change HIR typeck unification handling approach
Diffstat (limited to 'compiler/rustc_hir_analysis/src/check/check.rs')
| -rw-r--r-- | compiler/rustc_hir_analysis/src/check/check.rs | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/compiler/rustc_hir_analysis/src/check/check.rs b/compiler/rustc_hir_analysis/src/check/check.rs index 161a8566b04..eccb88a938f 100644 --- a/compiler/rustc_hir_analysis/src/check/check.rs +++ b/compiler/rustc_hir_analysis/src/check/check.rs @@ -2053,3 +2053,29 @@ pub(super) fn check_coroutine_obligations( Ok(()) } + +pub(super) fn check_potentially_region_dependent_goals<'tcx>( + tcx: TyCtxt<'tcx>, + def_id: LocalDefId, +) -> Result<(), ErrorGuaranteed> { + if !tcx.next_trait_solver_globally() { + return Ok(()); + } + let typeck_results = tcx.typeck(def_id); + let param_env = tcx.param_env(def_id); + + // We use `TypingMode::Borrowck` as we want to use the opaque types computed by HIR typeck. + let typing_mode = TypingMode::borrowck(tcx, def_id); + let infcx = tcx.infer_ctxt().ignoring_regions().build(typing_mode); + let ocx = ObligationCtxt::new_with_diagnostics(&infcx); + for (predicate, cause) in &typeck_results.potentially_region_dependent_goals { + let predicate = fold_regions(tcx, *predicate, |_, _| { + infcx.next_region_var(RegionVariableOrigin::Misc(cause.span)) + }); + ocx.register_obligation(Obligation::new(tcx, cause.clone(), param_env, predicate)); + } + + let errors = ocx.select_all_or_error(); + debug!(?errors); + if errors.is_empty() { Ok(()) } else { Err(infcx.err_ctxt().report_fulfillment_errors(errors)) } +} |
