diff options
| author | Boxy <supbscripter@gmail.com> | 2023-02-10 14:54:50 +0000 |
|---|---|---|
| committer | Boxy <supbscripter@gmail.com> | 2023-02-10 14:56:28 +0000 |
| commit | fa83c10e96bc7eecf2c01a87fa802ee70b42344c (patch) | |
| tree | 2eddd45286e5305402abd575a876b90f3e732285 /compiler/rustc_infer/src/infer/projection.rs | |
| parent | 1f89e2aef272e1222adc4bf95de2baf802c92a2d (diff) | |
| download | rust-fa83c10e96bc7eecf2c01a87fa802ee70b42344c.tar.gz rust-fa83c10e96bc7eecf2c01a87fa802ee70b42344c.zip | |
implement `compute_alias_eq_goal`
Diffstat (limited to 'compiler/rustc_infer/src/infer/projection.rs')
| -rw-r--r-- | compiler/rustc_infer/src/infer/projection.rs | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/compiler/rustc_infer/src/infer/projection.rs b/compiler/rustc_infer/src/infer/projection.rs index 4667d99ff00..f795047709e 100644 --- a/compiler/rustc_infer/src/infer/projection.rs +++ b/compiler/rustc_infer/src/infer/projection.rs @@ -21,16 +21,28 @@ impl<'tcx> InferCtxt<'tcx> { recursion_depth: usize, obligations: &mut Vec<PredicateObligation<'tcx>>, ) -> Ty<'tcx> { - let def_id = projection_ty.def_id; - let ty_var = self.next_ty_var(TypeVariableOrigin { - kind: TypeVariableOriginKind::NormalizeProjectionType, - span: self.tcx.def_span(def_id), - }); - let projection = - ty::Binder::dummy(ty::ProjectionPredicate { projection_ty, term: ty_var.into() }); - let obligation = - Obligation::with_depth(self.tcx, cause, recursion_depth, param_env, projection); - obligations.push(obligation); - ty_var + if self.tcx.trait_solver_next() { + // FIXME(-Ztrait-solver=next): Instead of branching here, + // completely change the normalization routine with the new solver. + // + // The new solver correctly handles projection equality so this hack + // is not necessary. if re-enabled it should emit `PredicateKind::AliasEq` + // not `PredicateKind::Clause(Clause::Projection(..))` as in the new solver + // `Projection` is used as `normalizes-to` which will fail for `<T as Trait>::Assoc eq ?0`. + return projection_ty.to_ty(self.tcx); + } else { + let def_id = projection_ty.def_id; + let ty_var = self.next_ty_var(TypeVariableOrigin { + kind: TypeVariableOriginKind::NormalizeProjectionType, + span: self.tcx.def_span(def_id), + }); + let projection = ty::Binder::dummy(ty::PredicateKind::Clause(ty::Clause::Projection( + ty::ProjectionPredicate { projection_ty, term: ty_var.into() }, + ))); + let obligation = + Obligation::with_depth(self.tcx, cause, recursion_depth, param_env, projection); + obligations.push(obligation); + ty_var + } } } |
