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.
This commit is contained in:
parent
81a583c21e
commit
96d4137dee
@ -182,27 +182,22 @@ fn mir_assign_valid_types(&self, src: Ty<'tcx>, dest: Ty<'tcx>) -> bool {
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user