Fix Crossgen2 variance validation for type constraints - #132809

Merged
jtschuster merged 2 commits into
dotnet:mainfrom
jtschuster:fix-crossgen2-variance
Sep 2, 2026
Merged

Fix Crossgen2 variance validation for type constraints#132809
jtschuster merged 2 commits into
dotnet:mainfrom
jtschuster:fix-crossgen2-variance

Conversation

@jtschuster

@jtschusterjtschuster commented Aug 27, 2026

Copy link
Copy Markdown
Member

Summary

Crossgen2 applied method generic-constraint variance rules to a generic type's own constraints. ECMA-335 II.9.7 explicitly leaves type-owned constraints unrestricted, so valid variant interfaces could fail automatic validation and omit READYTORUN_FLAG_SkipTypeValidation.

This change:

  • removes the invalid variance check for type-owned generic constraints
  • aligns interface method signature validation with the VM by checking all instance methods and virtual methods, including static virtual and static abstract declarations
  • adds a ReadyToRun regression test based on the reported constraint pattern

Fixes#132724

Note

This pull request was created with GitHub Copilot.

Do not apply method constraint variance rules to a generic type's own constraints. Validate static virtual interface method signatures and add coverage for emitting SkipTypeValidation for valid type constraints.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 87038ccf-f45b-40d3-a2d4-ee7d3d7f7a7f
@jtschuster
jtschusterforce-pushed the fix-crossgen2-variance branch from ae7c278 to d2bf9a8CompareAugust 27, 2026 01:14
@jtschuster
jtschuster marked this pull request as ready for review August 27, 2026 01:14
CopilotAI lite review requested due to automatic review settings August 27, 2026 01:14
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR updates Crossgen2’s ReadyToRun type validation logic to better match CoreCLR’s variance validation behavior and to avoid incorrectly rejecting valid generic type-parameter constraints, and adds a regression test to prevent future regressions.

Changes:

  • Removes variance validation for a generic type’s own parameter constraints (leaving constraint usage unrestricted as intended).
  • Aligns interface method signature variance validation with the VM by validating all instance methods and all virtual methods (including static virtual/abstract).
  • Adds a ReadyToRun regression test covering the reported “variant type parameter used in a type-owned constraint” pattern.

Reviewed changes

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

FileDescription
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeValidationChecker.csFixes variance validation rules to match VM behavior and avoids invalid checks on type-owned constraints.
src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/TypeValidation/GenericTypeConstraints.csAdds a minimal source test case that exercises the constraint + variance pattern.
src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csAdds a test that runs Crossgen2 with automatic type validation and asserts the resulting image sets READYTORUN_FLAG_SkipTypeValidation.

CopilotAI review requested due to automatic review settings August 31, 2026 16:25

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟢 Approval recommended

Review details
  • Files reviewed: 3/3 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

@jtschuster

Copy link
Copy Markdown
MemberAuthor

/ba-g failures unrelated

@jtschuster
jtschuster merged commit 65c1f69 into dotnet:mainSep 2, 2026
104 of 108 checks passed
@jtschuster

Copy link
Copy Markdown
MemberAuthor

/backport to release/11.0-rc1

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/11.0-rc1 (link to workflow run)

@jtschuster

Copy link
Copy Markdown
MemberAuthor

/backport to release/10.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/10.0 (link to workflow run)

@github-actions

Copy link
Copy Markdown
Contributor

@jtschuster backporting to release/11.0-rc1 failed, the patch most likely resulted in conflicts. Please backport manually!

git am output
$ git cherry-pick 65c1f69d9fe4758690ed0d3cedaba0aed2fadd6fAuto-merging src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csCONFLICT (content): Merge conflict in src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cserror: could not apply 65c1f69d9fe... Fix Crossgen2 variance validation for type constraints (#132809)hint: After resolving the conflicts, mark them withhint: "git add/rm <pathspec>", then runhint: "git cherry-pick --continue".hint: You can instead skip this commit with "git cherry-pick --skip".hint: To abort and get back to the state before "git cherry-pick",hint: run "git cherry-pick --abort".hint: Disable this message with "git config set advice.mergeConflict false"
$ git am --3way --empty=keep --ignore-whitespace --keep-non-patch changes.patchApplying: Fix Crossgen2 variance validation for type constraintsUsing index info to reconstruct a base tree...M	src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csFalling back to patching base and 3-way merge...Auto-merging src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csCONFLICT (content): Merge conflict in src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cserror: Failed to merge in the changes.hint: Use 'git am --show-current-patch=diff' to see the failed patchhint: When you have resolved this problem, run "git am --continue".hint: If you prefer to skip this patch, run "git am --skip" instead.hint: To restore the original branch and stop patching, run "git am --abort".hint: Disable this message with "git config set advice.mergeConflict false"Patch failed at 0001 Fix Crossgen2 variance validation for type constraintsError: The process '/usr/bin/git' failed with exit code 128

Link to workflow output

@github-actions

Copy link
Copy Markdown
Contributor

@jtschuster backporting to release/10.0 failed, the patch most likely resulted in conflicts. Please backport manually!

git am output
$ git cherry-pick 65c1f69d9fe4758690ed0d3cedaba0aed2fadd6fCONFLICT (modify/delete): src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cs deleted in HEAD and modified in 65c1f69d9fe (Fix Crossgen2 variance validation for type constraints (#132809)). Version 65c1f69d9fe (Fix Crossgen2 variance validation for type constraints (#132809)) of src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cs left in tree.Auto-merging src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeValidationChecker.cserror: could not apply 65c1f69d9fe... Fix Crossgen2 variance validation for type constraints (#132809)hint: After resolving the conflicts, mark them withhint: "git add/rm <pathspec>", then runhint: "git cherry-pick --continue".hint: You can instead skip this commit with "git cherry-pick --skip".hint: To abort and get back to the state before "git cherry-pick",hint: run "git cherry-pick --abort".hint: Disable this message with "git config set advice.mergeConflict false"
$ git am --3way --empty=keep --ignore-whitespace --keep-non-patch changes.patchApplying: Fix Crossgen2 variance validation for type constraintsUsing index info to reconstruct a base tree...A	src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csM	src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeValidationChecker.csFalling back to patching base and 3-way merge...CONFLICT (modify/delete): src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cs deleted in HEAD and modified in Fix Crossgen2 variance validation for type constraints. Version Fix Crossgen2 variance validation for type constraints of src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cs left in tree.Auto-merging src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeValidationChecker.cserror: Failed to merge in the changes.hint: Use 'git am --show-current-patch=diff' to see the failed patchhint: When you have resolved this problem, run "git am --continue".hint: If you prefer to skip this patch, run "git am --skip" instead.hint: To restore the original branch and stop patching, run "git am --abort".hint: Disable this message with "git config set advice.mergeConflict false"Patch failed at 0001 Fix Crossgen2 variance validation for type constraintsError: The process '/usr/bin/git' failed with exit code 128

Link to workflow output

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

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

Crossgen2 10.0.2+ reports false generic variance error and clears SkipTypeValidation

4 participants

@jtschuster@jkoritzinsky@davidwrighton
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Fix Crossgen2 variance validation for type constraints - #132809

Merged
jtschuster merged 2 commits into
dotnet:mainfrom
jtschuster:fix-crossgen2-variance
Sep 2, 2026
Merged

Fix Crossgen2 variance validation for type constraints#132809
jtschuster merged 2 commits into
dotnet:mainfrom
jtschuster:fix-crossgen2-variance

Conversation

@jtschuster

@jtschusterjtschuster commented Aug 27, 2026

Copy link
Copy Markdown
Member

Summary

Crossgen2 applied method generic-constraint variance rules to a generic type's own constraints. ECMA-335 II.9.7 explicitly leaves type-owned constraints unrestricted, so valid variant interfaces could fail automatic validation and omit READYTORUN_FLAG_SkipTypeValidation.

This change:

  • removes the invalid variance check for type-owned generic constraints
  • aligns interface method signature validation with the VM by checking all instance methods and virtual methods, including static virtual and static abstract declarations
  • adds a ReadyToRun regression test based on the reported constraint pattern

Fixes#132724

Note

This pull request was created with GitHub Copilot.

Do not apply method constraint variance rules to a generic type's own constraints. Validate static virtual interface method signatures and add coverage for emitting SkipTypeValidation for valid type constraints.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 87038ccf-f45b-40d3-a2d4-ee7d3d7f7a7f
@jtschuster
jtschusterforce-pushed the fix-crossgen2-variance branch from ae7c278 to d2bf9a8CompareAugust 27, 2026 01:14
@jtschuster
jtschuster marked this pull request as ready for review August 27, 2026 01:14
CopilotAI lite review requested due to automatic review settings August 27, 2026 01:14
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR updates Crossgen2’s ReadyToRun type validation logic to better match CoreCLR’s variance validation behavior and to avoid incorrectly rejecting valid generic type-parameter constraints, and adds a regression test to prevent future regressions.

Changes:

  • Removes variance validation for a generic type’s own parameter constraints (leaving constraint usage unrestricted as intended).
  • Aligns interface method signature variance validation with the VM by validating all instance methods and all virtual methods (including static virtual/abstract).
  • Adds a ReadyToRun regression test covering the reported “variant type parameter used in a type-owned constraint” pattern.

Reviewed changes

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

FileDescription
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeValidationChecker.csFixes variance validation rules to match VM behavior and avoids invalid checks on type-owned constraints.
src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/TypeValidation/GenericTypeConstraints.csAdds a minimal source test case that exercises the constraint + variance pattern.
src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csAdds a test that runs Crossgen2 with automatic type validation and asserts the resulting image sets READYTORUN_FLAG_SkipTypeValidation.

CopilotAI review requested due to automatic review settings August 31, 2026 16:25

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟢 Approval recommended

Review details
  • Files reviewed: 3/3 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

@jtschuster

Copy link
Copy Markdown
MemberAuthor

/ba-g failures unrelated

@jtschuster
jtschuster merged commit 65c1f69 into dotnet:mainSep 2, 2026
104 of 108 checks passed
@jtschuster

Copy link
Copy Markdown
MemberAuthor

/backport to release/11.0-rc1

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/11.0-rc1 (link to workflow run)

@jtschuster

Copy link
Copy Markdown
MemberAuthor

/backport to release/10.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/10.0 (link to workflow run)

@github-actions

Copy link
Copy Markdown
Contributor

@jtschuster backporting to release/11.0-rc1 failed, the patch most likely resulted in conflicts. Please backport manually!

git am output
$ git cherry-pick 65c1f69d9fe4758690ed0d3cedaba0aed2fadd6fAuto-merging src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csCONFLICT (content): Merge conflict in src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cserror: could not apply 65c1f69d9fe... Fix Crossgen2 variance validation for type constraints (#132809)hint: After resolving the conflicts, mark them withhint: "git add/rm <pathspec>", then runhint: "git cherry-pick --continue".hint: You can instead skip this commit with "git cherry-pick --skip".hint: To abort and get back to the state before "git cherry-pick",hint: run "git cherry-pick --abort".hint: Disable this message with "git config set advice.mergeConflict false"
$ git am --3way --empty=keep --ignore-whitespace --keep-non-patch changes.patchApplying: Fix Crossgen2 variance validation for type constraintsUsing index info to reconstruct a base tree...M	src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csFalling back to patching base and 3-way merge...Auto-merging src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csCONFLICT (content): Merge conflict in src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cserror: Failed to merge in the changes.hint: Use 'git am --show-current-patch=diff' to see the failed patchhint: When you have resolved this problem, run "git am --continue".hint: If you prefer to skip this patch, run "git am --skip" instead.hint: To restore the original branch and stop patching, run "git am --abort".hint: Disable this message with "git config set advice.mergeConflict false"Patch failed at 0001 Fix Crossgen2 variance validation for type constraintsError: The process '/usr/bin/git' failed with exit code 128

Link to workflow output

@github-actions

Copy link
Copy Markdown
Contributor

@jtschuster backporting to release/10.0 failed, the patch most likely resulted in conflicts. Please backport manually!

git am output
$ git cherry-pick 65c1f69d9fe4758690ed0d3cedaba0aed2fadd6fCONFLICT (modify/delete): src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cs deleted in HEAD and modified in 65c1f69d9fe (Fix Crossgen2 variance validation for type constraints (#132809)). Version 65c1f69d9fe (Fix Crossgen2 variance validation for type constraints (#132809)) of src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cs left in tree.Auto-merging src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeValidationChecker.cserror: could not apply 65c1f69d9fe... Fix Crossgen2 variance validation for type constraints (#132809)hint: After resolving the conflicts, mark them withhint: "git add/rm <pathspec>", then runhint: "git cherry-pick --continue".hint: You can instead skip this commit with "git cherry-pick --skip".hint: To abort and get back to the state before "git cherry-pick",hint: run "git cherry-pick --abort".hint: Disable this message with "git config set advice.mergeConflict false"
$ git am --3way --empty=keep --ignore-whitespace --keep-non-patch changes.patchApplying: Fix Crossgen2 variance validation for type constraintsUsing index info to reconstruct a base tree...A	src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csM	src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeValidationChecker.csFalling back to patching base and 3-way merge...CONFLICT (modify/delete): src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cs deleted in HEAD and modified in Fix Crossgen2 variance validation for type constraints. Version Fix Crossgen2 variance validation for type constraints of src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cs left in tree.Auto-merging src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeValidationChecker.cserror: Failed to merge in the changes.hint: Use 'git am --show-current-patch=diff' to see the failed patchhint: When you have resolved this problem, run "git am --continue".hint: If you prefer to skip this patch, run "git am --skip" instead.hint: To restore the original branch and stop patching, run "git am --abort".hint: Disable this message with "git config set advice.mergeConflict false"Patch failed at 0001 Fix Crossgen2 variance validation for type constraintsError: The process '/usr/bin/git' failed with exit code 128

Link to workflow output

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

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

Crossgen2 10.0.2+ reports false generic variance error and clears SkipTypeValidation

4 participants

@jtschuster@jkoritzinsky@davidwrighton
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Fix Crossgen2 variance validation for type constraints - #132809

Merged
jtschuster merged 2 commits into
dotnet:mainfrom
jtschuster:fix-crossgen2-variance
Sep 2, 2026
Merged

Fix Crossgen2 variance validation for type constraints#132809
jtschuster merged 2 commits into
dotnet:mainfrom
jtschuster:fix-crossgen2-variance

Conversation

@jtschuster

@jtschusterjtschuster commented Aug 27, 2026

Copy link
Copy Markdown
Member

Summary

Crossgen2 applied method generic-constraint variance rules to a generic type's own constraints. ECMA-335 II.9.7 explicitly leaves type-owned constraints unrestricted, so valid variant interfaces could fail automatic validation and omit READYTORUN_FLAG_SkipTypeValidation.

This change:

  • removes the invalid variance check for type-owned generic constraints
  • aligns interface method signature validation with the VM by checking all instance methods and virtual methods, including static virtual and static abstract declarations
  • adds a ReadyToRun regression test based on the reported constraint pattern

Fixes#132724

Note

This pull request was created with GitHub Copilot.

Do not apply method constraint variance rules to a generic type's own constraints. Validate static virtual interface method signatures and add coverage for emitting SkipTypeValidation for valid type constraints.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 87038ccf-f45b-40d3-a2d4-ee7d3d7f7a7f
@jtschuster
jtschusterforce-pushed the fix-crossgen2-variance branch from ae7c278 to d2bf9a8CompareAugust 27, 2026 01:14
@jtschuster
jtschuster marked this pull request as ready for review August 27, 2026 01:14
CopilotAI lite review requested due to automatic review settings August 27, 2026 01:14
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR updates Crossgen2’s ReadyToRun type validation logic to better match CoreCLR’s variance validation behavior and to avoid incorrectly rejecting valid generic type-parameter constraints, and adds a regression test to prevent future regressions.

Changes:

  • Removes variance validation for a generic type’s own parameter constraints (leaving constraint usage unrestricted as intended).
  • Aligns interface method signature variance validation with the VM by validating all instance methods and all virtual methods (including static virtual/abstract).
  • Adds a ReadyToRun regression test covering the reported “variant type parameter used in a type-owned constraint” pattern.

Reviewed changes

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

FileDescription
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeValidationChecker.csFixes variance validation rules to match VM behavior and avoids invalid checks on type-owned constraints.
src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/TypeValidation/GenericTypeConstraints.csAdds a minimal source test case that exercises the constraint + variance pattern.
src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csAdds a test that runs Crossgen2 with automatic type validation and asserts the resulting image sets READYTORUN_FLAG_SkipTypeValidation.

CopilotAI review requested due to automatic review settings August 31, 2026 16:25

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟢 Approval recommended

Review details
  • Files reviewed: 3/3 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

@jtschuster

Copy link
Copy Markdown
MemberAuthor

/ba-g failures unrelated

@jtschuster
jtschuster merged commit 65c1f69 into dotnet:mainSep 2, 2026
104 of 108 checks passed
@jtschuster

Copy link
Copy Markdown
MemberAuthor

/backport to release/11.0-rc1

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/11.0-rc1 (link to workflow run)

@jtschuster

Copy link
Copy Markdown
MemberAuthor

/backport to release/10.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/10.0 (link to workflow run)

@github-actions

Copy link
Copy Markdown
Contributor

@jtschuster backporting to release/11.0-rc1 failed, the patch most likely resulted in conflicts. Please backport manually!

git am output
$ git cherry-pick 65c1f69d9fe4758690ed0d3cedaba0aed2fadd6fAuto-merging src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csCONFLICT (content): Merge conflict in src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cserror: could not apply 65c1f69d9fe... Fix Crossgen2 variance validation for type constraints (#132809)hint: After resolving the conflicts, mark them withhint: "git add/rm <pathspec>", then runhint: "git cherry-pick --continue".hint: You can instead skip this commit with "git cherry-pick --skip".hint: To abort and get back to the state before "git cherry-pick",hint: run "git cherry-pick --abort".hint: Disable this message with "git config set advice.mergeConflict false"
$ git am --3way --empty=keep --ignore-whitespace --keep-non-patch changes.patchApplying: Fix Crossgen2 variance validation for type constraintsUsing index info to reconstruct a base tree...M	src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csFalling back to patching base and 3-way merge...Auto-merging src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csCONFLICT (content): Merge conflict in src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cserror: Failed to merge in the changes.hint: Use 'git am --show-current-patch=diff' to see the failed patchhint: When you have resolved this problem, run "git am --continue".hint: If you prefer to skip this patch, run "git am --skip" instead.hint: To restore the original branch and stop patching, run "git am --abort".hint: Disable this message with "git config set advice.mergeConflict false"Patch failed at 0001 Fix Crossgen2 variance validation for type constraintsError: The process '/usr/bin/git' failed with exit code 128

Link to workflow output

@github-actions

Copy link
Copy Markdown
Contributor

@jtschuster backporting to release/10.0 failed, the patch most likely resulted in conflicts. Please backport manually!

git am output
$ git cherry-pick 65c1f69d9fe4758690ed0d3cedaba0aed2fadd6fCONFLICT (modify/delete): src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cs deleted in HEAD and modified in 65c1f69d9fe (Fix Crossgen2 variance validation for type constraints (#132809)). Version 65c1f69d9fe (Fix Crossgen2 variance validation for type constraints (#132809)) of src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cs left in tree.Auto-merging src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeValidationChecker.cserror: could not apply 65c1f69d9fe... Fix Crossgen2 variance validation for type constraints (#132809)hint: After resolving the conflicts, mark them withhint: "git add/rm <pathspec>", then runhint: "git cherry-pick --continue".hint: You can instead skip this commit with "git cherry-pick --skip".hint: To abort and get back to the state before "git cherry-pick",hint: run "git cherry-pick --abort".hint: Disable this message with "git config set advice.mergeConflict false"
$ git am --3way --empty=keep --ignore-whitespace --keep-non-patch changes.patchApplying: Fix Crossgen2 variance validation for type constraintsUsing index info to reconstruct a base tree...A	src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csM	src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeValidationChecker.csFalling back to patching base and 3-way merge...CONFLICT (modify/delete): src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cs deleted in HEAD and modified in Fix Crossgen2 variance validation for type constraints. Version Fix Crossgen2 variance validation for type constraints of src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cs left in tree.Auto-merging src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeValidationChecker.cserror: Failed to merge in the changes.hint: Use 'git am --show-current-patch=diff' to see the failed patchhint: When you have resolved this problem, run "git am --continue".hint: If you prefer to skip this patch, run "git am --skip" instead.hint: To restore the original branch and stop patching, run "git am --abort".hint: Disable this message with "git config set advice.mergeConflict false"Patch failed at 0001 Fix Crossgen2 variance validation for type constraintsError: The process '/usr/bin/git' failed with exit code 128

Link to workflow output

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

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

Crossgen2 10.0.2+ reports false generic variance error and clears SkipTypeValidation

4 participants

@jtschuster@jkoritzinsky@davidwrighton
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Fix Crossgen2 variance validation for type constraints - #132809

Merged
jtschuster merged 2 commits into
dotnet:mainfrom
jtschuster:fix-crossgen2-variance
Sep 2, 2026
Merged

Fix Crossgen2 variance validation for type constraints#132809
jtschuster merged 2 commits into
dotnet:mainfrom
jtschuster:fix-crossgen2-variance

Conversation

@jtschuster

@jtschusterjtschuster commented Aug 27, 2026

Copy link
Copy Markdown
Member

Summary

Crossgen2 applied method generic-constraint variance rules to a generic type's own constraints. ECMA-335 II.9.7 explicitly leaves type-owned constraints unrestricted, so valid variant interfaces could fail automatic validation and omit READYTORUN_FLAG_SkipTypeValidation.

This change:

  • removes the invalid variance check for type-owned generic constraints
  • aligns interface method signature validation with the VM by checking all instance methods and virtual methods, including static virtual and static abstract declarations
  • adds a ReadyToRun regression test based on the reported constraint pattern

Fixes#132724

Note

This pull request was created with GitHub Copilot.

Do not apply method constraint variance rules to a generic type's own constraints. Validate static virtual interface method signatures and add coverage for emitting SkipTypeValidation for valid type constraints.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 87038ccf-f45b-40d3-a2d4-ee7d3d7f7a7f
@jtschuster
jtschusterforce-pushed the fix-crossgen2-variance branch from ae7c278 to d2bf9a8CompareAugust 27, 2026 01:14
@jtschuster
jtschuster marked this pull request as ready for review August 27, 2026 01:14
CopilotAI lite review requested due to automatic review settings August 27, 2026 01:14
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR updates Crossgen2’s ReadyToRun type validation logic to better match CoreCLR’s variance validation behavior and to avoid incorrectly rejecting valid generic type-parameter constraints, and adds a regression test to prevent future regressions.

Changes:

  • Removes variance validation for a generic type’s own parameter constraints (leaving constraint usage unrestricted as intended).
  • Aligns interface method signature variance validation with the VM by validating all instance methods and all virtual methods (including static virtual/abstract).
  • Adds a ReadyToRun regression test covering the reported “variant type parameter used in a type-owned constraint” pattern.

Reviewed changes

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

FileDescription
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeValidationChecker.csFixes variance validation rules to match VM behavior and avoids invalid checks on type-owned constraints.
src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/TypeValidation/GenericTypeConstraints.csAdds a minimal source test case that exercises the constraint + variance pattern.
src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csAdds a test that runs Crossgen2 with automatic type validation and asserts the resulting image sets READYTORUN_FLAG_SkipTypeValidation.

CopilotAI review requested due to automatic review settings August 31, 2026 16:25

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟢 Approval recommended

Review details
  • Files reviewed: 3/3 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

@jtschuster

Copy link
Copy Markdown
MemberAuthor

/ba-g failures unrelated

@jtschuster
jtschuster merged commit 65c1f69 into dotnet:mainSep 2, 2026
104 of 108 checks passed
@jtschuster

Copy link
Copy Markdown
MemberAuthor

/backport to release/11.0-rc1

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/11.0-rc1 (link to workflow run)

@jtschuster

Copy link
Copy Markdown
MemberAuthor

/backport to release/10.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/10.0 (link to workflow run)

@github-actions

Copy link
Copy Markdown
Contributor

@jtschuster backporting to release/11.0-rc1 failed, the patch most likely resulted in conflicts. Please backport manually!

git am output
$ git cherry-pick 65c1f69d9fe4758690ed0d3cedaba0aed2fadd6fAuto-merging src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csCONFLICT (content): Merge conflict in src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cserror: could not apply 65c1f69d9fe... Fix Crossgen2 variance validation for type constraints (#132809)hint: After resolving the conflicts, mark them withhint: "git add/rm <pathspec>", then runhint: "git cherry-pick --continue".hint: You can instead skip this commit with "git cherry-pick --skip".hint: To abort and get back to the state before "git cherry-pick",hint: run "git cherry-pick --abort".hint: Disable this message with "git config set advice.mergeConflict false"
$ git am --3way --empty=keep --ignore-whitespace --keep-non-patch changes.patchApplying: Fix Crossgen2 variance validation for type constraintsUsing index info to reconstruct a base tree...M	src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csFalling back to patching base and 3-way merge...Auto-merging src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csCONFLICT (content): Merge conflict in src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cserror: Failed to merge in the changes.hint: Use 'git am --show-current-patch=diff' to see the failed patchhint: When you have resolved this problem, run "git am --continue".hint: If you prefer to skip this patch, run "git am --skip" instead.hint: To restore the original branch and stop patching, run "git am --abort".hint: Disable this message with "git config set advice.mergeConflict false"Patch failed at 0001 Fix Crossgen2 variance validation for type constraintsError: The process '/usr/bin/git' failed with exit code 128

Link to workflow output

@github-actions

Copy link
Copy Markdown
Contributor

@jtschuster backporting to release/10.0 failed, the patch most likely resulted in conflicts. Please backport manually!

git am output
$ git cherry-pick 65c1f69d9fe4758690ed0d3cedaba0aed2fadd6fCONFLICT (modify/delete): src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cs deleted in HEAD and modified in 65c1f69d9fe (Fix Crossgen2 variance validation for type constraints (#132809)). Version 65c1f69d9fe (Fix Crossgen2 variance validation for type constraints (#132809)) of src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cs left in tree.Auto-merging src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeValidationChecker.cserror: could not apply 65c1f69d9fe... Fix Crossgen2 variance validation for type constraints (#132809)hint: After resolving the conflicts, mark them withhint: "git add/rm <pathspec>", then runhint: "git cherry-pick --continue".hint: You can instead skip this commit with "git cherry-pick --skip".hint: To abort and get back to the state before "git cherry-pick",hint: run "git cherry-pick --abort".hint: Disable this message with "git config set advice.mergeConflict false"
$ git am --3way --empty=keep --ignore-whitespace --keep-non-patch changes.patchApplying: Fix Crossgen2 variance validation for type constraintsUsing index info to reconstruct a base tree...A	src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csM	src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeValidationChecker.csFalling back to patching base and 3-way merge...CONFLICT (modify/delete): src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cs deleted in HEAD and modified in Fix Crossgen2 variance validation for type constraints. Version Fix Crossgen2 variance validation for type constraints of src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cs left in tree.Auto-merging src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeValidationChecker.cserror: Failed to merge in the changes.hint: Use 'git am --show-current-patch=diff' to see the failed patchhint: When you have resolved this problem, run "git am --continue".hint: If you prefer to skip this patch, run "git am --skip" instead.hint: To restore the original branch and stop patching, run "git am --abort".hint: Disable this message with "git config set advice.mergeConflict false"Patch failed at 0001 Fix Crossgen2 variance validation for type constraintsError: The process '/usr/bin/git' failed with exit code 128

Link to workflow output

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

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

Crossgen2 10.0.2+ reports false generic variance error and clears SkipTypeValidation

4 participants

@jtschuster@jkoritzinsky@davidwrighton
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Fix Crossgen2 variance validation for type constraints - #132809

Merged
jtschuster merged 2 commits into
dotnet:mainfrom
jtschuster:fix-crossgen2-variance
Sep 2, 2026
Merged

Fix Crossgen2 variance validation for type constraints#132809
jtschuster merged 2 commits into
dotnet:mainfrom
jtschuster:fix-crossgen2-variance

Conversation

@jtschuster

@jtschusterjtschuster commented Aug 27, 2026

Copy link
Copy Markdown
Member

Summary

Crossgen2 applied method generic-constraint variance rules to a generic type's own constraints. ECMA-335 II.9.7 explicitly leaves type-owned constraints unrestricted, so valid variant interfaces could fail automatic validation and omit READYTORUN_FLAG_SkipTypeValidation.

This change:

  • removes the invalid variance check for type-owned generic constraints
  • aligns interface method signature validation with the VM by checking all instance methods and virtual methods, including static virtual and static abstract declarations
  • adds a ReadyToRun regression test based on the reported constraint pattern

Fixes#132724

Note

This pull request was created with GitHub Copilot.

Do not apply method constraint variance rules to a generic type's own constraints. Validate static virtual interface method signatures and add coverage for emitting SkipTypeValidation for valid type constraints.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 87038ccf-f45b-40d3-a2d4-ee7d3d7f7a7f
@jtschuster
jtschusterforce-pushed the fix-crossgen2-variance branch from ae7c278 to d2bf9a8CompareAugust 27, 2026 01:14
@jtschuster
jtschuster marked this pull request as ready for review August 27, 2026 01:14
CopilotAI lite review requested due to automatic review settings August 27, 2026 01:14
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR updates Crossgen2’s ReadyToRun type validation logic to better match CoreCLR’s variance validation behavior and to avoid incorrectly rejecting valid generic type-parameter constraints, and adds a regression test to prevent future regressions.

Changes:

  • Removes variance validation for a generic type’s own parameter constraints (leaving constraint usage unrestricted as intended).
  • Aligns interface method signature variance validation with the VM by validating all instance methods and all virtual methods (including static virtual/abstract).
  • Adds a ReadyToRun regression test covering the reported “variant type parameter used in a type-owned constraint” pattern.

Reviewed changes

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

FileDescription
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeValidationChecker.csFixes variance validation rules to match VM behavior and avoids invalid checks on type-owned constraints.
src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/TypeValidation/GenericTypeConstraints.csAdds a minimal source test case that exercises the constraint + variance pattern.
src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csAdds a test that runs Crossgen2 with automatic type validation and asserts the resulting image sets READYTORUN_FLAG_SkipTypeValidation.

CopilotAI review requested due to automatic review settings August 31, 2026 16:25

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟢 Approval recommended

Review details
  • Files reviewed: 3/3 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

@jtschuster

Copy link
Copy Markdown
MemberAuthor

/ba-g failures unrelated

@jtschuster
jtschuster merged commit 65c1f69 into dotnet:mainSep 2, 2026
104 of 108 checks passed
@jtschuster

Copy link
Copy Markdown
MemberAuthor

/backport to release/11.0-rc1

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/11.0-rc1 (link to workflow run)

@jtschuster

Copy link
Copy Markdown
MemberAuthor

/backport to release/10.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/10.0 (link to workflow run)

@github-actions

Copy link
Copy Markdown
Contributor

@jtschuster backporting to release/11.0-rc1 failed, the patch most likely resulted in conflicts. Please backport manually!

git am output
$ git cherry-pick 65c1f69d9fe4758690ed0d3cedaba0aed2fadd6fAuto-merging src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csCONFLICT (content): Merge conflict in src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cserror: could not apply 65c1f69d9fe... Fix Crossgen2 variance validation for type constraints (#132809)hint: After resolving the conflicts, mark them withhint: "git add/rm <pathspec>", then runhint: "git cherry-pick --continue".hint: You can instead skip this commit with "git cherry-pick --skip".hint: To abort and get back to the state before "git cherry-pick",hint: run "git cherry-pick --abort".hint: Disable this message with "git config set advice.mergeConflict false"
$ git am --3way --empty=keep --ignore-whitespace --keep-non-patch changes.patchApplying: Fix Crossgen2 variance validation for type constraintsUsing index info to reconstruct a base tree...M	src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csFalling back to patching base and 3-way merge...Auto-merging src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csCONFLICT (content): Merge conflict in src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cserror: Failed to merge in the changes.hint: Use 'git am --show-current-patch=diff' to see the failed patchhint: When you have resolved this problem, run "git am --continue".hint: If you prefer to skip this patch, run "git am --skip" instead.hint: To restore the original branch and stop patching, run "git am --abort".hint: Disable this message with "git config set advice.mergeConflict false"Patch failed at 0001 Fix Crossgen2 variance validation for type constraintsError: The process '/usr/bin/git' failed with exit code 128

Link to workflow output

@github-actions

Copy link
Copy Markdown
Contributor

@jtschuster backporting to release/10.0 failed, the patch most likely resulted in conflicts. Please backport manually!

git am output
$ git cherry-pick 65c1f69d9fe4758690ed0d3cedaba0aed2fadd6fCONFLICT (modify/delete): src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cs deleted in HEAD and modified in 65c1f69d9fe (Fix Crossgen2 variance validation for type constraints (#132809)). Version 65c1f69d9fe (Fix Crossgen2 variance validation for type constraints (#132809)) of src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cs left in tree.Auto-merging src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeValidationChecker.cserror: could not apply 65c1f69d9fe... Fix Crossgen2 variance validation for type constraints (#132809)hint: After resolving the conflicts, mark them withhint: "git add/rm <pathspec>", then runhint: "git cherry-pick --continue".hint: You can instead skip this commit with "git cherry-pick --skip".hint: To abort and get back to the state before "git cherry-pick",hint: run "git cherry-pick --abort".hint: Disable this message with "git config set advice.mergeConflict false"
$ git am --3way --empty=keep --ignore-whitespace --keep-non-patch changes.patchApplying: Fix Crossgen2 variance validation for type constraintsUsing index info to reconstruct a base tree...A	src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csM	src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeValidationChecker.csFalling back to patching base and 3-way merge...CONFLICT (modify/delete): src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cs deleted in HEAD and modified in Fix Crossgen2 variance validation for type constraints. Version Fix Crossgen2 variance validation for type constraints of src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cs left in tree.Auto-merging src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeValidationChecker.cserror: Failed to merge in the changes.hint: Use 'git am --show-current-patch=diff' to see the failed patchhint: When you have resolved this problem, run "git am --continue".hint: If you prefer to skip this patch, run "git am --skip" instead.hint: To restore the original branch and stop patching, run "git am --abort".hint: Disable this message with "git config set advice.mergeConflict false"Patch failed at 0001 Fix Crossgen2 variance validation for type constraintsError: The process '/usr/bin/git' failed with exit code 128

Link to workflow output

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

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

Crossgen2 10.0.2+ reports false generic variance error and clears SkipTypeValidation

4 participants

@jtschuster@jkoritzinsky@davidwrighton
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Fix Crossgen2 variance validation for type constraints - #132809

Merged
jtschuster merged 2 commits into
dotnet:mainfrom
jtschuster:fix-crossgen2-variance
Sep 2, 2026
Merged

Fix Crossgen2 variance validation for type constraints#132809
jtschuster merged 2 commits into
dotnet:mainfrom
jtschuster:fix-crossgen2-variance

Conversation

@jtschuster

@jtschusterjtschuster commented Aug 27, 2026

Copy link
Copy Markdown
Member

Summary

Crossgen2 applied method generic-constraint variance rules to a generic type's own constraints. ECMA-335 II.9.7 explicitly leaves type-owned constraints unrestricted, so valid variant interfaces could fail automatic validation and omit READYTORUN_FLAG_SkipTypeValidation.

This change:

  • removes the invalid variance check for type-owned generic constraints
  • aligns interface method signature validation with the VM by checking all instance methods and virtual methods, including static virtual and static abstract declarations
  • adds a ReadyToRun regression test based on the reported constraint pattern

Fixes#132724

Note

This pull request was created with GitHub Copilot.

Do not apply method constraint variance rules to a generic type's own constraints. Validate static virtual interface method signatures and add coverage for emitting SkipTypeValidation for valid type constraints.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 87038ccf-f45b-40d3-a2d4-ee7d3d7f7a7f
@jtschuster
jtschusterforce-pushed the fix-crossgen2-variance branch from ae7c278 to d2bf9a8CompareAugust 27, 2026 01:14
@jtschuster
jtschuster marked this pull request as ready for review August 27, 2026 01:14
CopilotAI lite review requested due to automatic review settings August 27, 2026 01:14
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR updates Crossgen2’s ReadyToRun type validation logic to better match CoreCLR’s variance validation behavior and to avoid incorrectly rejecting valid generic type-parameter constraints, and adds a regression test to prevent future regressions.

Changes:

  • Removes variance validation for a generic type’s own parameter constraints (leaving constraint usage unrestricted as intended).
  • Aligns interface method signature variance validation with the VM by validating all instance methods and all virtual methods (including static virtual/abstract).
  • Adds a ReadyToRun regression test covering the reported “variant type parameter used in a type-owned constraint” pattern.

Reviewed changes

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

FileDescription
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeValidationChecker.csFixes variance validation rules to match VM behavior and avoids invalid checks on type-owned constraints.
src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/TypeValidation/GenericTypeConstraints.csAdds a minimal source test case that exercises the constraint + variance pattern.
src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csAdds a test that runs Crossgen2 with automatic type validation and asserts the resulting image sets READYTORUN_FLAG_SkipTypeValidation.

CopilotAI review requested due to automatic review settings August 31, 2026 16:25

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟢 Approval recommended

Review details
  • Files reviewed: 3/3 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

@jtschuster

Copy link
Copy Markdown
MemberAuthor

/ba-g failures unrelated

@jtschuster
jtschuster merged commit 65c1f69 into dotnet:mainSep 2, 2026
104 of 108 checks passed
@jtschuster

Copy link
Copy Markdown
MemberAuthor

/backport to release/11.0-rc1

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/11.0-rc1 (link to workflow run)

@jtschuster

Copy link
Copy Markdown
MemberAuthor

/backport to release/10.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/10.0 (link to workflow run)

@github-actions

Copy link
Copy Markdown
Contributor

@jtschuster backporting to release/11.0-rc1 failed, the patch most likely resulted in conflicts. Please backport manually!

git am output
$ git cherry-pick 65c1f69d9fe4758690ed0d3cedaba0aed2fadd6fAuto-merging src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csCONFLICT (content): Merge conflict in src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cserror: could not apply 65c1f69d9fe... Fix Crossgen2 variance validation for type constraints (#132809)hint: After resolving the conflicts, mark them withhint: "git add/rm <pathspec>", then runhint: "git cherry-pick --continue".hint: You can instead skip this commit with "git cherry-pick --skip".hint: To abort and get back to the state before "git cherry-pick",hint: run "git cherry-pick --abort".hint: Disable this message with "git config set advice.mergeConflict false"
$ git am --3way --empty=keep --ignore-whitespace --keep-non-patch changes.patchApplying: Fix Crossgen2 variance validation for type constraintsUsing index info to reconstruct a base tree...M	src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csFalling back to patching base and 3-way merge...Auto-merging src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csCONFLICT (content): Merge conflict in src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cserror: Failed to merge in the changes.hint: Use 'git am --show-current-patch=diff' to see the failed patchhint: When you have resolved this problem, run "git am --continue".hint: If you prefer to skip this patch, run "git am --skip" instead.hint: To restore the original branch and stop patching, run "git am --abort".hint: Disable this message with "git config set advice.mergeConflict false"Patch failed at 0001 Fix Crossgen2 variance validation for type constraintsError: The process '/usr/bin/git' failed with exit code 128

Link to workflow output

@github-actions

Copy link
Copy Markdown
Contributor

@jtschuster backporting to release/10.0 failed, the patch most likely resulted in conflicts. Please backport manually!

git am output
$ git cherry-pick 65c1f69d9fe4758690ed0d3cedaba0aed2fadd6fCONFLICT (modify/delete): src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cs deleted in HEAD and modified in 65c1f69d9fe (Fix Crossgen2 variance validation for type constraints (#132809)). Version 65c1f69d9fe (Fix Crossgen2 variance validation for type constraints (#132809)) of src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cs left in tree.Auto-merging src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeValidationChecker.cserror: could not apply 65c1f69d9fe... Fix Crossgen2 variance validation for type constraints (#132809)hint: After resolving the conflicts, mark them withhint: "git add/rm <pathspec>", then runhint: "git cherry-pick --continue".hint: You can instead skip this commit with "git cherry-pick --skip".hint: To abort and get back to the state before "git cherry-pick",hint: run "git cherry-pick --abort".hint: Disable this message with "git config set advice.mergeConflict false"
$ git am --3way --empty=keep --ignore-whitespace --keep-non-patch changes.patchApplying: Fix Crossgen2 variance validation for type constraintsUsing index info to reconstruct a base tree...A	src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csM	src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeValidationChecker.csFalling back to patching base and 3-way merge...CONFLICT (modify/delete): src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cs deleted in HEAD and modified in Fix Crossgen2 variance validation for type constraints. Version Fix Crossgen2 variance validation for type constraints of src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cs left in tree.Auto-merging src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeValidationChecker.cserror: Failed to merge in the changes.hint: Use 'git am --show-current-patch=diff' to see the failed patchhint: When you have resolved this problem, run "git am --continue".hint: If you prefer to skip this patch, run "git am --skip" instead.hint: To restore the original branch and stop patching, run "git am --abort".hint: Disable this message with "git config set advice.mergeConflict false"Patch failed at 0001 Fix Crossgen2 variance validation for type constraintsError: The process '/usr/bin/git' failed with exit code 128

Link to workflow output

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

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

Crossgen2 10.0.2+ reports false generic variance error and clears SkipTypeValidation

4 participants

@jtschuster@jkoritzinsky@davidwrighton
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Fix Crossgen2 variance validation for type constraints - #132809

Merged
jtschuster merged 2 commits into
dotnet:mainfrom
jtschuster:fix-crossgen2-variance
Sep 2, 2026
Merged

Fix Crossgen2 variance validation for type constraints#132809
jtschuster merged 2 commits into
dotnet:mainfrom
jtschuster:fix-crossgen2-variance

Conversation

@jtschuster

@jtschusterjtschuster commented Aug 27, 2026

Copy link
Copy Markdown
Member

Summary

Crossgen2 applied method generic-constraint variance rules to a generic type's own constraints. ECMA-335 II.9.7 explicitly leaves type-owned constraints unrestricted, so valid variant interfaces could fail automatic validation and omit READYTORUN_FLAG_SkipTypeValidation.

This change:

  • removes the invalid variance check for type-owned generic constraints
  • aligns interface method signature validation with the VM by checking all instance methods and virtual methods, including static virtual and static abstract declarations
  • adds a ReadyToRun regression test based on the reported constraint pattern

Fixes#132724

Note

This pull request was created with GitHub Copilot.

Do not apply method constraint variance rules to a generic type's own constraints. Validate static virtual interface method signatures and add coverage for emitting SkipTypeValidation for valid type constraints.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 87038ccf-f45b-40d3-a2d4-ee7d3d7f7a7f
@jtschuster
jtschusterforce-pushed the fix-crossgen2-variance branch from ae7c278 to d2bf9a8CompareAugust 27, 2026 01:14
@jtschuster
jtschuster marked this pull request as ready for review August 27, 2026 01:14
CopilotAI lite review requested due to automatic review settings August 27, 2026 01:14
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR updates Crossgen2’s ReadyToRun type validation logic to better match CoreCLR’s variance validation behavior and to avoid incorrectly rejecting valid generic type-parameter constraints, and adds a regression test to prevent future regressions.

Changes:

  • Removes variance validation for a generic type’s own parameter constraints (leaving constraint usage unrestricted as intended).
  • Aligns interface method signature variance validation with the VM by validating all instance methods and all virtual methods (including static virtual/abstract).
  • Adds a ReadyToRun regression test covering the reported “variant type parameter used in a type-owned constraint” pattern.

Reviewed changes

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

FileDescription
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeValidationChecker.csFixes variance validation rules to match VM behavior and avoids invalid checks on type-owned constraints.
src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/TypeValidation/GenericTypeConstraints.csAdds a minimal source test case that exercises the constraint + variance pattern.
src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csAdds a test that runs Crossgen2 with automatic type validation and asserts the resulting image sets READYTORUN_FLAG_SkipTypeValidation.

CopilotAI review requested due to automatic review settings August 31, 2026 16:25

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟢 Approval recommended

Review details
  • Files reviewed: 3/3 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

@jtschuster

Copy link
Copy Markdown
MemberAuthor

/ba-g failures unrelated

@jtschuster
jtschuster merged commit 65c1f69 into dotnet:mainSep 2, 2026
104 of 108 checks passed
@jtschuster

Copy link
Copy Markdown
MemberAuthor

/backport to release/11.0-rc1

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/11.0-rc1 (link to workflow run)

@jtschuster

Copy link
Copy Markdown
MemberAuthor

/backport to release/10.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/10.0 (link to workflow run)

@github-actions

Copy link
Copy Markdown
Contributor

@jtschuster backporting to release/11.0-rc1 failed, the patch most likely resulted in conflicts. Please backport manually!

git am output
$ git cherry-pick 65c1f69d9fe4758690ed0d3cedaba0aed2fadd6fAuto-merging src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csCONFLICT (content): Merge conflict in src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cserror: could not apply 65c1f69d9fe... Fix Crossgen2 variance validation for type constraints (#132809)hint: After resolving the conflicts, mark them withhint: "git add/rm <pathspec>", then runhint: "git cherry-pick --continue".hint: You can instead skip this commit with "git cherry-pick --skip".hint: To abort and get back to the state before "git cherry-pick",hint: run "git cherry-pick --abort".hint: Disable this message with "git config set advice.mergeConflict false"
$ git am --3way --empty=keep --ignore-whitespace --keep-non-patch changes.patchApplying: Fix Crossgen2 variance validation for type constraintsUsing index info to reconstruct a base tree...M	src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csFalling back to patching base and 3-way merge...Auto-merging src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csCONFLICT (content): Merge conflict in src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cserror: Failed to merge in the changes.hint: Use 'git am --show-current-patch=diff' to see the failed patchhint: When you have resolved this problem, run "git am --continue".hint: If you prefer to skip this patch, run "git am --skip" instead.hint: To restore the original branch and stop patching, run "git am --abort".hint: Disable this message with "git config set advice.mergeConflict false"Patch failed at 0001 Fix Crossgen2 variance validation for type constraintsError: The process '/usr/bin/git' failed with exit code 128

Link to workflow output

@github-actions

Copy link
Copy Markdown
Contributor

@jtschuster backporting to release/10.0 failed, the patch most likely resulted in conflicts. Please backport manually!

git am output
$ git cherry-pick 65c1f69d9fe4758690ed0d3cedaba0aed2fadd6fCONFLICT (modify/delete): src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cs deleted in HEAD and modified in 65c1f69d9fe (Fix Crossgen2 variance validation for type constraints (#132809)). Version 65c1f69d9fe (Fix Crossgen2 variance validation for type constraints (#132809)) of src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cs left in tree.Auto-merging src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeValidationChecker.cserror: could not apply 65c1f69d9fe... Fix Crossgen2 variance validation for type constraints (#132809)hint: After resolving the conflicts, mark them withhint: "git add/rm <pathspec>", then runhint: "git cherry-pick --continue".hint: You can instead skip this commit with "git cherry-pick --skip".hint: To abort and get back to the state before "git cherry-pick",hint: run "git cherry-pick --abort".hint: Disable this message with "git config set advice.mergeConflict false"
$ git am --3way --empty=keep --ignore-whitespace --keep-non-patch changes.patchApplying: Fix Crossgen2 variance validation for type constraintsUsing index info to reconstruct a base tree...A	src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csM	src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeValidationChecker.csFalling back to patching base and 3-way merge...CONFLICT (modify/delete): src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cs deleted in HEAD and modified in Fix Crossgen2 variance validation for type constraints. Version Fix Crossgen2 variance validation for type constraints of src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cs left in tree.Auto-merging src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeValidationChecker.cserror: Failed to merge in the changes.hint: Use 'git am --show-current-patch=diff' to see the failed patchhint: When you have resolved this problem, run "git am --continue".hint: If you prefer to skip this patch, run "git am --skip" instead.hint: To restore the original branch and stop patching, run "git am --abort".hint: Disable this message with "git config set advice.mergeConflict false"Patch failed at 0001 Fix Crossgen2 variance validation for type constraintsError: The process '/usr/bin/git' failed with exit code 128

Link to workflow output

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

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

Crossgen2 10.0.2+ reports false generic variance error and clears SkipTypeValidation

4 participants

@jtschuster@jkoritzinsky@davidwrighton
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Fix Crossgen2 variance validation for type constraints - #132809

Merged
jtschuster merged 2 commits into
dotnet:mainfrom
jtschuster:fix-crossgen2-variance
Sep 2, 2026
Merged

Fix Crossgen2 variance validation for type constraints#132809
jtschuster merged 2 commits into
dotnet:mainfrom
jtschuster:fix-crossgen2-variance

Conversation

@jtschuster

@jtschusterjtschuster commented Aug 27, 2026

Copy link
Copy Markdown
Member

Summary

Crossgen2 applied method generic-constraint variance rules to a generic type's own constraints. ECMA-335 II.9.7 explicitly leaves type-owned constraints unrestricted, so valid variant interfaces could fail automatic validation and omit READYTORUN_FLAG_SkipTypeValidation.

This change:

  • removes the invalid variance check for type-owned generic constraints
  • aligns interface method signature validation with the VM by checking all instance methods and virtual methods, including static virtual and static abstract declarations
  • adds a ReadyToRun regression test based on the reported constraint pattern

Fixes#132724

Note

This pull request was created with GitHub Copilot.

Do not apply method constraint variance rules to a generic type's own constraints. Validate static virtual interface method signatures and add coverage for emitting SkipTypeValidation for valid type constraints.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 87038ccf-f45b-40d3-a2d4-ee7d3d7f7a7f
@jtschuster
jtschusterforce-pushed the fix-crossgen2-variance branch from ae7c278 to d2bf9a8CompareAugust 27, 2026 01:14
@jtschuster
jtschuster marked this pull request as ready for review August 27, 2026 01:14
CopilotAI lite review requested due to automatic review settings August 27, 2026 01:14
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR updates Crossgen2’s ReadyToRun type validation logic to better match CoreCLR’s variance validation behavior and to avoid incorrectly rejecting valid generic type-parameter constraints, and adds a regression test to prevent future regressions.

Changes:

  • Removes variance validation for a generic type’s own parameter constraints (leaving constraint usage unrestricted as intended).
  • Aligns interface method signature variance validation with the VM by validating all instance methods and all virtual methods (including static virtual/abstract).
  • Adds a ReadyToRun regression test covering the reported “variant type parameter used in a type-owned constraint” pattern.

Reviewed changes

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

FileDescription
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeValidationChecker.csFixes variance validation rules to match VM behavior and avoids invalid checks on type-owned constraints.
src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/TypeValidation/GenericTypeConstraints.csAdds a minimal source test case that exercises the constraint + variance pattern.
src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csAdds a test that runs Crossgen2 with automatic type validation and asserts the resulting image sets READYTORUN_FLAG_SkipTypeValidation.

CopilotAI review requested due to automatic review settings August 31, 2026 16:25

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟢 Approval recommended

Review details
  • Files reviewed: 3/3 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

@jtschuster

Copy link
Copy Markdown
MemberAuthor

/ba-g failures unrelated

@jtschuster
jtschuster merged commit 65c1f69 into dotnet:mainSep 2, 2026
104 of 108 checks passed
@jtschuster

Copy link
Copy Markdown
MemberAuthor

/backport to release/11.0-rc1

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/11.0-rc1 (link to workflow run)

@jtschuster

Copy link
Copy Markdown
MemberAuthor

/backport to release/10.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/10.0 (link to workflow run)

@github-actions

Copy link
Copy Markdown
Contributor

@jtschuster backporting to release/11.0-rc1 failed, the patch most likely resulted in conflicts. Please backport manually!

git am output
$ git cherry-pick 65c1f69d9fe4758690ed0d3cedaba0aed2fadd6fAuto-merging src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csCONFLICT (content): Merge conflict in src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cserror: could not apply 65c1f69d9fe... Fix Crossgen2 variance validation for type constraints (#132809)hint: After resolving the conflicts, mark them withhint: "git add/rm <pathspec>", then runhint: "git cherry-pick --continue".hint: You can instead skip this commit with "git cherry-pick --skip".hint: To abort and get back to the state before "git cherry-pick",hint: run "git cherry-pick --abort".hint: Disable this message with "git config set advice.mergeConflict false"
$ git am --3way --empty=keep --ignore-whitespace --keep-non-patch changes.patchApplying: Fix Crossgen2 variance validation for type constraintsUsing index info to reconstruct a base tree...M	src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csFalling back to patching base and 3-way merge...Auto-merging src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csCONFLICT (content): Merge conflict in src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cserror: Failed to merge in the changes.hint: Use 'git am --show-current-patch=diff' to see the failed patchhint: When you have resolved this problem, run "git am --continue".hint: If you prefer to skip this patch, run "git am --skip" instead.hint: To restore the original branch and stop patching, run "git am --abort".hint: Disable this message with "git config set advice.mergeConflict false"Patch failed at 0001 Fix Crossgen2 variance validation for type constraintsError: The process '/usr/bin/git' failed with exit code 128

Link to workflow output

@github-actions

Copy link
Copy Markdown
Contributor

@jtschuster backporting to release/10.0 failed, the patch most likely resulted in conflicts. Please backport manually!

git am output
$ git cherry-pick 65c1f69d9fe4758690ed0d3cedaba0aed2fadd6fCONFLICT (modify/delete): src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cs deleted in HEAD and modified in 65c1f69d9fe (Fix Crossgen2 variance validation for type constraints (#132809)). Version 65c1f69d9fe (Fix Crossgen2 variance validation for type constraints (#132809)) of src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cs left in tree.Auto-merging src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeValidationChecker.cserror: could not apply 65c1f69d9fe... Fix Crossgen2 variance validation for type constraints (#132809)hint: After resolving the conflicts, mark them withhint: "git add/rm <pathspec>", then runhint: "git cherry-pick --continue".hint: You can instead skip this commit with "git cherry-pick --skip".hint: To abort and get back to the state before "git cherry-pick",hint: run "git cherry-pick --abort".hint: Disable this message with "git config set advice.mergeConflict false"
$ git am --3way --empty=keep --ignore-whitespace --keep-non-patch changes.patchApplying: Fix Crossgen2 variance validation for type constraintsUsing index info to reconstruct a base tree...A	src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.csM	src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeValidationChecker.csFalling back to patching base and 3-way merge...CONFLICT (modify/delete): src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cs deleted in HEAD and modified in Fix Crossgen2 variance validation for type constraints. Version Fix Crossgen2 variance validation for type constraints of src/coreclr/tools/aot/ILCompiler.ReadyToRun.Tests/TestCases/R2RTestSuites.cs left in tree.Auto-merging src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeValidationChecker.cserror: Failed to merge in the changes.hint: Use 'git am --show-current-patch=diff' to see the failed patchhint: When you have resolved this problem, run "git am --continue".hint: If you prefer to skip this patch, run "git am --skip" instead.hint: To restore the original branch and stop patching, run "git am --abort".hint: Disable this message with "git config set advice.mergeConflict false"Patch failed at 0001 Fix Crossgen2 variance validation for type constraintsError: The process '/usr/bin/git' failed with exit code 128

Link to workflow output

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

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

Crossgen2 10.0.2+ reports false generic variance error and clears SkipTypeValidation

4 participants

@jtschuster@jkoritzinsky@davidwrighton