Skip to content

Comments

Fix LoadExactInterfaceMap for sub-interfaces with complex type arguments under special marker parents#124684

Open
davidwrighton wants to merge 4 commits intodotnet:mainfrom
davidwrighton:fix_124369
Open

Fix LoadExactInterfaceMap for sub-interfaces with complex type arguments under special marker parents#124684
davidwrighton wants to merge 4 commits intodotnet:mainfrom
davidwrighton:fix_124369

Conversation

@davidwrighton
Copy link
Member

Summary

When pNewIntfMT is a special marker type and its sub-interface in the interface map has an exact instantiation containing complex type arguments (e.g. IList<T> rather than bare T), the previous code in LoadExactInterfaceMap would incorrectly fall through to the old case 4 logic. This checked EligibleForSpecialMarkerTypeUsage against pMT rather than pNewIntfMT, which could treat a sub-interface still containing unresolved generic variables as either eligible for special marker substitution or as an exact match — both incorrect.

Fix

The old case 4 (exact instantiation) is split into three cases to correctly handle the situation where pNewIntfMT is itself a special marker type:

  • Case 4: The sub-interface's instantiation is eligible for special marker usage relative to pNewIntfMT (e.g. ILayer1<T> where T matches pNewIntfMT's type parameter). Insert the special marker type.
  • Case 5: The sub-interface has generic variables that don't match pNewIntfMT's type parameter (e.g. ILayer1<IList<T>>). Since resolving this requires a full deep substitution, and this is a rare scenario, we fall back to the retry-with-exact-interfaces pathway which sets MayHaveOpenInterfacesInInterfaceMap and disables the special marker optimization for this type.
  • Case 6: The sub-interface is fully concrete (no generic variables) or pNewIntfMT is not a special marker type. Falls through to the existing pMT-based eligibility check, which is correct in these situations.

A regression test is added covering all 8 combinations of pre-loading the 3 interface layers' generic type definitions before constructing the concrete class, to exercise the various orderings that lead to different code paths through the special marker type logic.

Fixes #124369

davidwrighton and others added 3 commits February 20, 2026 14:45
…nts under special marker parents

When pNewIntfMT is a special marker type and its sub-interface has an
exact instantiation containing complex type arguments (e.g. IList(Of T)
rather than bare T), the previous code would fall through to case 4
which checked EligibleForSpecialMarkerTypeUsage against pMT. This could
incorrectly treat the sub-interface as an exact match when it still
contains unresolved generic variables.

Split old case 4 into three new cases:
- Case 4: pNewIntfMT is a special marker type and the sub-interface's
  instantiation is eligible for special marker usage relative to
  pNewIntfMT (e.g. ILayer1(Of T) where T matches). Insert the marker.
- Case 5: pNewIntfMT is a special marker type but the sub-interface has
  generic variables that don't match (e.g. ILayer1(Of IList(Of T))).
  Trigger retry with exact interfaces since full substitution is needed.
- Case 6: The sub-interface is fully concrete or pNewIntfMT is not a
  special marker. Fall through to the existing pMT-based eligibility
  check.

Add regression tests covering all 8 combinations of pre-loading the
3 interface layers.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Fixes CoreCLR interface-map exact-loading for the case where a special marker parent interface contains a sub-interface entry that is an exact instantiation with more complex type arguments (e.g., IList<T>), preventing incorrect eligibility checks and ensuring the algorithm falls back to the exact-interface retry path when deep substitution would be required.

Changes:

  • Split the prior “exact instantiation” handling in LoadExactInterfaceMap into additional sub-cases to correctly handle special-marker parents and open generic variables.
  • Add a VB regression test suite (with 8 preload-order combinations) to exercise the special marker interface map logic and validate the fix.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 4 comments.

File Description
src/coreclr/vm/methodtablebuilder.cpp Refines LoadExactInterfaceMap handling for exact sub-interfaces under special marker parents, including a controlled fallback path.
src/tests/Loader/classloader/regressions/GitHub_124369/GitHub_124369.vb Adds VB regression coverage for the reported failure mode across multiple preload orderings and interface layering shapes.
src/tests/Loader/classloader/regressions/GitHub_124369/GitHub_124369.vbproj Adds the test project definition for the new VB regression test.

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

VB.NET program using .NET runtime 10.0.3 throws EntryPointNotFoundException

1 participant