-
Notifications
You must be signed in to change notification settings - Fork 4.2k
Fix ILVerify failure: yield break in catch blocks within async iterators #80719
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Draft
Conversation
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
When a yield break appears in a catch block inside a try-catch-finally structure, the compiler was generating invalid IL that caused ILVerify to fail with "Leave into try block". The issue was that the finallyEntry label was placed at the end of the try block, and catch blocks would try to leave to this label, which is invalid IL (can't leave from catch into try). The fix checks if a try-finally has catch blocks: - If NO catch blocks: place finallyEntry at end of try block (original behavior, valid IL) - If HAS catch blocks: place finallyEntry after the entire try-catch-finally structure (new behavior, valid IL) This ensures both try and catch blocks can validly leave to the finallyEntry label. Co-authored-by: jcouv <12466233+jcouv@users.noreply.github.com>
@Copilot
Copilot
AI
changed the title
(削除) [WIP] Fix ILVerify failure in TryFinally test case (削除ここまで)
(追記) Fix ILVerify failure: yield break in catch blocks within async iterators (追記ここまで)
Oct 14, 2025
Copilot finished work on behalf of
jcouv
October 14, 2025 21:01
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.
Uh oh!
There was an error while loading. Please reload this page.
Fixes #[issue number from problem statement]
Problem
When a
yield break
statement appeared in a catch block within a try-catch-finally structure in an async iterator method, the compiler generated invalid IL that failed ILVerify with the error:This occurred because the compiler placed a
finallyEntry
label at the end of the try block to handle disposal mode jumps. When ayield break
in a catch block tried to leave to this label, it created invalid IL - you cannot leave from a catch block into its associated try block.Example
Solution
Modified
AsyncIteratorMethodToStateMachineRewriter.cs
to intelligently place thefinallyEntry
label based on whether the try statement has catch blocks:This ensures both try blocks and catch blocks can validly leave to the
finallyEntry
label, and the finally block executes properly before continuing disposal.Testing
TryFinally_YieldBreakInDisposeMode
test now passes without requiringVerification.FailsILVerify
Original prompt
Fixes #79124
💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.