Fix access to hoisted variables from reductions #104360
Open
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
LambdaCompiler compiles several types of expressions by reducing them. Reductions may contain BlockExpressions not processed by VariableBinder, and in that case a scope is created for them on the fly during compilation. In particular, SwitchExpression and TypeBinaryExpression compilation can create a BlockExpression with a scope.
If such a BlockExpression is an immediate child of a LambdaExpression, it lost access to lambda parameters that were hoisted due to the propagation of the NeedsClosure flag for its scope from the lambda.
Always set the flag for such scopes to true, so that it always gets access to hoisted variables from the parent scope.
Fix #56262