Rollup merge of #134742 - compiler-errors:post-borrowck-analysis, r=lcnr
Use `PostBorrowckAnalysis` in `check_coroutine_obligations` This currently errors with: ``` error: concrete type differs from previous defining opaque type use --> tests/ui/coroutine/issue-52304.rs:10:21 | 10 | pub fn example() -> impl Coroutine { | ^^^^^^^^^^^^^^ expected `{example::{closure#0} upvar_tys=() resume_ty=() yield_ty=&'{erased} i32 return_ty=() witness={example::{closure#0}}}`, got `{example::{closure#0} upvar_tys=() resume_ty=() yield_ty=&'static i32 return_ty=() witness={example::{closure#0}}}` | = note: previous use here ``` This is because we end up redefining the opaque in `check_coroutine_obligations` but with the `yield_ty = &'erased i32` from hir typeck, which causes the *equality* check for opaques to fail. The coroutine obligtions in question (when `-Znext-solver` is enabled) are: ``` Binder { value: TraitPredicate(<Opaque(DefId(0:5 ~ issue_52304[4c6d]::example::{opaque#0}), []) as std::marker::Sized>, polarity:Positive), bound_vars: [] } Binder { value: AliasRelate(Term::Ty(Alias(Opaque, AliasTy { args: [], def_id: DefId(0:5 ~ issue_52304[4c6d]::example::{opaque#0}), .. })), Equate, Term::Ty(Coroutine(DefId(0:6 ~ issue_52304[4c6d]::example::{closure#0}), [(), (), &'{erased} i32, (), CoroutineWitness(DefId(0:6 ~ issue_52304[4c6d]::example::{closure#0}), []), ()]))), bound_vars: [] } Binder { value: AliasRelate(Term::Ty(Coroutine(DefId(0:6 ~ issue_52304[4c6d]::example::{closure#0}), [(), (), &'{erased} i32, (), CoroutineWitness(DefId(0:6 ~ issue_52304[4c6d]::example::{closure#0}), []), ()])), Subtype, Term::Ty(Alias(Opaque, AliasTy { args: [], def_id: DefId(0:5 ~ issue_52304[4c6d]::example::{opaque#0}), .. }))), bound_vars: [] } ``` Ignoring the fact that we end up stalling some really dumb obligations here (lol), I think it makes more sense for us to be using post borrowck analysis for this check anyways. r? lcnr
This commit is contained in:
commit
49b05ed7c1
2 changed files with 17 additions and 8 deletions
|
@ -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(())
|
||||||
|
|
|
@ -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)]
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue