Rollup merge of #122717 - workingjubilee:handle-call-call-call-call-calling-me-maybe, r=compiler-errors

Ensure stack before parsing dot-or-call

There are many cases where, due to codegen or a massively unruly codebase, a deeply nested `call(call(call(call(call(call(call(call(call(f())))))))))` can happen. This is a spot where it would be good to grow our stack, so that we can survive to tell the programmer their code is dubiously written.

Closes https://github.com/rust-lang/rust/issues/122715
This commit is contained in:
Matthias Krüger 2024-03-19 18:03:52 +01:00 committed by GitHub
commit 65618908ef
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 4911 additions and 1 deletions

View File

@ -943,7 +943,10 @@ pub(super) fn parse_expr_dot_or_call_with(
// Stitch the list of outer attributes onto the return value.
// A little bit ugly, but the best way given the current code
// structure
let res = self.parse_expr_dot_or_call_with_(e0, lo);
let res = ensure_sufficient_stack(
// this expr demonstrates the recursion it guards against
|| self.parse_expr_dot_or_call_with_(e0, lo),
);
if attrs.is_empty() {
res
} else {

File diff suppressed because one or more lines are too long