Skip to content

Commit 49b05ed

Browse files
authored
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
2 parents 243d2ca + 2c31c55 commit 49b05ed

File tree

2 files changed

+17
-8
lines changed

2 files changed

+17
-8
lines changed

compiler/rustc_hir_analysis/src/check/check.rs

+15-8
Original file line numberDiff line numberDiff line change
@@ -1845,13 +1845,18 @@ pub(super) fn check_coroutine_obligations(
18451845

18461846
debug!(?typeck_results.coroutine_stalled_predicates);
18471847

1848+
let mode = if tcx.next_trait_solver_globally() {
1849+
TypingMode::post_borrowck_analysis(tcx, def_id)
1850+
} else {
1851+
TypingMode::analysis_in_body(tcx, def_id)
1852+
};
1853+
18481854
let infcx = tcx
18491855
.infer_ctxt()
18501856
// typeck writeback gives us predicates with their regions erased.
18511857
// As borrowck already has checked lifetimes, we do not need to do it again.
18521858
.ignoring_regions()
1853-
// FIXME(#132279): This should eventually use the already defined hidden types.
1854-
.build(TypingMode::analysis_in_body(tcx, def_id));
1859+
.build(mode);
18551860

18561861
let ocx = ObligationCtxt::new_with_diagnostics(&infcx);
18571862
for (predicate, cause) in &typeck_results.coroutine_stalled_predicates {
@@ -1864,12 +1869,14 @@ pub(super) fn check_coroutine_obligations(
18641869
return Err(infcx.err_ctxt().report_fulfillment_errors(errors));
18651870
}
18661871

1867-
// Check that any hidden types found when checking these stalled coroutine obligations
1868-
// are valid.
1869-
for (key, ty) in infcx.take_opaque_types() {
1870-
let hidden_type = infcx.resolve_vars_if_possible(ty.hidden_type);
1871-
let key = infcx.resolve_vars_if_possible(key);
1872-
sanity_check_found_hidden_type(tcx, key, hidden_type)?;
1872+
if !tcx.next_trait_solver_globally() {
1873+
// Check that any hidden types found when checking these stalled coroutine obligations
1874+
// are valid.
1875+
for (key, ty) in infcx.take_opaque_types() {
1876+
let hidden_type = infcx.resolve_vars_if_possible(ty.hidden_type);
1877+
let key = infcx.resolve_vars_if_possible(key);
1878+
sanity_check_found_hidden_type(tcx, key, hidden_type)?;
1879+
}
18731880
}
18741881

18751882
Ok(())

tests/ui/coroutine/issue-52304.rs

+2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
//@ check-pass
2+
//@ revisions: current next
3+
//@ ignore-compare-mode-next-solver (explicit revisions)
24

35
#![feature(coroutines, coroutine_trait)]
46

0 commit comments

Comments
 (0)