Match-binding shadow-stack pushes are never popped: a recursive function whose body binds a match scrutinee traps with a bare unreachable (no diagnostic, no location) once recursion depth exhausts the shadow stack — measured at ~2,048 levels for an ADT scrutinee at the current base, and ~1,365 for the pair scrutinees the #1305 fix newly makes compilable. A no-match control at the same depth returns correctly.
Pre-existing (the ADT-scrutinee case reproduces before the #1305/#1309 branch); that branch extends the reach to String/Array recursion, which previously could not compile at all.
Fix direction
Pop match-binding shadow pushes at arm exit (the _destructure_let discipline covers lets; match arms need the balancing pop), or account for them in the frame's shadow budget; a depth-recursion conformance probe with the no-match control as the differential.
Found by the adversarial review of the group L branch. The KNOWN_ISSUES row rides that PR.
Match-binding shadow-stack pushes are never popped: a recursive function whose body binds a match scrutinee traps with a bare
unreachable(no diagnostic, no location) once recursion depth exhausts the shadow stack — measured at ~2,048 levels for an ADT scrutinee at the current base, and ~1,365 for the pair scrutinees the #1305 fix newly makes compilable. A no-match control at the same depth returns correctly.Pre-existing (the ADT-scrutinee case reproduces before the #1305/#1309 branch); that branch extends the reach to String/Array recursion, which previously could not compile at all.
Fix direction
Pop match-binding shadow pushes at arm exit (the
_destructure_letdiscipline covers lets; match arms need the balancing pop), or account for them in the frame's shadow budget; a depth-recursion conformance probe with the no-match control as the differential.Found by the adversarial review of the group L branch. The KNOWN_ISSUES row rides that PR.