diff options
| author | bors <bors@rust-lang.org> | 2025-08-22 04:05:26 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2025-08-22 04:05:26 +0000 |
| commit | d127901d940d96209fd2ae8ff6769ad2788099fb (patch) | |
| tree | 87273d27c025d702cd72d156dfcc9202e3575729 /compiler/rustc_expand | |
| parent | 8e3710ef31a0b2cdf5a1c2f3929b7735d1e28c20 (diff) | |
| parent | f68bcb376da2a34b6809ba76dad20ca400bd9966 (diff) | |
| download | rust-d127901d940d96209fd2ae8ff6769ad2788099fb.tar.gz rust-d127901d940d96209fd2ae8ff6769ad2788099fb.zip | |
Auto merge of #145410 - cuviper:expand-stack, r=lqd
rustc_expand: ensure stack in `InvocationCollector::visit_expr` In Fedora, when we built rustc with PGO on ppc64le, we started failing the test `issue-74564-if-expr-stack-overflow.rs`. This could also be reproduced on other arches by setting a smaller `RUST_MIN_STACK`, so it's probably just unlucky that ppc64le PGO created a large stack frame somewhere in this recursion path. Adding an `ensure_sufficient_stack` solves the stack overflow. Historically, that test and its fix were added in rust-lang/rust#74708, which was also an `ensure_sufficient_stack` in this area of code at the time. However, the refactor in rust-lang/rust#92573 basically left that to the general `MutVisitor`, and then rust-lang/rust#142240 removed even that ensure call. It may be luck that our tier-1 tested targets did not regress the original issue across those refactors.
Diffstat (limited to 'compiler/rustc_expand')
| -rw-r--r-- | compiler/rustc_expand/src/expand.rs | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/compiler/rustc_expand/src/expand.rs b/compiler/rustc_expand/src/expand.rs index 755275d3cda..7fc6ea883d0 100644 --- a/compiler/rustc_expand/src/expand.rs +++ b/compiler/rustc_expand/src/expand.rs @@ -14,6 +14,7 @@ use rustc_ast::{ use rustc_ast_pretty::pprust; use rustc_attr_parsing::{EvalConfigResult, ShouldEmit}; use rustc_data_structures::flat_map_in_place::FlatMapInPlace; +use rustc_data_structures::stack::ensure_sufficient_stack; use rustc_errors::PResult; use rustc_feature::Features; use rustc_hir::def::MacroKinds; @@ -2469,7 +2470,7 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> { if let Some(attr) = node.attrs.first() { self.cfg().maybe_emit_expr_attr_err(attr); } - self.visit_node(node) + ensure_sufficient_stack(|| self.visit_node(node)) } fn visit_method_receiver_expr(&mut self, node: &mut ast::Expr) { |
