1
Fork 0

Use PostBorrowckAnalysis in check_coroutine_obligations

This commit is contained in:
Michael Goulet 2024-12-25 01:27:21 +00:00
parent 409998c4e8
commit 2c31c55020
2 changed files with 17 additions and 8 deletions

View file

@ -1845,13 +1845,18 @@ pub(super) fn check_coroutine_obligations(
debug!(?typeck_results.coroutine_stalled_predicates); debug!(?typeck_results.coroutine_stalled_predicates);
let mode = if tcx.next_trait_solver_globally() {
TypingMode::post_borrowck_analysis(tcx, def_id)
} else {
TypingMode::analysis_in_body(tcx, def_id)
};
let infcx = tcx let infcx = tcx
.infer_ctxt() .infer_ctxt()
// typeck writeback gives us predicates with their regions erased. // typeck writeback gives us predicates with their regions erased.
// As borrowck already has checked lifetimes, we do not need to do it again. // As borrowck already has checked lifetimes, we do not need to do it again.
.ignoring_regions() .ignoring_regions()
// FIXME(#132279): This should eventually use the already defined hidden types. .build(mode);
.build(TypingMode::analysis_in_body(tcx, def_id));
let ocx = ObligationCtxt::new_with_diagnostics(&infcx); let ocx = ObligationCtxt::new_with_diagnostics(&infcx);
for (predicate, cause) in &typeck_results.coroutine_stalled_predicates { for (predicate, cause) in &typeck_results.coroutine_stalled_predicates {
@ -1864,12 +1869,14 @@ pub(super) fn check_coroutine_obligations(
return Err(infcx.err_ctxt().report_fulfillment_errors(errors)); return Err(infcx.err_ctxt().report_fulfillment_errors(errors));
} }
// Check that any hidden types found when checking these stalled coroutine obligations if !tcx.next_trait_solver_globally() {
// are valid. // Check that any hidden types found when checking these stalled coroutine obligations
for (key, ty) in infcx.take_opaque_types() { // are valid.
let hidden_type = infcx.resolve_vars_if_possible(ty.hidden_type); for (key, ty) in infcx.take_opaque_types() {
let key = infcx.resolve_vars_if_possible(key); let hidden_type = infcx.resolve_vars_if_possible(ty.hidden_type);
sanity_check_found_hidden_type(tcx, key, hidden_type)?; let key = infcx.resolve_vars_if_possible(key);
sanity_check_found_hidden_type(tcx, key, hidden_type)?;
}
} }
Ok(()) Ok(())

View file

@ -1,4 +1,6 @@
//@ check-pass //@ check-pass
//@ revisions: current next
//@ ignore-compare-mode-next-solver (explicit revisions)
#![feature(coroutines, coroutine_trait)] #![feature(coroutines, coroutine_trait)]