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;
|
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.
|
// 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
|
// 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
|
// 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.
|
// by some other passes like inlining as well.
|
||||||
let param_env = self.param_env.with_reveal_all_normalized(self.tcx);
|
let param_env = self.param_env.with_reveal_all_normalized(self.tcx);
|
||||||
if try_equal_with_param_env(param_env) {
|
if equal_up_to_regions(self.tcx, param_env, src, dest) {
|
||||||
true
|
return true;
|
||||||
} else {
|
|
||||||
// If this fails, we can try it without the reveal.
|
|
||||||
try_equal_with_param_env(self.param_env)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 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