diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2023-05-27 00:24:00 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-05-27 00:24:00 +0200 |
| commit | dfdbf1b1333a920bd5ca25f47fbedea82df33b3e (patch) | |
| tree | 31c9e9e81ee2998453d21e9f90f16421d346f3bb | |
| parent | a81ef8aa0808a74583f7ede012eafd067fb1e071 (diff) | |
| parent | b6b9611190905d75ad2abe3ae3f61835afc4c82c (diff) | |
| download | rust-dfdbf1b1333a920bd5ca25f47fbedea82df33b3e.tar.gz rust-dfdbf1b1333a920bd5ca25f47fbedea82df33b3e.zip | |
Rollup merge of #111987 - lcnr:alias-relate-coherence, r=BoxyUwU
do not prefer substs relate during coherence r? ```@compiler-errors```
| -rw-r--r-- | compiler/rustc_trait_selection/src/solve/mod.rs | 34 |
1 files changed, 25 insertions, 9 deletions
diff --git a/compiler/rustc_trait_selection/src/solve/mod.rs b/compiler/rustc_trait_selection/src/solve/mod.rs index 26ace28f5fd..56a254d9c07 100644 --- a/compiler/rustc_trait_selection/src/solve/mod.rs +++ b/compiler/rustc_trait_selection/src/solve/mod.rs @@ -231,13 +231,21 @@ impl<'a, 'tcx> EvalCtxt<'a, 'tcx> { let mut candidates = Vec::new(); // LHS normalizes-to RHS - candidates.extend( - evaluate_normalizes_to(self, alias_lhs, rhs, direction, Invert::No).ok(), - ); + candidates.extend(evaluate_normalizes_to( + self, + alias_lhs, + rhs, + direction, + Invert::No, + )); // RHS normalizes-to RHS - candidates.extend( - evaluate_normalizes_to(self, alias_rhs, lhs, direction, Invert::Yes).ok(), - ); + candidates.extend(evaluate_normalizes_to( + self, + alias_rhs, + lhs, + direction, + Invert::Yes, + )); // Relate via substs let subst_relate_response = self.probe(|ecx| { let span = tracing::span!( @@ -265,10 +273,18 @@ impl<'a, 'tcx> EvalCtxt<'a, 'tcx> { if let Some(merged) = self.try_merge_responses(&candidates) { Ok(merged) - } else if let Ok(subst_relate_response) = subst_relate_response { - Ok(subst_relate_response) } else { - self.flounder(&candidates) + // When relating two aliases and we have ambiguity, we prefer + // relating the generic arguments of the aliases over normalizing + // them. This is necessary for inference during typeck. + // + // As this is incomplete, we must not do so during coherence. + match (self.solver_mode(), subst_relate_response) { + (SolverMode::Normal, Ok(response)) => Ok(response), + (SolverMode::Normal, Err(NoSolution)) | (SolverMode::Coherence, _) => { + self.flounder(&candidates) + } + } } } } |
