Skip to content

Bugfix :: Fix emitted method signatures: outref and static abstract byref params#19340

Open
T-Gro wants to merge 12 commits intomainfrom
codegen/fix-method-signatures
Open

Bugfix :: Fix emitted method signatures: outref and static abstract byref params#19340
T-Gro wants to merge 12 commits intomainfrom
codegen/fix-method-signatures

Conversation

@T-Gro
Copy link
Member

@T-Gro T-Gro commented Feb 20, 2026

Fixes incorrect method signatures in emitted IL.

Fixes #18140 — dropped: handled by #19372 Wave 2a with the correct approach (call instead of callvirt for value types).

@github-actions
Copy link
Contributor

github-actions bot commented Feb 20, 2026

✅ No release notes required

@T-Gro T-Gro force-pushed the codegen/fix-method-signatures branch 3 times, most recently from 88fbc57 to 3a393bd Compare February 20, 2026 17:22
Fix 4 codegen bugs in method call emission and parameter metadata:
- #13468: outref parameter compiled as byref
- #18135: Static abstract interface members with byref params
- #18140: callvirt on value types causes ILVerify errors
- #18374: RuntimeWrappedException cannot be caught

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@T-Gro T-Gro force-pushed the codegen/fix-method-signatures branch from 3a393bd to 4b98317 Compare February 20, 2026 17:23
T-Gro and others added 2 commits February 26, 2026 15:20
Static members implementing static abstract interface members with inref/outref
parameters were missing the modreq(InAttribute)/modreq(OutAttribute) on their IL
parameter types. This is because GetMethodSpecForMemberVal always used
isSlotSig=false for static members, unlike instance members which check
IsDispatchSlot and IsOverrideOrExplicitImpl.

This caused the method def type signature to not match the override spec,
leading to MethodDefNotFound errors (issue #18135).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Remove asymmetric Modified type stripping from MethodDefKey.Equals that
incorrectly made Modified(_, _, T) == T, causing method deduplication and
corrupt IL. Restrict Issue_18135 test to NET_CORE_APP since static abstract
interface members require .NET 7+.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@T-Gro
Copy link
Member Author

T-Gro commented Mar 2, 2026

/azp run fsharp-ci

@azure-pipelines
Copy link

Azure Pipelines will not run the associated pipelines, because the pull request was updated after the run command was issued. Review the pull request again and issue a new run command.

@T-Gro T-Gro marked this pull request as ready for review March 6, 2026 11:47
@T-Gro T-Gro requested a review from a team as a code owner March 6, 2026 11:47
@T-Gro T-Gro changed the title WIP :: Bugfix :: Fix emitted method signatures and calling conventions Bugfix :: Fix emitted method signatures and calling conventions Mar 6, 2026
The more aggressive scope-aware type comparison for Byref/Boxed/Modified
types may be causing incorrect method deduplication in CompressedMetadata
mode, corrupting the VS extension DLL and causing 1820 NRE failures.

This reverts just the ilwrite.fs change to test the hypothesis.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@T-Gro T-Gro force-pushed the codegen/fix-method-signatures branch from e172d6b to fd8cd07 Compare March 6, 2026 20:08
Keep the outref [out] byref fix and slot sig param flags.
Revert the GenILCall ccallInfo extension that added constrained.
prefix for all struct callvirt — this is the likely cause of 1820
vs_release NRE failures on net472.

Issue #18140 (constrained.callvirt) needs a different approach.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@T-Gro T-Gro changed the title Bugfix :: Fix emitted method signatures and calling conventions Bugfix :: Fix emitted method signatures: outref and static abstract byref params Mar 6, 2026
T-Gro and others added 2 commits March 7, 2026 00:04
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: New

1 participant