Ensure methods reached through a union are detected as reachable. #3102
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.
Prior to this PR, the fact of whether methods of a union member were marked
as reachable when called via a union (or intersection) reference was
accidentally depending on the order in which things were marked
reachable in the compiler execution. When a type was marked
as a subtype of the union before the method call was reached,
everything was okay, but when that order was reversed
(possible through indirection of a trait), things were not okay -
the methods seen as reachable through the union weren't copied
into being reachable on the subtype of the union as they were
supposed to.
The result was the possibility of runtime segfaults when the
expected vtable entries were not present, as observed in #3096.
This PR fixes that by ensuring this copy happens. Prior to this PR,
the copy was only happening for traits and interface subtypes,
but now it happens for union and intersection subtypes too.
Resolves #3096.