diff options
| author | lcnr <rust@lcnr.de> | 2023-05-26 10:59:01 +0200 |
|---|---|---|
| committer | lcnr <rust@lcnr.de> | 2023-05-26 11:00:06 +0200 |
| commit | e7fa993d8980c4a0a199a5018a135e792c051117 (patch) | |
| tree | 2a56d9e9af70a0dc68ac155808fb03f2fbeed281 | |
| parent | c86212f9bccb4d5ec625b0607053b067732724ab (diff) | |
| download | rust-e7fa993d8980c4a0a199a5018a135e792c051117.tar.gz rust-e7fa993d8980c4a0a199a5018a135e792c051117.zip | |
do not prefer substs relate during coherence
| -rw-r--r-- | compiler/rustc_trait_selection/src/solve/mod.rs | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/compiler/rustc_trait_selection/src/solve/mod.rs b/compiler/rustc_trait_selection/src/solve/mod.rs index 26ace28f5fd..b328c1a6dce 100644 --- a/compiler/rustc_trait_selection/src/solve/mod.rs +++ b/compiler/rustc_trait_selection/src/solve/mod.rs @@ -265,10 +265,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) + } + } } } } |
