Break cycle in computeAsSeenFrom
when type-checking mutually referencing abstract type members
#20236
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.
Quite some time ago I reported a typing issue involving subtyping with type members whose definitions refer to each other (#4560).
I ran into this issue again recently and would like code like this to compile.
In the current compiler versions, both examples from the issue (#4560 (comment), #4560 (comment)) still result in a "recursion limit exceeded" error due to the compiler running into a cycle.
I found that the cycle manifests in
computeAsSeenFrom
being called again on the sameSingleDenotation
object with the exact same argumentpre
at some point in the nestedinfo.asSeenFrom
call.I don't know the internals of the compiler well enough to judge whether this is the best approach, but what this pull request does is detecting such nested calls to
computeAsSeenFrom
by storing the argument of the previous call until the function returns and, if a nested call is detected, breaking the cycle by immediately returning a preliminary result. This result is then updated by the outercomputeAsSeenFrom
call to its correctinfo
. I think, the only interesting case is if theSingleDenotation
refers to an abstract type member.This PR fixes #4560, fixes #13937, fixes #19618, and fixes #20243.