diff options
| author | Michael Goulet <michael@errs.io> | 2025-03-22 23:49:14 +0000 |
|---|---|---|
| committer | Michael Goulet <michael@errs.io> | 2025-04-22 16:50:38 +0000 |
| commit | 169955f3be4659e486db9b7dabafdbcee18819a3 (patch) | |
| tree | 3f177bf429a65bf9e08c8dbfe33384a0a00a7ad4 /compiler/rustc_next_trait_solver/src | |
| parent | 67df5b9cfa990720d6606c663e451acd059def47 (diff) | |
| download | rust-169955f3be4659e486db9b7dabafdbcee18819a3.tar.gz rust-169955f3be4659e486db9b7dabafdbcee18819a3.zip | |
Properly drain pending obligations for coroutines
Diffstat (limited to 'compiler/rustc_next_trait_solver/src')
3 files changed, 20 insertions, 2 deletions
diff --git a/compiler/rustc_next_trait_solver/src/solve/mod.rs b/compiler/rustc_next_trait_solver/src/solve/mod.rs index 7641e9a16ee..8868769906d 100644 --- a/compiler/rustc_next_trait_solver/src/solve/mod.rs +++ b/compiler/rustc_next_trait_solver/src/solve/mod.rs @@ -329,7 +329,10 @@ where TypingMode::Coherence | TypingMode::PostAnalysis => false, // During analysis, opaques are rigid unless they may be defined by // the current body. - TypingMode::Analysis { defining_opaque_types: non_rigid_opaques } + TypingMode::Analysis { + defining_opaque_types: non_rigid_opaques, + stalled_generators: _, + } | TypingMode::Borrowck { defining_opaque_types: non_rigid_opaques } | TypingMode::PostBorrowckAnalysis { defined_opaque_types: non_rigid_opaques } => { !def_id.as_local().is_some_and(|def_id| non_rigid_opaques.contains(&def_id)) diff --git a/compiler/rustc_next_trait_solver/src/solve/normalizes_to/opaque_types.rs b/compiler/rustc_next_trait_solver/src/solve/normalizes_to/opaque_types.rs index aa89e77bb6f..dcfc3b3a701 100644 --- a/compiler/rustc_next_trait_solver/src/solve/normalizes_to/opaque_types.rs +++ b/compiler/rustc_next_trait_solver/src/solve/normalizes_to/opaque_types.rs @@ -33,7 +33,7 @@ where ); self.evaluate_added_goals_and_make_canonical_response(Certainty::AMBIGUOUS) } - TypingMode::Analysis { defining_opaque_types } => { + TypingMode::Analysis { defining_opaque_types, stalled_generators: _ } => { let Some(def_id) = opaque_ty .def_id .as_local() diff --git a/compiler/rustc_next_trait_solver/src/solve/trait_goals.rs b/compiler/rustc_next_trait_solver/src/solve/trait_goals.rs index 7bd1300f34e..38c4d0205cd 100644 --- a/compiler/rustc_next_trait_solver/src/solve/trait_goals.rs +++ b/compiler/rustc_next_trait_solver/src/solve/trait_goals.rs @@ -208,6 +208,21 @@ where } } + if let ty::CoroutineWitness(def_id, _) = goal.predicate.self_ty().kind() { + match ecx.typing_mode() { + TypingMode::Analysis { stalled_generators, defining_opaque_types: _ } => { + if def_id.as_local().is_some_and(|def_id| stalled_generators.contains(&def_id)) + { + return ecx.forced_ambiguity(MaybeCause::Ambiguity); + } + } + TypingMode::Coherence + | TypingMode::PostAnalysis + | TypingMode::Borrowck { defining_opaque_types: _ } + | TypingMode::PostBorrowckAnalysis { defined_opaque_types: _ } => {} + } + } + ecx.probe_and_evaluate_goal_for_constituent_tys( CandidateSource::BuiltinImpl(BuiltinImplSource::Misc), goal, |
