about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMichael Goulet <michael@errs.io>2024-10-15 15:24:22 -0400
committerMichael Goulet <michael@errs.io>2024-10-24 02:48:28 +0000
commit4217b8702dcd4e45ea506dd0fc8e1cec6115d52a (patch)
tree7d3e6cefc11909984e04928368e4d57af726f853
parent1920c66a8d96978e0d0e5db318fa3e0fb2e0f37e (diff)
downloadrust-4217b8702dcd4e45ea506dd0fc8e1cec6115d52a.tar.gz
rust-4217b8702dcd4e45ea506dd0fc8e1cec6115d52a.zip
Deeply normalize type trace in type error reporting
-rw-r--r--compiler/rustc_trait_selection/src/error_reporting/infer/mod.rs5
-rw-r--r--tests/ui/traits/next-solver/diagnostics/deeply-normalize-type-expectation.rs17
-rw-r--r--tests/ui/traits/next-solver/diagnostics/deeply-normalize-type-expectation.stderr17
3 files changed, 38 insertions, 1 deletions
diff --git a/compiler/rustc_trait_selection/src/error_reporting/infer/mod.rs b/compiler/rustc_trait_selection/src/error_reporting/infer/mod.rs
index fd991100879..b9a569d25e3 100644
--- a/compiler/rustc_trait_selection/src/error_reporting/infer/mod.rs
+++ b/compiler/rustc_trait_selection/src/error_reporting/infer/mod.rs
@@ -1252,8 +1252,11 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
         }
         let (expected_found, exp_found, is_simple_error, values) = match values {
             None => (None, Mismatch::Fixed("type"), false, None),
-            Some(ty::ParamEnvAnd { param_env: _, value: values }) => {
+            Some(ty::ParamEnvAnd { param_env, value: values }) => {
                 let mut values = self.resolve_vars_if_possible(values);
+                if self.next_trait_solver() {
+                    values = deeply_normalize_for_diagnostics(self, param_env, values);
+                }
                 let (is_simple_error, exp_found) = match values {
                     ValuePairs::Terms(ExpectedFound { expected, found }) => {
                         match (expected.unpack(), found.unpack()) {
diff --git a/tests/ui/traits/next-solver/diagnostics/deeply-normalize-type-expectation.rs b/tests/ui/traits/next-solver/diagnostics/deeply-normalize-type-expectation.rs
new file mode 100644
index 00000000000..5c53b745933
--- /dev/null
+++ b/tests/ui/traits/next-solver/diagnostics/deeply-normalize-type-expectation.rs
@@ -0,0 +1,17 @@
+//@ compile-flags: -Znext-solver
+
+// Make sure we try to mention a deeply normalized type in a type mismatch error.
+
+trait Mirror {
+    type Assoc;
+}
+impl<T> Mirror for T {
+    type Assoc = T;
+}
+
+fn needs<T>(_: <T as Mirror>::Assoc) {}
+
+fn main() {
+    needs::<i32>(());
+    //~^ ERROR mismatched types
+}
diff --git a/tests/ui/traits/next-solver/diagnostics/deeply-normalize-type-expectation.stderr b/tests/ui/traits/next-solver/diagnostics/deeply-normalize-type-expectation.stderr
new file mode 100644
index 00000000000..88643945863
--- /dev/null
+++ b/tests/ui/traits/next-solver/diagnostics/deeply-normalize-type-expectation.stderr
@@ -0,0 +1,17 @@
+error[E0308]: mismatched types
+  --> $DIR/deeply-normalize-type-expectation.rs:15:18
+   |
+LL |     needs::<i32>(());
+   |     ------------ ^^ expected `i32`, found `()`
+   |     |
+   |     arguments to this function are incorrect
+   |
+note: function defined here
+  --> $DIR/deeply-normalize-type-expectation.rs:12:4
+   |
+LL | fn needs<T>(_: <T as Mirror>::Assoc) {}
+   |    ^^^^^    -----------------------
+
+error: aborting due to 1 previous error
+
+For more information about this error, try `rustc --explain E0308`.