typeck::check::coercion - roll back failed unsizing type vars
This wraps unsizing coercions within an additional level of `commit_if_ok`, which rolls back type variables if the unsizing coercion fails. This prevents a large amount of type-variables from accumulating while type-checking a large function, e.g. shaving 2GB off one of the 4GB peaks in #36799.
This commit is contained in:
parent
acb73dbe8b
commit
9d6b9d62ba
1 changed files with 5 additions and 1 deletions
|
@ -187,7 +187,11 @@ impl<'f, 'gcx, 'tcx> Coerce<'f, 'gcx, 'tcx> {
|
|||
}
|
||||
|
||||
// Consider coercing the subtype to a DST
|
||||
let unsize = self.coerce_unsized(a, b);
|
||||
//
|
||||
// NOTE: this is wrapped in a `commit_if_ok` because it creates
|
||||
// a "spurious" type variable, and we don't want to have that
|
||||
// type variable in memory if the coercion fails.
|
||||
let unsize = self.commit_if_ok(|_| self.coerce_unsized(a, b));
|
||||
if unsize.is_ok() {
|
||||
debug!("coerce: unsize successful");
|
||||
return unsize;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue