Rollup merge of #130617 - lcnr:nalgebra-hang-3, r=compiler-errors
bail if there are too many non-region infer vars in the query response A minimal fix for the hang in nalgebra. If the query response would result in too many distinct non-region inference variables, simply overwrite the result with overflow. This should either happen if the result already has too many distinct type inference variables, or if evaluating the query encountered a lot of ambiguous associated types. In both cases it's straightforward to wait until the aliases are no longer ambiguous and then try again. r? `@compiler-errors`
This commit is contained in:
commit
7adf4c2b6f
@ -157,6 +157,17 @@ where
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// HACK: We bail with overflow if the response would have too many non-region
|
||||||
|
// inference variables. This tends to only happen if we encounter a lot of
|
||||||
|
// ambiguous alias types which get replaced with fresh inference variables
|
||||||
|
// during generalization. This prevents a hang in nalgebra.
|
||||||
|
let num_non_region_vars = canonical.variables.iter().filter(|c| !c.is_region()).count();
|
||||||
|
if num_non_region_vars > self.cx().recursion_limit() {
|
||||||
|
return Ok(self.make_ambiguous_response_no_constraints(MaybeCause::Overflow {
|
||||||
|
suggest_increasing_limit: true,
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
Ok(canonical)
|
Ok(canonical)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
//@ check-pass
|
//@ check-pass
|
||||||
|
//@ revisions: current next
|
||||||
|
//[next]@ compile-flags: -Znext-solver
|
||||||
|
|
||||||
// Regression test for nalgebra hang <https://github.com/rust-lang/rust/issues/130056>.
|
// Regression test for nalgebra hang <https://github.com/rust-lang/rust/issues/130056>.
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@ error[E0275]: overflow evaluating the requirement `W<_>: Trait`
|
|||||||
LL | impls::<W<_>>();
|
LL | impls::<W<_>>();
|
||||||
| ^^^^
|
| ^^^^
|
||||||
|
|
|
|
||||||
|
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`fixpoint_exponential_growth`)
|
||||||
note: required by a bound in `impls`
|
note: required by a bound in `impls`
|
||||||
--> $DIR/fixpoint-exponential-growth.rs:30:13
|
--> $DIR/fixpoint-exponential-growth.rs:30:13
|
||||||
|
|
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
|
//~ ERROR overflow evaluating the requirement `Self: Trait`
|
||||||
|
//~^ ERROR overflow evaluating the requirement `Self well-formed`
|
||||||
// This is a non-regression test for issue #115351, where a recursion limit of 0 caused an ICE.
|
// This is a non-regression test for issue #115351, where a recursion limit of 0 caused an ICE.
|
||||||
//@ compile-flags: -Znext-solver --crate-type=lib
|
//@ compile-flags: -Znext-solver --crate-type=lib
|
||||||
//@ check-pass
|
|
||||||
|
|
||||||
#![recursion_limit = "0"]
|
#![recursion_limit = "0"]
|
||||||
trait Trait {}
|
trait Trait {}
|
||||||
|
@ -0,0 +1,11 @@
|
|||||||
|
error[E0275]: overflow evaluating the requirement `Self: Trait`
|
||||||
|
|
|
||||||
|
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "2"]` attribute to your crate (`recursion_limit_zero_issue_115351`)
|
||||||
|
|
||||||
|
error[E0275]: overflow evaluating the requirement `Self well-formed`
|
||||||
|
|
|
||||||
|
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "2"]` attribute to your crate (`recursion_limit_zero_issue_115351`)
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0275`.
|
Loading…
x
Reference in New Issue
Block a user