diff options
| author | Michael Goulet <michael@errs.io> | 2023-04-11 21:15:39 +0000 |
|---|---|---|
| committer | Michael Goulet <michael@errs.io> | 2023-04-14 03:13:56 +0000 |
| commit | b335c2d49f1698ada99e3622d3cd482c27c9fc9b (patch) | |
| tree | 86599bb811efc618bf26f829b8717d1ccb1609fb /compiler/rustc_trait_selection/src/solve/trait_goals.rs | |
| parent | a41fc00eaf352541008965fec0dee811e44373b3 (diff) | |
| download | rust-b335c2d49f1698ada99e3622d3cd482c27c9fc9b.tar.gz rust-b335c2d49f1698ada99e3622d3cd482c27c9fc9b.zip | |
Assemble Unpin candidates specially for generators in new solver
Diffstat (limited to 'compiler/rustc_trait_selection/src/solve/trait_goals.rs')
| -rw-r--r-- | compiler/rustc_trait_selection/src/solve/trait_goals.rs | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/compiler/rustc_trait_selection/src/solve/trait_goals.rs b/compiler/rustc_trait_selection/src/solve/trait_goals.rs index 716d5acb324..73c599e1814 100644 --- a/compiler/rustc_trait_selection/src/solve/trait_goals.rs +++ b/compiler/rustc_trait_selection/src/solve/trait_goals.rs @@ -3,7 +3,7 @@ use super::assembly::{self, structural_traits}; use super::{EvalCtxt, SolverMode}; use rustc_hir::def_id::DefId; -use rustc_hir::LangItem; +use rustc_hir::{LangItem, Movability}; use rustc_infer::traits::query::NoSolution; use rustc_infer::traits::util::supertraits; use rustc_middle::traits::solve::{CanonicalResponse, Certainty, Goal, QueryResult}; @@ -168,6 +168,23 @@ impl<'tcx> assembly::GoalKind<'tcx> for TraitPredicate<'tcx> { ty::Infer(_) | ty::Bound(_, _) => bug!("unexpected type `{self_ty}`"), + // Generators have one special built-in candidate, `Unpin`, which + // takes precedence over the structural auto trait candidate being + // assembled. + ty::Generator(_, _, movability) + if Some(goal.predicate.def_id()) == ecx.tcx().lang_items().unpin_trait() => + { + match movability { + Movability::Static => { + return Err(NoSolution); + } + Movability::Movable => { + return ecx + .evaluate_added_goals_and_make_canonical_response(Certainty::Yes); + } + } + } + // For rigid types, we only register a builtin auto implementation // if there is no implementation that could ever apply to the self // type. |
