Handle canonical types in constraints checks - #129278

Merged
MichalStrehovsky merged 4 commits into
dotnet:mainfrom
MichalStrehovsky:fix126604
Jun 18, 2026
Merged

Handle canonical types in constraints checks#129278
MichalStrehovsky merged 4 commits into
dotnet:mainfrom
MichalStrehovsky:fix126604

Conversation

@MichalStrehovsky

Copy link
Copy Markdown
Member

Fixes#126604

First commit is a revert of the revert.

The second commit is an update to the casting logic so that we can have both casting logic that treats __Canon as a class __Canon : object and nothing else (this is compatible with how casting in CoreCLR VM works), but also another casting logic that treats __Canon as "some reference type, could be something that does cast". Then update constraints check to use this flavor of the casting logic.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @dotnet/ilc-contrib
See info in area-owners.md if you want to be subscribed.

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 the NativeAOT/CoreCLR shared TypeSystem constraint-checking and casting helpers to correctly account for canonical definition types (__Canon, __UniversalCanon) when validating generic constraints, and wires that behavior into MakeGenericType dataflow so reflected generic instantiations can be preserved correctly under AOT/trimming.

Changes:

  • Introduces canonical-aware casting (CanCastToWithCanon) via a handler-based casting helper split (canon vs non-canon builds).
  • Updates TypeSystemConstraintsHelpers constraint validation to use canonical-aware casting and adds canon-specific handling for special/type constraints.
  • Adds coverage: new canonical constraint validation unit tests, and a NativeAOT trimming smoke test; also normalizes instantiations before constraints checking in MakeGenericType dataflow.

Reviewed changes

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

Show a summary per file
FileDescription
src/tests/nativeaot/SmokeTests/TrimmingBehaviors/Dataflow.csAdds a new constrained MakeGenericType + Activator.CreateInstance smoke test.
src/coreclr/tools/ILVerification/ILVerification.projitemsAdds NonCanon helper source inclusions for ILVerification build.
src/coreclr/tools/Common/TypeSystem/Common/TypeSystemConstraintsHelpers.NonCanon.csProvides non-canon stubs for new partial constraint-helper hooks.
src/coreclr/tools/Common/TypeSystem/Common/TypeSystemConstraintsHelpers.csSwitches constraint validation to canonical-aware casting and adds canon-specific fast paths.
src/coreclr/tools/Common/TypeSystem/Common/CastingHelper.NonCanon.csIntended NonCanon implementation of the canonical casting handler.
src/coreclr/tools/Common/TypeSystem/Common/CastingHelper.csRefactors casting logic to support handler-based canon/non-canon behavior; adds CanCastToWithCanon.
src/coreclr/tools/Common/TypeSystem/Canon/TypeSystemConstraintsHelpers.Canon.csImplements canonical-specific constraint logic for __Canon/__UniversalCanon.
src/coreclr/tools/Common/TypeSystem/Canon/CastingHelper.Canon.csImplements canonical matching semantics for casting and generic argument matching.
src/coreclr/tools/aot/ILCompiler.TypeSystem/ILCompiler.TypeSystem.csprojIncludes new canon helper files in the ILCompiler.TypeSystem build.
src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/CoreTestAssembly/GenericConstraints.csAdds new types used to test invariant interface constraints with canonical args.
src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/ConstraintsValidationTest.csAdds a new test suite validating canonical type behavior in constraint checking.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/Dataflow/HandleCallAction.csNormalizes instantiated types before checking constraints in MakeGenericType dependency computation.
src/coreclr/nativeaot/System.Private.TypeLoader/src/System.Private.TypeLoader.csprojIncludes the canon casting handler to satisfy CanCastToWithCanon usage.

Comment threadsrc/tests/nativeaot/SmokeTests/TrimmingBehaviors/Dataflow.cs
Comment threadsrc/coreclr/tools/Common/TypeSystem/Common/CastingHelper.cs
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

CopilotAI review requested due to automatic review settings June 17, 2026 06:09

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

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

Comment threadsrc/coreclr/tools/Common/TypeSystem/Common/CastingHelper.cs
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/ba-g windows arm64 timeouts are known

@MichalStrehovsky
MichalStrehovsky merged commit ee2a8a9 into dotnet:mainJun 18, 2026
132 of 140 checks passed
@MichalStrehovsky
MichalStrehovsky deleted the fix126604 branch June 18, 2026 21:53
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 19, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
Fixes#126604
First commit is a revert of the revert.
The second commit is an update to the casting logic so that we can have
both casting logic that treats `__Canon` as a `class __Canon : object`
and nothing else (this is compatible with how casting in CoreCLR VM
works), but also another casting logic that treats `__Canon` as "some
reference type, could be something that does cast". Then update
constraints check to use this flavor of the casting logic.
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 20, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

NativeAOT MakeGenericType fails to activate reflected generic type when generic parameter has self-referential interface constraint

3 participants

@MichalStrehovsky@sbomer
, '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

Handle canonical types in constraints checks - #129278

Merged
MichalStrehovsky merged 4 commits into
dotnet:mainfrom
MichalStrehovsky:fix126604
Jun 18, 2026
Merged

Handle canonical types in constraints checks#129278
MichalStrehovsky merged 4 commits into
dotnet:mainfrom
MichalStrehovsky:fix126604

Conversation

@MichalStrehovsky

Copy link
Copy Markdown
Member

Fixes#126604

First commit is a revert of the revert.

The second commit is an update to the casting logic so that we can have both casting logic that treats __Canon as a class __Canon : object and nothing else (this is compatible with how casting in CoreCLR VM works), but also another casting logic that treats __Canon as "some reference type, could be something that does cast". Then update constraints check to use this flavor of the casting logic.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @dotnet/ilc-contrib
See info in area-owners.md if you want to be subscribed.

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 the NativeAOT/CoreCLR shared TypeSystem constraint-checking and casting helpers to correctly account for canonical definition types (__Canon, __UniversalCanon) when validating generic constraints, and wires that behavior into MakeGenericType dataflow so reflected generic instantiations can be preserved correctly under AOT/trimming.

Changes:

  • Introduces canonical-aware casting (CanCastToWithCanon) via a handler-based casting helper split (canon vs non-canon builds).
  • Updates TypeSystemConstraintsHelpers constraint validation to use canonical-aware casting and adds canon-specific handling for special/type constraints.
  • Adds coverage: new canonical constraint validation unit tests, and a NativeAOT trimming smoke test; also normalizes instantiations before constraints checking in MakeGenericType dataflow.

Reviewed changes

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

Show a summary per file
FileDescription
src/tests/nativeaot/SmokeTests/TrimmingBehaviors/Dataflow.csAdds a new constrained MakeGenericType + Activator.CreateInstance smoke test.
src/coreclr/tools/ILVerification/ILVerification.projitemsAdds NonCanon helper source inclusions for ILVerification build.
src/coreclr/tools/Common/TypeSystem/Common/TypeSystemConstraintsHelpers.NonCanon.csProvides non-canon stubs for new partial constraint-helper hooks.
src/coreclr/tools/Common/TypeSystem/Common/TypeSystemConstraintsHelpers.csSwitches constraint validation to canonical-aware casting and adds canon-specific fast paths.
src/coreclr/tools/Common/TypeSystem/Common/CastingHelper.NonCanon.csIntended NonCanon implementation of the canonical casting handler.
src/coreclr/tools/Common/TypeSystem/Common/CastingHelper.csRefactors casting logic to support handler-based canon/non-canon behavior; adds CanCastToWithCanon.
src/coreclr/tools/Common/TypeSystem/Canon/TypeSystemConstraintsHelpers.Canon.csImplements canonical-specific constraint logic for __Canon/__UniversalCanon.
src/coreclr/tools/Common/TypeSystem/Canon/CastingHelper.Canon.csImplements canonical matching semantics for casting and generic argument matching.
src/coreclr/tools/aot/ILCompiler.TypeSystem/ILCompiler.TypeSystem.csprojIncludes new canon helper files in the ILCompiler.TypeSystem build.
src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/CoreTestAssembly/GenericConstraints.csAdds new types used to test invariant interface constraints with canonical args.
src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/ConstraintsValidationTest.csAdds a new test suite validating canonical type behavior in constraint checking.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/Dataflow/HandleCallAction.csNormalizes instantiated types before checking constraints in MakeGenericType dependency computation.
src/coreclr/nativeaot/System.Private.TypeLoader/src/System.Private.TypeLoader.csprojIncludes the canon casting handler to satisfy CanCastToWithCanon usage.

Comment threadsrc/tests/nativeaot/SmokeTests/TrimmingBehaviors/Dataflow.cs
Comment threadsrc/coreclr/tools/Common/TypeSystem/Common/CastingHelper.cs
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

CopilotAI review requested due to automatic review settings June 17, 2026 06:09

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

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

Comment threadsrc/coreclr/tools/Common/TypeSystem/Common/CastingHelper.cs
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/ba-g windows arm64 timeouts are known

@MichalStrehovsky
MichalStrehovsky merged commit ee2a8a9 into dotnet:mainJun 18, 2026
132 of 140 checks passed
@MichalStrehovsky
MichalStrehovsky deleted the fix126604 branch June 18, 2026 21:53
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 19, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
Fixes#126604
First commit is a revert of the revert.
The second commit is an update to the casting logic so that we can have
both casting logic that treats `__Canon` as a `class __Canon : object`
and nothing else (this is compatible with how casting in CoreCLR VM
works), but also another casting logic that treats `__Canon` as "some
reference type, could be something that does cast". Then update
constraints check to use this flavor of the casting logic.
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 20, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

NativeAOT MakeGenericType fails to activate reflected generic type when generic parameter has self-referential interface constraint

3 participants

@MichalStrehovsky@sbomer
, '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

Handle canonical types in constraints checks - #129278

Merged
MichalStrehovsky merged 4 commits into
dotnet:mainfrom
MichalStrehovsky:fix126604
Jun 18, 2026
Merged

Handle canonical types in constraints checks#129278
MichalStrehovsky merged 4 commits into
dotnet:mainfrom
MichalStrehovsky:fix126604

Conversation

@MichalStrehovsky

Copy link
Copy Markdown
Member

Fixes#126604

First commit is a revert of the revert.

The second commit is an update to the casting logic so that we can have both casting logic that treats __Canon as a class __Canon : object and nothing else (this is compatible with how casting in CoreCLR VM works), but also another casting logic that treats __Canon as "some reference type, could be something that does cast". Then update constraints check to use this flavor of the casting logic.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @dotnet/ilc-contrib
See info in area-owners.md if you want to be subscribed.

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 the NativeAOT/CoreCLR shared TypeSystem constraint-checking and casting helpers to correctly account for canonical definition types (__Canon, __UniversalCanon) when validating generic constraints, and wires that behavior into MakeGenericType dataflow so reflected generic instantiations can be preserved correctly under AOT/trimming.

Changes:

  • Introduces canonical-aware casting (CanCastToWithCanon) via a handler-based casting helper split (canon vs non-canon builds).
  • Updates TypeSystemConstraintsHelpers constraint validation to use canonical-aware casting and adds canon-specific handling for special/type constraints.
  • Adds coverage: new canonical constraint validation unit tests, and a NativeAOT trimming smoke test; also normalizes instantiations before constraints checking in MakeGenericType dataflow.

Reviewed changes

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

Show a summary per file
FileDescription
src/tests/nativeaot/SmokeTests/TrimmingBehaviors/Dataflow.csAdds a new constrained MakeGenericType + Activator.CreateInstance smoke test.
src/coreclr/tools/ILVerification/ILVerification.projitemsAdds NonCanon helper source inclusions for ILVerification build.
src/coreclr/tools/Common/TypeSystem/Common/TypeSystemConstraintsHelpers.NonCanon.csProvides non-canon stubs for new partial constraint-helper hooks.
src/coreclr/tools/Common/TypeSystem/Common/TypeSystemConstraintsHelpers.csSwitches constraint validation to canonical-aware casting and adds canon-specific fast paths.
src/coreclr/tools/Common/TypeSystem/Common/CastingHelper.NonCanon.csIntended NonCanon implementation of the canonical casting handler.
src/coreclr/tools/Common/TypeSystem/Common/CastingHelper.csRefactors casting logic to support handler-based canon/non-canon behavior; adds CanCastToWithCanon.
src/coreclr/tools/Common/TypeSystem/Canon/TypeSystemConstraintsHelpers.Canon.csImplements canonical-specific constraint logic for __Canon/__UniversalCanon.
src/coreclr/tools/Common/TypeSystem/Canon/CastingHelper.Canon.csImplements canonical matching semantics for casting and generic argument matching.
src/coreclr/tools/aot/ILCompiler.TypeSystem/ILCompiler.TypeSystem.csprojIncludes new canon helper files in the ILCompiler.TypeSystem build.
src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/CoreTestAssembly/GenericConstraints.csAdds new types used to test invariant interface constraints with canonical args.
src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/ConstraintsValidationTest.csAdds a new test suite validating canonical type behavior in constraint checking.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/Dataflow/HandleCallAction.csNormalizes instantiated types before checking constraints in MakeGenericType dependency computation.
src/coreclr/nativeaot/System.Private.TypeLoader/src/System.Private.TypeLoader.csprojIncludes the canon casting handler to satisfy CanCastToWithCanon usage.

Comment threadsrc/tests/nativeaot/SmokeTests/TrimmingBehaviors/Dataflow.cs
Comment threadsrc/coreclr/tools/Common/TypeSystem/Common/CastingHelper.cs
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

CopilotAI review requested due to automatic review settings June 17, 2026 06:09

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

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

Comment threadsrc/coreclr/tools/Common/TypeSystem/Common/CastingHelper.cs
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/ba-g windows arm64 timeouts are known

@MichalStrehovsky
MichalStrehovsky merged commit ee2a8a9 into dotnet:mainJun 18, 2026
132 of 140 checks passed
@MichalStrehovsky
MichalStrehovsky deleted the fix126604 branch June 18, 2026 21:53
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 19, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
Fixes#126604
First commit is a revert of the revert.
The second commit is an update to the casting logic so that we can have
both casting logic that treats `__Canon` as a `class __Canon : object`
and nothing else (this is compatible with how casting in CoreCLR VM
works), but also another casting logic that treats `__Canon` as "some
reference type, could be something that does cast". Then update
constraints check to use this flavor of the casting logic.
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 20, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

NativeAOT MakeGenericType fails to activate reflected generic type when generic parameter has self-referential interface constraint

3 participants

@MichalStrehovsky@sbomer
, '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

Handle canonical types in constraints checks - #129278

Merged
MichalStrehovsky merged 4 commits into
dotnet:mainfrom
MichalStrehovsky:fix126604
Jun 18, 2026
Merged

Handle canonical types in constraints checks#129278
MichalStrehovsky merged 4 commits into
dotnet:mainfrom
MichalStrehovsky:fix126604

Conversation

@MichalStrehovsky

Copy link
Copy Markdown
Member

Fixes#126604

First commit is a revert of the revert.

The second commit is an update to the casting logic so that we can have both casting logic that treats __Canon as a class __Canon : object and nothing else (this is compatible with how casting in CoreCLR VM works), but also another casting logic that treats __Canon as "some reference type, could be something that does cast". Then update constraints check to use this flavor of the casting logic.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @dotnet/ilc-contrib
See info in area-owners.md if you want to be subscribed.

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 the NativeAOT/CoreCLR shared TypeSystem constraint-checking and casting helpers to correctly account for canonical definition types (__Canon, __UniversalCanon) when validating generic constraints, and wires that behavior into MakeGenericType dataflow so reflected generic instantiations can be preserved correctly under AOT/trimming.

Changes:

  • Introduces canonical-aware casting (CanCastToWithCanon) via a handler-based casting helper split (canon vs non-canon builds).
  • Updates TypeSystemConstraintsHelpers constraint validation to use canonical-aware casting and adds canon-specific handling for special/type constraints.
  • Adds coverage: new canonical constraint validation unit tests, and a NativeAOT trimming smoke test; also normalizes instantiations before constraints checking in MakeGenericType dataflow.

Reviewed changes

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

Show a summary per file
FileDescription
src/tests/nativeaot/SmokeTests/TrimmingBehaviors/Dataflow.csAdds a new constrained MakeGenericType + Activator.CreateInstance smoke test.
src/coreclr/tools/ILVerification/ILVerification.projitemsAdds NonCanon helper source inclusions for ILVerification build.
src/coreclr/tools/Common/TypeSystem/Common/TypeSystemConstraintsHelpers.NonCanon.csProvides non-canon stubs for new partial constraint-helper hooks.
src/coreclr/tools/Common/TypeSystem/Common/TypeSystemConstraintsHelpers.csSwitches constraint validation to canonical-aware casting and adds canon-specific fast paths.
src/coreclr/tools/Common/TypeSystem/Common/CastingHelper.NonCanon.csIntended NonCanon implementation of the canonical casting handler.
src/coreclr/tools/Common/TypeSystem/Common/CastingHelper.csRefactors casting logic to support handler-based canon/non-canon behavior; adds CanCastToWithCanon.
src/coreclr/tools/Common/TypeSystem/Canon/TypeSystemConstraintsHelpers.Canon.csImplements canonical-specific constraint logic for __Canon/__UniversalCanon.
src/coreclr/tools/Common/TypeSystem/Canon/CastingHelper.Canon.csImplements canonical matching semantics for casting and generic argument matching.
src/coreclr/tools/aot/ILCompiler.TypeSystem/ILCompiler.TypeSystem.csprojIncludes new canon helper files in the ILCompiler.TypeSystem build.
src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/CoreTestAssembly/GenericConstraints.csAdds new types used to test invariant interface constraints with canonical args.
src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/ConstraintsValidationTest.csAdds a new test suite validating canonical type behavior in constraint checking.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/Dataflow/HandleCallAction.csNormalizes instantiated types before checking constraints in MakeGenericType dependency computation.
src/coreclr/nativeaot/System.Private.TypeLoader/src/System.Private.TypeLoader.csprojIncludes the canon casting handler to satisfy CanCastToWithCanon usage.

Comment threadsrc/tests/nativeaot/SmokeTests/TrimmingBehaviors/Dataflow.cs
Comment threadsrc/coreclr/tools/Common/TypeSystem/Common/CastingHelper.cs
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

CopilotAI review requested due to automatic review settings June 17, 2026 06:09

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

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

Comment threadsrc/coreclr/tools/Common/TypeSystem/Common/CastingHelper.cs
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/ba-g windows arm64 timeouts are known

@MichalStrehovsky
MichalStrehovsky merged commit ee2a8a9 into dotnet:mainJun 18, 2026
132 of 140 checks passed
@MichalStrehovsky
MichalStrehovsky deleted the fix126604 branch June 18, 2026 21:53
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 19, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
Fixes#126604
First commit is a revert of the revert.
The second commit is an update to the casting logic so that we can have
both casting logic that treats `__Canon` as a `class __Canon : object`
and nothing else (this is compatible with how casting in CoreCLR VM
works), but also another casting logic that treats `__Canon` as "some
reference type, could be something that does cast". Then update
constraints check to use this flavor of the casting logic.
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 20, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

NativeAOT MakeGenericType fails to activate reflected generic type when generic parameter has self-referential interface constraint

3 participants

@MichalStrehovsky@sbomer
, '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

Handle canonical types in constraints checks - #129278

Merged
MichalStrehovsky merged 4 commits into
dotnet:mainfrom
MichalStrehovsky:fix126604
Jun 18, 2026
Merged

Handle canonical types in constraints checks#129278
MichalStrehovsky merged 4 commits into
dotnet:mainfrom
MichalStrehovsky:fix126604

Conversation

@MichalStrehovsky

Copy link
Copy Markdown
Member

Fixes#126604

First commit is a revert of the revert.

The second commit is an update to the casting logic so that we can have both casting logic that treats __Canon as a class __Canon : object and nothing else (this is compatible with how casting in CoreCLR VM works), but also another casting logic that treats __Canon as "some reference type, could be something that does cast". Then update constraints check to use this flavor of the casting logic.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @dotnet/ilc-contrib
See info in area-owners.md if you want to be subscribed.

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 the NativeAOT/CoreCLR shared TypeSystem constraint-checking and casting helpers to correctly account for canonical definition types (__Canon, __UniversalCanon) when validating generic constraints, and wires that behavior into MakeGenericType dataflow so reflected generic instantiations can be preserved correctly under AOT/trimming.

Changes:

  • Introduces canonical-aware casting (CanCastToWithCanon) via a handler-based casting helper split (canon vs non-canon builds).
  • Updates TypeSystemConstraintsHelpers constraint validation to use canonical-aware casting and adds canon-specific handling for special/type constraints.
  • Adds coverage: new canonical constraint validation unit tests, and a NativeAOT trimming smoke test; also normalizes instantiations before constraints checking in MakeGenericType dataflow.

Reviewed changes

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

Show a summary per file
FileDescription
src/tests/nativeaot/SmokeTests/TrimmingBehaviors/Dataflow.csAdds a new constrained MakeGenericType + Activator.CreateInstance smoke test.
src/coreclr/tools/ILVerification/ILVerification.projitemsAdds NonCanon helper source inclusions for ILVerification build.
src/coreclr/tools/Common/TypeSystem/Common/TypeSystemConstraintsHelpers.NonCanon.csProvides non-canon stubs for new partial constraint-helper hooks.
src/coreclr/tools/Common/TypeSystem/Common/TypeSystemConstraintsHelpers.csSwitches constraint validation to canonical-aware casting and adds canon-specific fast paths.
src/coreclr/tools/Common/TypeSystem/Common/CastingHelper.NonCanon.csIntended NonCanon implementation of the canonical casting handler.
src/coreclr/tools/Common/TypeSystem/Common/CastingHelper.csRefactors casting logic to support handler-based canon/non-canon behavior; adds CanCastToWithCanon.
src/coreclr/tools/Common/TypeSystem/Canon/TypeSystemConstraintsHelpers.Canon.csImplements canonical-specific constraint logic for __Canon/__UniversalCanon.
src/coreclr/tools/Common/TypeSystem/Canon/CastingHelper.Canon.csImplements canonical matching semantics for casting and generic argument matching.
src/coreclr/tools/aot/ILCompiler.TypeSystem/ILCompiler.TypeSystem.csprojIncludes new canon helper files in the ILCompiler.TypeSystem build.
src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/CoreTestAssembly/GenericConstraints.csAdds new types used to test invariant interface constraints with canonical args.
src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/ConstraintsValidationTest.csAdds a new test suite validating canonical type behavior in constraint checking.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/Dataflow/HandleCallAction.csNormalizes instantiated types before checking constraints in MakeGenericType dependency computation.
src/coreclr/nativeaot/System.Private.TypeLoader/src/System.Private.TypeLoader.csprojIncludes the canon casting handler to satisfy CanCastToWithCanon usage.

Comment threadsrc/tests/nativeaot/SmokeTests/TrimmingBehaviors/Dataflow.cs
Comment threadsrc/coreclr/tools/Common/TypeSystem/Common/CastingHelper.cs
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

CopilotAI review requested due to automatic review settings June 17, 2026 06:09

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

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

Comment threadsrc/coreclr/tools/Common/TypeSystem/Common/CastingHelper.cs
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/ba-g windows arm64 timeouts are known

@MichalStrehovsky
MichalStrehovsky merged commit ee2a8a9 into dotnet:mainJun 18, 2026
132 of 140 checks passed
@MichalStrehovsky
MichalStrehovsky deleted the fix126604 branch June 18, 2026 21:53
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 19, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
Fixes#126604
First commit is a revert of the revert.
The second commit is an update to the casting logic so that we can have
both casting logic that treats `__Canon` as a `class __Canon : object`
and nothing else (this is compatible with how casting in CoreCLR VM
works), but also another casting logic that treats `__Canon` as "some
reference type, could be something that does cast". Then update
constraints check to use this flavor of the casting logic.
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 20, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

NativeAOT MakeGenericType fails to activate reflected generic type when generic parameter has self-referential interface constraint

3 participants

@MichalStrehovsky@sbomer
, '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

Handle canonical types in constraints checks - #129278

Merged
MichalStrehovsky merged 4 commits into
dotnet:mainfrom
MichalStrehovsky:fix126604
Jun 18, 2026
Merged

Handle canonical types in constraints checks#129278
MichalStrehovsky merged 4 commits into
dotnet:mainfrom
MichalStrehovsky:fix126604

Conversation

@MichalStrehovsky

Copy link
Copy Markdown
Member

Fixes#126604

First commit is a revert of the revert.

The second commit is an update to the casting logic so that we can have both casting logic that treats __Canon as a class __Canon : object and nothing else (this is compatible with how casting in CoreCLR VM works), but also another casting logic that treats __Canon as "some reference type, could be something that does cast". Then update constraints check to use this flavor of the casting logic.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @dotnet/ilc-contrib
See info in area-owners.md if you want to be subscribed.

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 the NativeAOT/CoreCLR shared TypeSystem constraint-checking and casting helpers to correctly account for canonical definition types (__Canon, __UniversalCanon) when validating generic constraints, and wires that behavior into MakeGenericType dataflow so reflected generic instantiations can be preserved correctly under AOT/trimming.

Changes:

  • Introduces canonical-aware casting (CanCastToWithCanon) via a handler-based casting helper split (canon vs non-canon builds).
  • Updates TypeSystemConstraintsHelpers constraint validation to use canonical-aware casting and adds canon-specific handling for special/type constraints.
  • Adds coverage: new canonical constraint validation unit tests, and a NativeAOT trimming smoke test; also normalizes instantiations before constraints checking in MakeGenericType dataflow.

Reviewed changes

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

Show a summary per file
FileDescription
src/tests/nativeaot/SmokeTests/TrimmingBehaviors/Dataflow.csAdds a new constrained MakeGenericType + Activator.CreateInstance smoke test.
src/coreclr/tools/ILVerification/ILVerification.projitemsAdds NonCanon helper source inclusions for ILVerification build.
src/coreclr/tools/Common/TypeSystem/Common/TypeSystemConstraintsHelpers.NonCanon.csProvides non-canon stubs for new partial constraint-helper hooks.
src/coreclr/tools/Common/TypeSystem/Common/TypeSystemConstraintsHelpers.csSwitches constraint validation to canonical-aware casting and adds canon-specific fast paths.
src/coreclr/tools/Common/TypeSystem/Common/CastingHelper.NonCanon.csIntended NonCanon implementation of the canonical casting handler.
src/coreclr/tools/Common/TypeSystem/Common/CastingHelper.csRefactors casting logic to support handler-based canon/non-canon behavior; adds CanCastToWithCanon.
src/coreclr/tools/Common/TypeSystem/Canon/TypeSystemConstraintsHelpers.Canon.csImplements canonical-specific constraint logic for __Canon/__UniversalCanon.
src/coreclr/tools/Common/TypeSystem/Canon/CastingHelper.Canon.csImplements canonical matching semantics for casting and generic argument matching.
src/coreclr/tools/aot/ILCompiler.TypeSystem/ILCompiler.TypeSystem.csprojIncludes new canon helper files in the ILCompiler.TypeSystem build.
src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/CoreTestAssembly/GenericConstraints.csAdds new types used to test invariant interface constraints with canonical args.
src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/ConstraintsValidationTest.csAdds a new test suite validating canonical type behavior in constraint checking.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/Dataflow/HandleCallAction.csNormalizes instantiated types before checking constraints in MakeGenericType dependency computation.
src/coreclr/nativeaot/System.Private.TypeLoader/src/System.Private.TypeLoader.csprojIncludes the canon casting handler to satisfy CanCastToWithCanon usage.

Comment threadsrc/tests/nativeaot/SmokeTests/TrimmingBehaviors/Dataflow.cs
Comment threadsrc/coreclr/tools/Common/TypeSystem/Common/CastingHelper.cs
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

CopilotAI review requested due to automatic review settings June 17, 2026 06:09

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

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

Comment threadsrc/coreclr/tools/Common/TypeSystem/Common/CastingHelper.cs
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/ba-g windows arm64 timeouts are known

@MichalStrehovsky
MichalStrehovsky merged commit ee2a8a9 into dotnet:mainJun 18, 2026
132 of 140 checks passed
@MichalStrehovsky
MichalStrehovsky deleted the fix126604 branch June 18, 2026 21:53
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 19, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
Fixes#126604
First commit is a revert of the revert.
The second commit is an update to the casting logic so that we can have
both casting logic that treats `__Canon` as a `class __Canon : object`
and nothing else (this is compatible with how casting in CoreCLR VM
works), but also another casting logic that treats `__Canon` as "some
reference type, could be something that does cast". Then update
constraints check to use this flavor of the casting logic.
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 20, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

NativeAOT MakeGenericType fails to activate reflected generic type when generic parameter has self-referential interface constraint

3 participants

@MichalStrehovsky@sbomer
, '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

Handle canonical types in constraints checks - #129278

Merged
MichalStrehovsky merged 4 commits into
dotnet:mainfrom
MichalStrehovsky:fix126604
Jun 18, 2026
Merged

Handle canonical types in constraints checks#129278
MichalStrehovsky merged 4 commits into
dotnet:mainfrom
MichalStrehovsky:fix126604

Conversation

@MichalStrehovsky

Copy link
Copy Markdown
Member

Fixes#126604

First commit is a revert of the revert.

The second commit is an update to the casting logic so that we can have both casting logic that treats __Canon as a class __Canon : object and nothing else (this is compatible with how casting in CoreCLR VM works), but also another casting logic that treats __Canon as "some reference type, could be something that does cast". Then update constraints check to use this flavor of the casting logic.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @dotnet/ilc-contrib
See info in area-owners.md if you want to be subscribed.

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 the NativeAOT/CoreCLR shared TypeSystem constraint-checking and casting helpers to correctly account for canonical definition types (__Canon, __UniversalCanon) when validating generic constraints, and wires that behavior into MakeGenericType dataflow so reflected generic instantiations can be preserved correctly under AOT/trimming.

Changes:

  • Introduces canonical-aware casting (CanCastToWithCanon) via a handler-based casting helper split (canon vs non-canon builds).
  • Updates TypeSystemConstraintsHelpers constraint validation to use canonical-aware casting and adds canon-specific handling for special/type constraints.
  • Adds coverage: new canonical constraint validation unit tests, and a NativeAOT trimming smoke test; also normalizes instantiations before constraints checking in MakeGenericType dataflow.

Reviewed changes

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

Show a summary per file
FileDescription
src/tests/nativeaot/SmokeTests/TrimmingBehaviors/Dataflow.csAdds a new constrained MakeGenericType + Activator.CreateInstance smoke test.
src/coreclr/tools/ILVerification/ILVerification.projitemsAdds NonCanon helper source inclusions for ILVerification build.
src/coreclr/tools/Common/TypeSystem/Common/TypeSystemConstraintsHelpers.NonCanon.csProvides non-canon stubs for new partial constraint-helper hooks.
src/coreclr/tools/Common/TypeSystem/Common/TypeSystemConstraintsHelpers.csSwitches constraint validation to canonical-aware casting and adds canon-specific fast paths.
src/coreclr/tools/Common/TypeSystem/Common/CastingHelper.NonCanon.csIntended NonCanon implementation of the canonical casting handler.
src/coreclr/tools/Common/TypeSystem/Common/CastingHelper.csRefactors casting logic to support handler-based canon/non-canon behavior; adds CanCastToWithCanon.
src/coreclr/tools/Common/TypeSystem/Canon/TypeSystemConstraintsHelpers.Canon.csImplements canonical-specific constraint logic for __Canon/__UniversalCanon.
src/coreclr/tools/Common/TypeSystem/Canon/CastingHelper.Canon.csImplements canonical matching semantics for casting and generic argument matching.
src/coreclr/tools/aot/ILCompiler.TypeSystem/ILCompiler.TypeSystem.csprojIncludes new canon helper files in the ILCompiler.TypeSystem build.
src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/CoreTestAssembly/GenericConstraints.csAdds new types used to test invariant interface constraints with canonical args.
src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/ConstraintsValidationTest.csAdds a new test suite validating canonical type behavior in constraint checking.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/Dataflow/HandleCallAction.csNormalizes instantiated types before checking constraints in MakeGenericType dependency computation.
src/coreclr/nativeaot/System.Private.TypeLoader/src/System.Private.TypeLoader.csprojIncludes the canon casting handler to satisfy CanCastToWithCanon usage.

Comment threadsrc/tests/nativeaot/SmokeTests/TrimmingBehaviors/Dataflow.cs
Comment threadsrc/coreclr/tools/Common/TypeSystem/Common/CastingHelper.cs
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

CopilotAI review requested due to automatic review settings June 17, 2026 06:09

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

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

Comment threadsrc/coreclr/tools/Common/TypeSystem/Common/CastingHelper.cs
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/ba-g windows arm64 timeouts are known

@MichalStrehovsky
MichalStrehovsky merged commit ee2a8a9 into dotnet:mainJun 18, 2026
132 of 140 checks passed
@MichalStrehovsky
MichalStrehovsky deleted the fix126604 branch June 18, 2026 21:53
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 19, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
Fixes#126604
First commit is a revert of the revert.
The second commit is an update to the casting logic so that we can have
both casting logic that treats `__Canon` as a `class __Canon : object`
and nothing else (this is compatible with how casting in CoreCLR VM
works), but also another casting logic that treats `__Canon` as "some
reference type, could be something that does cast". Then update
constraints check to use this flavor of the casting logic.
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 20, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

NativeAOT MakeGenericType fails to activate reflected generic type when generic parameter has self-referential interface constraint

3 participants

@MichalStrehovsky@sbomer
, '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

Handle canonical types in constraints checks - #129278

Merged
MichalStrehovsky merged 4 commits into
dotnet:mainfrom
MichalStrehovsky:fix126604
Jun 18, 2026
Merged

Handle canonical types in constraints checks#129278
MichalStrehovsky merged 4 commits into
dotnet:mainfrom
MichalStrehovsky:fix126604

Conversation

@MichalStrehovsky

Copy link
Copy Markdown
Member

Fixes#126604

First commit is a revert of the revert.

The second commit is an update to the casting logic so that we can have both casting logic that treats __Canon as a class __Canon : object and nothing else (this is compatible with how casting in CoreCLR VM works), but also another casting logic that treats __Canon as "some reference type, could be something that does cast". Then update constraints check to use this flavor of the casting logic.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @dotnet/ilc-contrib
See info in area-owners.md if you want to be subscribed.

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 the NativeAOT/CoreCLR shared TypeSystem constraint-checking and casting helpers to correctly account for canonical definition types (__Canon, __UniversalCanon) when validating generic constraints, and wires that behavior into MakeGenericType dataflow so reflected generic instantiations can be preserved correctly under AOT/trimming.

Changes:

  • Introduces canonical-aware casting (CanCastToWithCanon) via a handler-based casting helper split (canon vs non-canon builds).
  • Updates TypeSystemConstraintsHelpers constraint validation to use canonical-aware casting and adds canon-specific handling for special/type constraints.
  • Adds coverage: new canonical constraint validation unit tests, and a NativeAOT trimming smoke test; also normalizes instantiations before constraints checking in MakeGenericType dataflow.

Reviewed changes

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

Show a summary per file
FileDescription
src/tests/nativeaot/SmokeTests/TrimmingBehaviors/Dataflow.csAdds a new constrained MakeGenericType + Activator.CreateInstance smoke test.
src/coreclr/tools/ILVerification/ILVerification.projitemsAdds NonCanon helper source inclusions for ILVerification build.
src/coreclr/tools/Common/TypeSystem/Common/TypeSystemConstraintsHelpers.NonCanon.csProvides non-canon stubs for new partial constraint-helper hooks.
src/coreclr/tools/Common/TypeSystem/Common/TypeSystemConstraintsHelpers.csSwitches constraint validation to canonical-aware casting and adds canon-specific fast paths.
src/coreclr/tools/Common/TypeSystem/Common/CastingHelper.NonCanon.csIntended NonCanon implementation of the canonical casting handler.
src/coreclr/tools/Common/TypeSystem/Common/CastingHelper.csRefactors casting logic to support handler-based canon/non-canon behavior; adds CanCastToWithCanon.
src/coreclr/tools/Common/TypeSystem/Canon/TypeSystemConstraintsHelpers.Canon.csImplements canonical-specific constraint logic for __Canon/__UniversalCanon.
src/coreclr/tools/Common/TypeSystem/Canon/CastingHelper.Canon.csImplements canonical matching semantics for casting and generic argument matching.
src/coreclr/tools/aot/ILCompiler.TypeSystem/ILCompiler.TypeSystem.csprojIncludes new canon helper files in the ILCompiler.TypeSystem build.
src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/CoreTestAssembly/GenericConstraints.csAdds new types used to test invariant interface constraints with canonical args.
src/coreclr/tools/aot/ILCompiler.TypeSystem.Tests/ConstraintsValidationTest.csAdds a new test suite validating canonical type behavior in constraint checking.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/Dataflow/HandleCallAction.csNormalizes instantiated types before checking constraints in MakeGenericType dependency computation.
src/coreclr/nativeaot/System.Private.TypeLoader/src/System.Private.TypeLoader.csprojIncludes the canon casting handler to satisfy CanCastToWithCanon usage.

Comment threadsrc/tests/nativeaot/SmokeTests/TrimmingBehaviors/Dataflow.cs
Comment threadsrc/coreclr/tools/Common/TypeSystem/Common/CastingHelper.cs
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

CopilotAI review requested due to automatic review settings June 17, 2026 06:09

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

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

Comment threadsrc/coreclr/tools/Common/TypeSystem/Common/CastingHelper.cs
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/ba-g windows arm64 timeouts are known

@MichalStrehovsky
MichalStrehovsky merged commit ee2a8a9 into dotnet:mainJun 18, 2026
132 of 140 checks passed
@MichalStrehovsky
MichalStrehovsky deleted the fix126604 branch June 18, 2026 21:53
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 19, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
Fixes#126604
First commit is a revert of the revert.
The second commit is an update to the casting logic so that we can have
both casting logic that treats `__Canon` as a `class __Canon : object`
and nothing else (this is compatible with how casting in CoreCLR VM
works), but also another casting logic that treats `__Canon` as "some
reference type, could be something that does cast". Then update
constraints check to use this flavor of the casting logic.
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 20, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

NativeAOT MakeGenericType fails to activate reflected generic type when generic parameter has self-referential interface constraint

3 participants

@MichalStrehovsky@sbomer