Fix 12384: non-nested direct mutrec bindings #12395
Merged
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.
Fixes the most important cases of #12384.
This was a bug in direct recursion between immutable record/union objects when not mediated by delayed computations (e.g. lambda expressions) and two or more objects are involved. Note that this kind of "directly recursive immutable objects" is a rarely used feature from F# 1.0 and must have regressed at some point for the mutually-recursive case involving multiple objects, hence indicates that we have a lack of test cases for this feature. I've added several tests here.
Note: there is still a remaining variation of this bug that I need to consider (and either adjust the code generator or most likely rule out in the type checker). That is when mutually recursive static data is split over an enclosing module definition, e.g.
THis will not be part of this PR