about summary refs log tree commit diff
diff options
context:
space:
mode:
authorlcnr <rust@lcnr.de>2023-05-26 10:59:01 +0200
committerlcnr <rust@lcnr.de>2023-05-26 11:00:06 +0200
commite7fa993d8980c4a0a199a5018a135e792c051117 (patch)
tree2a56d9e9af70a0dc68ac155808fb03f2fbeed281
parentc86212f9bccb4d5ec625b0607053b067732724ab (diff)
downloadrust-e7fa993d8980c4a0a199a5018a135e792c051117.tar.gz
rust-e7fa993d8980c4a0a199a5018a135e792c051117.zip
do not prefer substs relate during coherence
-rw-r--r--compiler/rustc_trait_selection/src/solve/mod.rs14
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)
+                        }
+                    }
                 }
             }
         }