diff options
| author | Guillaume Gomez <guillaume1.gomez@gmail.com> | 2024-09-20 19:46:40 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-09-20 19:46:40 +0200 |
| commit | 7adf4c2b6f8246d29abe3617f2d9d875ce91e9cc (patch) | |
| tree | 0d46bc00c69f22c7730c971fb293bb100c5b3c98 /compiler | |
| parent | df2b730e01f5fa6f7f27b0a6761457f91b4778d3 (diff) | |
| parent | a6aeba83beac8173bcc1eb819441e9bdc54d0561 (diff) | |
| download | rust-7adf4c2b6f8246d29abe3617f2d9d875ce91e9cc.tar.gz rust-7adf4c2b6f8246d29abe3617f2d9d875ce91e9cc.zip | |
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`
Diffstat (limited to 'compiler')
| -rw-r--r-- | compiler/rustc_next_trait_solver/src/solve/eval_ctxt/canonical.rs | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/compiler/rustc_next_trait_solver/src/solve/eval_ctxt/canonical.rs b/compiler/rustc_next_trait_solver/src/solve/eval_ctxt/canonical.rs index 5acfec3dee3..4d743c05190 100644 --- a/compiler/rustc_next_trait_solver/src/solve/eval_ctxt/canonical.rs +++ b/compiler/rustc_next_trait_solver/src/solve/eval_ctxt/canonical.rs @@ -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) } |
