Repository navigation
[Flatten] Use target block type for Switch temps - #9312
Merged
Merged
Conversation
When lowering a Switch with a concrete value, Flatten previously passed the switch value's type rather than the target block's type to getTempForBreakTarget. When the switch value had a narrower subtype than the target block (such as nullfuncref flowing to a funcref block), the break temp local was allocated with the narrower subtype, failing validation when the block read the local at the block's result type or when another branch wrote a supertype value. Look up findBreakTarget(name)->type for each Switch target, matching Break.
There was a problem hiding this comment.
Code Review
This pull request fixes an issue in the Flatten pass where a br_table sending a subtype of its target block's result type would incorrectly allocate the break target local with the narrower sent value type instead of the target block's type. The fix retrieves the actual target block's type to allocate the local correctly. A corresponding test case switch_subtype has been added to verify this behavior. I have no further feedback to provide.
Member
Author
|
Found relatively quickly by the fuzzer after #9303 landed. |
kripken
approved these changes
Oct 28, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
When lowering a Switch with a concrete value, Flatten previously passed the switch value's type rather than the target block's type to getTempForBreakTarget. When the switch value had a narrower subtype than the target block (such as nullfuncref flowing to a funcref block), the break temp local was allocated with the narrower subtype, failing validation when the block read the local at the block's result type or when another branch wrote a supertype value. Look up findBreakTarget(name)->type for each Switch target, matching Break.