about summary refs log tree commit diff
path: root/compiler/rustc_const_eval/src
diff options
context:
space:
mode:
authorNilstrieb <48135649+Nilstrieb@users.noreply.github.com>2022-08-06 14:22:57 +0200
committernils <48135649+Nilstrieb@users.noreply.github.com>2022-08-29 16:29:53 +0200
commit96d4137deed6c52c6db2dd19568c37d1c160f1e7 (patch)
tree8fd89d7c977af0e6db3346e6f67754e619b453ec /compiler/rustc_const_eval/src
parent81a583c21e74d600ef8c4b45a3d5088382300e17 (diff)
Only normalize once in mir validator typechecker
Before, it called `normalize_erasing_regions` twice since
`equal_up_to_regions` called it as well for both types.
Diffstat (limited to 'compiler/rustc_const_eval/src')
-rw-r--r--compiler/rustc_const_eval/src/transform/validate.rs25
1 files changed, 10 insertions, 15 deletions
diff --git a/compiler/rustc_const_eval/src/transform/validate.rs b/compiler/rustc_const_eval/src/transform/validate.rs
index ddde9ff4c02..69113e57bdc 100644
--- a/compiler/rustc_const_eval/src/transform/validate.rs
+++ b/compiler/rustc_const_eval/src/transform/validate.rs
@@ -182,27 +182,22 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
             return true;
         }
 
-        let try_equal_with_param_env = |param_env| {
-            let src = self.tcx.normalize_erasing_regions(param_env, src);
-            let dest = self.tcx.normalize_erasing_regions(param_env, dest);
-            // Type-changing assignments can happen when subtyping is used. While
-            // all normal lifetimes are erased, higher-ranked types with their
-            // late-bound lifetimes are still around and can lead to type
-            // differences. So we compare ignoring lifetimes.
-            equal_up_to_regions(self.tcx, param_env, src, dest)
-        };
-
         // Normalize projections and things like that.
+        // Type-changing assignments can happen when subtyping is used. While
+        // all normal lifetimes are erased, higher-ranked types with their
+        // late-bound lifetimes are still around and can lead to type
+        // differences. So we compare ignoring lifetimes.
+
         // First, try with reveal_all. This might not work in some cases, as the predicates
         // can be cleared in reveal_all mode. We try the reveal first anyways as it is used
         // by some other passes like inlining as well.
         let param_env = self.param_env.with_reveal_all_normalized(self.tcx);
-        if try_equal_with_param_env(param_env) {
-            true
-        } else {
-            // If this fails, we can try it without the reveal.
-            try_equal_with_param_env(self.param_env)
+        if equal_up_to_regions(self.tcx, param_env, src, dest) {
+            return true;
         }
+
+        // If this fails, we can try it without the reveal.
+        equal_up_to_regions(self.tcx, self.param_env, src, dest)
     }
 }