Pull in tests from iltrim prototype - #126275

Closed
MichalStrehovsky wants to merge 1 commit into
dotnet:mainfrom
MichalStrehovsky:iltrim-new-tests
Closed

Pull in tests from iltrim prototype#126275
MichalStrehovsky wants to merge 1 commit into
dotnet:mainfrom
MichalStrehovsky:iltrim-new-tests

Conversation

@MichalStrehovsky

Copy link
Copy Markdown
Member

When we did the iltrim hackathon, we wrote some new tests. These are the tests from https://github.com/MichalStrehovsky/iltrim, moved to the illink tree.

Sending this out for considerations. We can say we don't want them and that would be fine too.

Cc @dotnet/illink

@MichalStrehovskyMichalStrehovsky added the area-Tools-ILLink .NET linker development as well as trimming analyzers label Mar 29, 2026
CopilotAI review requested due to automatic review settings March 29, 2026 12:42
@dotnet-policy-servicedotnet-policy-serviceBot added the linkable-framework Issues associated with delivering a linker friendly framework label Mar 29, 2026

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

Adds a set of new linker/analyzer test cases (ported from the iltrim prototype repo) into the illink test tree, and wires them into the Roslyn analyzer test-case generator output so they run as part of the existing suites.

Changes:

  • Added new Mono.Linker.Tests.Cases.Basic test cases covering signatures, control flow, resources, generics, virtual/interface scenarios, etc.
  • Added new Mono.Linker.Tests.Cases.MultiAssembly test cases (and dependencies) covering multi-assembly linking and type forwarding.
  • Updated/generated ILLink.RoslynAnalyzer.Tests suite mappings to include the new test cases.

Reviewed changes

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

Show a summary per file
FileDescription
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/TypeRefToAssembly.csAdds a multi-assembly typeref scope/keep assertion test.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/MultiAssembly.csAdds a multi-assembly member retention test for a dependency assembly.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/ForwarderReference.csAdds a type-forwarding scenario validating reference removal/retention across assemblies.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/Dependencies/TypeRefToAssembly_Library.csDependency type for TypeRefToAssembly test.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/Dependencies/Forwarder.csDependency assembly-level type forwarder attribute for forwarding scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/Dependencies/ForwardedType.csDefines forwarded type and members used in forwarder test.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/Dependencies/Dep.csDefines dependency members used by MultiAssembly test.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/VirtualMethods.csAdds virtual dispatch retention test.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/TypeSpecSignature.csAdds typespec/unsafe signature coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/TypeOf.csAdds basic typeof retention scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Switch.csAdds switch statement/expression coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Resources.csAdds embedded resource preservation coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/MultiDimArraySignature.csAdds multidimensional array signature coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/MethodSpecSignature.csAdds generic method instantiation signature coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/LibraryModeTest.csAdds test targeting library-mode linker behavior.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/InterfaceOrder.csAdds interface ordering metadata/retention coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/InterfaceCalls.csAdds interface call retention coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/InstanceFields.csAdds instance field/layout scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/GenericType.csAdds generic base type chain retention coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/GenericParameters.csAdds open generic parameter/type name scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/FunctionPointer.csAdds function-pointer signature coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/First.csAdds “first method”/entry-point style scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Finalizer.csAdds finalizer retention/removal behavior test.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/FieldsOfEnum.csAdds enum field retention/formatting coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/FieldSignature.csAdds field signature/type reference coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/FieldRVA.csAdds RVA/initializer data retention coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/ExceptionRegions.csAdds try/catch/filter/finally region coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Calli.csAdds calli emission scenario (with ILVerify skipped).
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Dependencies/Resources_EmbeddedResource.txtAdds embedded resource content used by Resources test.
src/tools/illink/test/ILLink.RoslynAnalyzer.Tests/generated/ILLink.RoslynAnalyzer.Tests.Generator/ILLink.RoslynAnalyzer.Tests.TestCaseGenerator/MultiAssemblyTests.g.csRegisters new MultiAssembly suite test methods for analyzer harness.
src/tools/illink/test/ILLink.RoslynAnalyzer.Tests/generated/ILLink.RoslynAnalyzer.Tests.Generator/ILLink.RoslynAnalyzer.Tests.TestCaseGenerator/BasicTests.g.csRegisters new Basic suite test methods for analyzer harness.

Comment on lines +6 to +7
class GenericParameters
{

CopilotAIMar 29, 2026

Copy link

Choose a reason for hiding this comment

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

Indentation uses tab characters on the class declaration; repo .editorconfig sets indent_style=space. Please replace tabs with spaces so formatting is consistent and tooling doesn't churn the file.

Suggested change
class GenericParameters
{
class GenericParameters
{

Copilot uses AI. Check for mistakes.
Comment on lines +7 to +12
class FieldRVA
{
[Kept]
[KeptInitializerData]
static int Main() => new byte[] { 1, 2, 3, 4, 5 }.Length;
}

CopilotAIMar 29, 2026

Copy link

Choose a reason for hiding this comment

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

Indentation uses tab characters for the type declaration/closing brace; repo .editorconfig sets indent_style=space. Please convert these tabs to spaces to match formatting conventions.

Suggested change
class FieldRVA
{
[Kept]
[KeptInitializerData]
staticintMain()=>newbyte[]{1,2,3,4,5}.Length;
}
class FieldRVA
{
[Kept]
[KeptInitializerData]
staticintMain()=>newbyte[]{1,2,3,4,5}.Length;
}

Copilot uses AI. Check for mistakes.
Comment on lines +1 to +7

using Mono.Linker.Tests.Cases.Expectations.Assertions;
using Mono.Linker.Tests.Cases.Expectations.Metadata;

namespace Mono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction ("link", "Dep")]

CopilotAIMar 29, 2026

Copy link

Choose a reason for hiding this comment

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

This file starts with an empty line and uses spacing like [SetupLinkerAction ("link", ...)] (space before the (). Most test cases in this tree avoid the leading blank line and use [SetupLinkerAction("link", ...)]; aligning to that style reduces diff churn.

Suggested change
usingMono.Linker.Tests.Cases.Expectations.Assertions;
usingMono.Linker.Tests.Cases.Expectations.Metadata;
namespaceMono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction("link","Dep")]
usingMono.Linker.Tests.Cases.Expectations.Assertions;
usingMono.Linker.Tests.Cases.Expectations.Metadata;
namespaceMono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction("link","Dep")]

Copilot uses AI. Check for mistakes.
Comment on lines +1 to +10

using Mono.Linker.Tests.Cases.Expectations.Assertions;
using Mono.Linker.Tests.Cases.Expectations.Metadata;

namespace Mono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction ("link", "ForwardedType")]
[SetupCompileBefore("Forwarder.dll", new[] { "Dependencies/ForwardedType.cs" })]

[SetupCompileAfter ("ForwardedType.dll", new[] { "Dependencies/ForwardedType.cs" })]

CopilotAIMar 29, 2026

Copy link

Choose a reason for hiding this comment

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

This file starts with an empty line and has inconsistent attribute invocation spacing (e.g., SetupLinkerAction (, SetupCompileAfter (). Most test cases here use no space before ( and no leading blank line; please normalize formatting to match the surrounding convention.

Suggested change
usingMono.Linker.Tests.Cases.Expectations.Assertions;
usingMono.Linker.Tests.Cases.Expectations.Metadata;
namespaceMono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction("link","ForwardedType")]
[SetupCompileBefore("Forwarder.dll",new[]{"Dependencies/ForwardedType.cs"})]
[SetupCompileAfter("ForwardedType.dll",new[]{"Dependencies/ForwardedType.cs"})]
usingMono.Linker.Tests.Cases.Expectations.Assertions;
usingMono.Linker.Tests.Cases.Expectations.Metadata;
namespaceMono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction("link","ForwardedType")]
[SetupCompileBefore("Forwarder.dll",new[]{"Dependencies/ForwardedType.cs"})]
[SetupCompileAfter("ForwardedType.dll",new[]{"Dependencies/ForwardedType.cs"})]

Copilot uses AI. Check for mistakes.

@sbomersbomer left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

No objection from me!

b.Method1();

// TODO: uncomment once we're okay with ToString bringing the whole world into closure
//((object)default(MyValueType)).ToString();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Should this be removed or uncommented?

agocke added a commit that referenced this pull request Apr 14, 2026
5 years ago we did a hackathon exploring illink written on top of the
ILCompiler.DependencyAnalysisFramework/managed type system and
System.Reflection.Metadata.
I let Claude:
* rebase the commits on top of main (required interventions by Claude
since things didn't merge cleanly)
* make things buildable again
* replace ILTrim.TypeSystem with ILCompiler.TypeSystem
* Get rid of most of ILTrim.Tests in favor of just taking
Mono.Linker.Tests as-is
* Extracting the tests into a separate pull request #126275
* Add some extra code to ILTrim.Tests to let us baseline failing tests
in a sidecar test file (feels better than adding Tools.ILTrim).
* 32% of test pass
* We had ~14000 lines unique to iltrim hackathon in the branch, now down
to ~7000.
I experimentally started prompting Claude to fix failing tests and have
a couple good result, but this is not part of that.
Submitting as a draft, I haven't really reviewed this myself either.
Cc @dotnet/illink
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

Running illink tests became much slower after the xunit migration, so let's not add unnecessary tests.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 27, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Tools-ILLink.NET linker development as well as trimming analyzerslinkable-frameworkIssues associated with delivering a linker friendly framework

Projects

None yet

Development

Successfully merging this pull request may close these issues.

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

Pull in tests from iltrim prototype - #126275

Closed
MichalStrehovsky wants to merge 1 commit into
dotnet:mainfrom
MichalStrehovsky:iltrim-new-tests
Closed

Pull in tests from iltrim prototype#126275
MichalStrehovsky wants to merge 1 commit into
dotnet:mainfrom
MichalStrehovsky:iltrim-new-tests

Conversation

@MichalStrehovsky

Copy link
Copy Markdown
Member

When we did the iltrim hackathon, we wrote some new tests. These are the tests from https://github.com/MichalStrehovsky/iltrim, moved to the illink tree.

Sending this out for considerations. We can say we don't want them and that would be fine too.

Cc @dotnet/illink

@MichalStrehovskyMichalStrehovsky added the area-Tools-ILLink .NET linker development as well as trimming analyzers label Mar 29, 2026
CopilotAI review requested due to automatic review settings March 29, 2026 12:42
@dotnet-policy-servicedotnet-policy-serviceBot added the linkable-framework Issues associated with delivering a linker friendly framework label Mar 29, 2026

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

Adds a set of new linker/analyzer test cases (ported from the iltrim prototype repo) into the illink test tree, and wires them into the Roslyn analyzer test-case generator output so they run as part of the existing suites.

Changes:

  • Added new Mono.Linker.Tests.Cases.Basic test cases covering signatures, control flow, resources, generics, virtual/interface scenarios, etc.
  • Added new Mono.Linker.Tests.Cases.MultiAssembly test cases (and dependencies) covering multi-assembly linking and type forwarding.
  • Updated/generated ILLink.RoslynAnalyzer.Tests suite mappings to include the new test cases.

Reviewed changes

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

Show a summary per file
FileDescription
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/TypeRefToAssembly.csAdds a multi-assembly typeref scope/keep assertion test.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/MultiAssembly.csAdds a multi-assembly member retention test for a dependency assembly.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/ForwarderReference.csAdds a type-forwarding scenario validating reference removal/retention across assemblies.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/Dependencies/TypeRefToAssembly_Library.csDependency type for TypeRefToAssembly test.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/Dependencies/Forwarder.csDependency assembly-level type forwarder attribute for forwarding scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/Dependencies/ForwardedType.csDefines forwarded type and members used in forwarder test.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/Dependencies/Dep.csDefines dependency members used by MultiAssembly test.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/VirtualMethods.csAdds virtual dispatch retention test.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/TypeSpecSignature.csAdds typespec/unsafe signature coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/TypeOf.csAdds basic typeof retention scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Switch.csAdds switch statement/expression coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Resources.csAdds embedded resource preservation coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/MultiDimArraySignature.csAdds multidimensional array signature coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/MethodSpecSignature.csAdds generic method instantiation signature coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/LibraryModeTest.csAdds test targeting library-mode linker behavior.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/InterfaceOrder.csAdds interface ordering metadata/retention coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/InterfaceCalls.csAdds interface call retention coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/InstanceFields.csAdds instance field/layout scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/GenericType.csAdds generic base type chain retention coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/GenericParameters.csAdds open generic parameter/type name scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/FunctionPointer.csAdds function-pointer signature coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/First.csAdds “first method”/entry-point style scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Finalizer.csAdds finalizer retention/removal behavior test.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/FieldsOfEnum.csAdds enum field retention/formatting coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/FieldSignature.csAdds field signature/type reference coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/FieldRVA.csAdds RVA/initializer data retention coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/ExceptionRegions.csAdds try/catch/filter/finally region coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Calli.csAdds calli emission scenario (with ILVerify skipped).
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Dependencies/Resources_EmbeddedResource.txtAdds embedded resource content used by Resources test.
src/tools/illink/test/ILLink.RoslynAnalyzer.Tests/generated/ILLink.RoslynAnalyzer.Tests.Generator/ILLink.RoslynAnalyzer.Tests.TestCaseGenerator/MultiAssemblyTests.g.csRegisters new MultiAssembly suite test methods for analyzer harness.
src/tools/illink/test/ILLink.RoslynAnalyzer.Tests/generated/ILLink.RoslynAnalyzer.Tests.Generator/ILLink.RoslynAnalyzer.Tests.TestCaseGenerator/BasicTests.g.csRegisters new Basic suite test methods for analyzer harness.

Comment on lines +6 to +7
class GenericParameters
{

CopilotAIMar 29, 2026

Copy link

Choose a reason for hiding this comment

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

Indentation uses tab characters on the class declaration; repo .editorconfig sets indent_style=space. Please replace tabs with spaces so formatting is consistent and tooling doesn't churn the file.

Suggested change
class GenericParameters
{
class GenericParameters
{

Copilot uses AI. Check for mistakes.
Comment on lines +7 to +12
class FieldRVA
{
[Kept]
[KeptInitializerData]
static int Main() => new byte[] { 1, 2, 3, 4, 5 }.Length;
}

CopilotAIMar 29, 2026

Copy link

Choose a reason for hiding this comment

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

Indentation uses tab characters for the type declaration/closing brace; repo .editorconfig sets indent_style=space. Please convert these tabs to spaces to match formatting conventions.

Suggested change
class FieldRVA
{
[Kept]
[KeptInitializerData]
staticintMain()=>newbyte[]{1,2,3,4,5}.Length;
}
class FieldRVA
{
[Kept]
[KeptInitializerData]
staticintMain()=>newbyte[]{1,2,3,4,5}.Length;
}

Copilot uses AI. Check for mistakes.
Comment on lines +1 to +7

using Mono.Linker.Tests.Cases.Expectations.Assertions;
using Mono.Linker.Tests.Cases.Expectations.Metadata;

namespace Mono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction ("link", "Dep")]

CopilotAIMar 29, 2026

Copy link

Choose a reason for hiding this comment

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

This file starts with an empty line and uses spacing like [SetupLinkerAction ("link", ...)] (space before the (). Most test cases in this tree avoid the leading blank line and use [SetupLinkerAction("link", ...)]; aligning to that style reduces diff churn.

Suggested change
usingMono.Linker.Tests.Cases.Expectations.Assertions;
usingMono.Linker.Tests.Cases.Expectations.Metadata;
namespaceMono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction("link","Dep")]
usingMono.Linker.Tests.Cases.Expectations.Assertions;
usingMono.Linker.Tests.Cases.Expectations.Metadata;
namespaceMono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction("link","Dep")]

Copilot uses AI. Check for mistakes.
Comment on lines +1 to +10

using Mono.Linker.Tests.Cases.Expectations.Assertions;
using Mono.Linker.Tests.Cases.Expectations.Metadata;

namespace Mono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction ("link", "ForwardedType")]
[SetupCompileBefore("Forwarder.dll", new[] { "Dependencies/ForwardedType.cs" })]

[SetupCompileAfter ("ForwardedType.dll", new[] { "Dependencies/ForwardedType.cs" })]

CopilotAIMar 29, 2026

Copy link

Choose a reason for hiding this comment

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

This file starts with an empty line and has inconsistent attribute invocation spacing (e.g., SetupLinkerAction (, SetupCompileAfter (). Most test cases here use no space before ( and no leading blank line; please normalize formatting to match the surrounding convention.

Suggested change
usingMono.Linker.Tests.Cases.Expectations.Assertions;
usingMono.Linker.Tests.Cases.Expectations.Metadata;
namespaceMono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction("link","ForwardedType")]
[SetupCompileBefore("Forwarder.dll",new[]{"Dependencies/ForwardedType.cs"})]
[SetupCompileAfter("ForwardedType.dll",new[]{"Dependencies/ForwardedType.cs"})]
usingMono.Linker.Tests.Cases.Expectations.Assertions;
usingMono.Linker.Tests.Cases.Expectations.Metadata;
namespaceMono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction("link","ForwardedType")]
[SetupCompileBefore("Forwarder.dll",new[]{"Dependencies/ForwardedType.cs"})]
[SetupCompileAfter("ForwardedType.dll",new[]{"Dependencies/ForwardedType.cs"})]

Copilot uses AI. Check for mistakes.

@sbomersbomer left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

No objection from me!

b.Method1();

// TODO: uncomment once we're okay with ToString bringing the whole world into closure
//((object)default(MyValueType)).ToString();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Should this be removed or uncommented?

agocke added a commit that referenced this pull request Apr 14, 2026
5 years ago we did a hackathon exploring illink written on top of the
ILCompiler.DependencyAnalysisFramework/managed type system and
System.Reflection.Metadata.
I let Claude:
* rebase the commits on top of main (required interventions by Claude
since things didn't merge cleanly)
* make things buildable again
* replace ILTrim.TypeSystem with ILCompiler.TypeSystem
* Get rid of most of ILTrim.Tests in favor of just taking
Mono.Linker.Tests as-is
* Extracting the tests into a separate pull request #126275
* Add some extra code to ILTrim.Tests to let us baseline failing tests
in a sidecar test file (feels better than adding Tools.ILTrim).
* 32% of test pass
* We had ~14000 lines unique to iltrim hackathon in the branch, now down
to ~7000.
I experimentally started prompting Claude to fix failing tests and have
a couple good result, but this is not part of that.
Submitting as a draft, I haven't really reviewed this myself either.
Cc @dotnet/illink
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

Running illink tests became much slower after the xunit migration, so let's not add unnecessary tests.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 27, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Tools-ILLink.NET linker development as well as trimming analyzerslinkable-frameworkIssues associated with delivering a linker friendly framework

Projects

None yet

Development

Successfully merging this pull request may close these issues.

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

Pull in tests from iltrim prototype - #126275

Closed
MichalStrehovsky wants to merge 1 commit into
dotnet:mainfrom
MichalStrehovsky:iltrim-new-tests
Closed

Pull in tests from iltrim prototype#126275
MichalStrehovsky wants to merge 1 commit into
dotnet:mainfrom
MichalStrehovsky:iltrim-new-tests

Conversation

@MichalStrehovsky

Copy link
Copy Markdown
Member

When we did the iltrim hackathon, we wrote some new tests. These are the tests from https://github.com/MichalStrehovsky/iltrim, moved to the illink tree.

Sending this out for considerations. We can say we don't want them and that would be fine too.

Cc @dotnet/illink

@MichalStrehovskyMichalStrehovsky added the area-Tools-ILLink .NET linker development as well as trimming analyzers label Mar 29, 2026
CopilotAI review requested due to automatic review settings March 29, 2026 12:42
@dotnet-policy-servicedotnet-policy-serviceBot added the linkable-framework Issues associated with delivering a linker friendly framework label Mar 29, 2026

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

Adds a set of new linker/analyzer test cases (ported from the iltrim prototype repo) into the illink test tree, and wires them into the Roslyn analyzer test-case generator output so they run as part of the existing suites.

Changes:

  • Added new Mono.Linker.Tests.Cases.Basic test cases covering signatures, control flow, resources, generics, virtual/interface scenarios, etc.
  • Added new Mono.Linker.Tests.Cases.MultiAssembly test cases (and dependencies) covering multi-assembly linking and type forwarding.
  • Updated/generated ILLink.RoslynAnalyzer.Tests suite mappings to include the new test cases.

Reviewed changes

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

Show a summary per file
FileDescription
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/TypeRefToAssembly.csAdds a multi-assembly typeref scope/keep assertion test.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/MultiAssembly.csAdds a multi-assembly member retention test for a dependency assembly.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/ForwarderReference.csAdds a type-forwarding scenario validating reference removal/retention across assemblies.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/Dependencies/TypeRefToAssembly_Library.csDependency type for TypeRefToAssembly test.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/Dependencies/Forwarder.csDependency assembly-level type forwarder attribute for forwarding scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/Dependencies/ForwardedType.csDefines forwarded type and members used in forwarder test.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/Dependencies/Dep.csDefines dependency members used by MultiAssembly test.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/VirtualMethods.csAdds virtual dispatch retention test.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/TypeSpecSignature.csAdds typespec/unsafe signature coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/TypeOf.csAdds basic typeof retention scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Switch.csAdds switch statement/expression coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Resources.csAdds embedded resource preservation coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/MultiDimArraySignature.csAdds multidimensional array signature coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/MethodSpecSignature.csAdds generic method instantiation signature coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/LibraryModeTest.csAdds test targeting library-mode linker behavior.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/InterfaceOrder.csAdds interface ordering metadata/retention coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/InterfaceCalls.csAdds interface call retention coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/InstanceFields.csAdds instance field/layout scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/GenericType.csAdds generic base type chain retention coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/GenericParameters.csAdds open generic parameter/type name scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/FunctionPointer.csAdds function-pointer signature coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/First.csAdds “first method”/entry-point style scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Finalizer.csAdds finalizer retention/removal behavior test.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/FieldsOfEnum.csAdds enum field retention/formatting coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/FieldSignature.csAdds field signature/type reference coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/FieldRVA.csAdds RVA/initializer data retention coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/ExceptionRegions.csAdds try/catch/filter/finally region coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Calli.csAdds calli emission scenario (with ILVerify skipped).
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Dependencies/Resources_EmbeddedResource.txtAdds embedded resource content used by Resources test.
src/tools/illink/test/ILLink.RoslynAnalyzer.Tests/generated/ILLink.RoslynAnalyzer.Tests.Generator/ILLink.RoslynAnalyzer.Tests.TestCaseGenerator/MultiAssemblyTests.g.csRegisters new MultiAssembly suite test methods for analyzer harness.
src/tools/illink/test/ILLink.RoslynAnalyzer.Tests/generated/ILLink.RoslynAnalyzer.Tests.Generator/ILLink.RoslynAnalyzer.Tests.TestCaseGenerator/BasicTests.g.csRegisters new Basic suite test methods for analyzer harness.

Comment on lines +6 to +7
class GenericParameters
{

CopilotAIMar 29, 2026

Copy link

Choose a reason for hiding this comment

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

Indentation uses tab characters on the class declaration; repo .editorconfig sets indent_style=space. Please replace tabs with spaces so formatting is consistent and tooling doesn't churn the file.

Suggested change
class GenericParameters
{
class GenericParameters
{

Copilot uses AI. Check for mistakes.
Comment on lines +7 to +12
class FieldRVA
{
[Kept]
[KeptInitializerData]
static int Main() => new byte[] { 1, 2, 3, 4, 5 }.Length;
}

CopilotAIMar 29, 2026

Copy link

Choose a reason for hiding this comment

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

Indentation uses tab characters for the type declaration/closing brace; repo .editorconfig sets indent_style=space. Please convert these tabs to spaces to match formatting conventions.

Suggested change
class FieldRVA
{
[Kept]
[KeptInitializerData]
staticintMain()=>newbyte[]{1,2,3,4,5}.Length;
}
class FieldRVA
{
[Kept]
[KeptInitializerData]
staticintMain()=>newbyte[]{1,2,3,4,5}.Length;
}

Copilot uses AI. Check for mistakes.
Comment on lines +1 to +7

using Mono.Linker.Tests.Cases.Expectations.Assertions;
using Mono.Linker.Tests.Cases.Expectations.Metadata;

namespace Mono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction ("link", "Dep")]

CopilotAIMar 29, 2026

Copy link

Choose a reason for hiding this comment

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

This file starts with an empty line and uses spacing like [SetupLinkerAction ("link", ...)] (space before the (). Most test cases in this tree avoid the leading blank line and use [SetupLinkerAction("link", ...)]; aligning to that style reduces diff churn.

Suggested change
usingMono.Linker.Tests.Cases.Expectations.Assertions;
usingMono.Linker.Tests.Cases.Expectations.Metadata;
namespaceMono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction("link","Dep")]
usingMono.Linker.Tests.Cases.Expectations.Assertions;
usingMono.Linker.Tests.Cases.Expectations.Metadata;
namespaceMono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction("link","Dep")]

Copilot uses AI. Check for mistakes.
Comment on lines +1 to +10

using Mono.Linker.Tests.Cases.Expectations.Assertions;
using Mono.Linker.Tests.Cases.Expectations.Metadata;

namespace Mono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction ("link", "ForwardedType")]
[SetupCompileBefore("Forwarder.dll", new[] { "Dependencies/ForwardedType.cs" })]

[SetupCompileAfter ("ForwardedType.dll", new[] { "Dependencies/ForwardedType.cs" })]

CopilotAIMar 29, 2026

Copy link

Choose a reason for hiding this comment

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

This file starts with an empty line and has inconsistent attribute invocation spacing (e.g., SetupLinkerAction (, SetupCompileAfter (). Most test cases here use no space before ( and no leading blank line; please normalize formatting to match the surrounding convention.

Suggested change
usingMono.Linker.Tests.Cases.Expectations.Assertions;
usingMono.Linker.Tests.Cases.Expectations.Metadata;
namespaceMono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction("link","ForwardedType")]
[SetupCompileBefore("Forwarder.dll",new[]{"Dependencies/ForwardedType.cs"})]
[SetupCompileAfter("ForwardedType.dll",new[]{"Dependencies/ForwardedType.cs"})]
usingMono.Linker.Tests.Cases.Expectations.Assertions;
usingMono.Linker.Tests.Cases.Expectations.Metadata;
namespaceMono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction("link","ForwardedType")]
[SetupCompileBefore("Forwarder.dll",new[]{"Dependencies/ForwardedType.cs"})]
[SetupCompileAfter("ForwardedType.dll",new[]{"Dependencies/ForwardedType.cs"})]

Copilot uses AI. Check for mistakes.

@sbomersbomer left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

No objection from me!

b.Method1();

// TODO: uncomment once we're okay with ToString bringing the whole world into closure
//((object)default(MyValueType)).ToString();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Should this be removed or uncommented?

agocke added a commit that referenced this pull request Apr 14, 2026
5 years ago we did a hackathon exploring illink written on top of the
ILCompiler.DependencyAnalysisFramework/managed type system and
System.Reflection.Metadata.
I let Claude:
* rebase the commits on top of main (required interventions by Claude
since things didn't merge cleanly)
* make things buildable again
* replace ILTrim.TypeSystem with ILCompiler.TypeSystem
* Get rid of most of ILTrim.Tests in favor of just taking
Mono.Linker.Tests as-is
* Extracting the tests into a separate pull request #126275
* Add some extra code to ILTrim.Tests to let us baseline failing tests
in a sidecar test file (feels better than adding Tools.ILTrim).
* 32% of test pass
* We had ~14000 lines unique to iltrim hackathon in the branch, now down
to ~7000.
I experimentally started prompting Claude to fix failing tests and have
a couple good result, but this is not part of that.
Submitting as a draft, I haven't really reviewed this myself either.
Cc @dotnet/illink
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

Running illink tests became much slower after the xunit migration, so let's not add unnecessary tests.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 27, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Tools-ILLink.NET linker development as well as trimming analyzerslinkable-frameworkIssues associated with delivering a linker friendly framework

Projects

None yet

Development

Successfully merging this pull request may close these issues.

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

Pull in tests from iltrim prototype - #126275

Closed
MichalStrehovsky wants to merge 1 commit into
dotnet:mainfrom
MichalStrehovsky:iltrim-new-tests
Closed

Pull in tests from iltrim prototype#126275
MichalStrehovsky wants to merge 1 commit into
dotnet:mainfrom
MichalStrehovsky:iltrim-new-tests

Conversation

@MichalStrehovsky

Copy link
Copy Markdown
Member

When we did the iltrim hackathon, we wrote some new tests. These are the tests from https://github.com/MichalStrehovsky/iltrim, moved to the illink tree.

Sending this out for considerations. We can say we don't want them and that would be fine too.

Cc @dotnet/illink

@MichalStrehovskyMichalStrehovsky added the area-Tools-ILLink .NET linker development as well as trimming analyzers label Mar 29, 2026
CopilotAI review requested due to automatic review settings March 29, 2026 12:42
@dotnet-policy-servicedotnet-policy-serviceBot added the linkable-framework Issues associated with delivering a linker friendly framework label Mar 29, 2026

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

Adds a set of new linker/analyzer test cases (ported from the iltrim prototype repo) into the illink test tree, and wires them into the Roslyn analyzer test-case generator output so they run as part of the existing suites.

Changes:

  • Added new Mono.Linker.Tests.Cases.Basic test cases covering signatures, control flow, resources, generics, virtual/interface scenarios, etc.
  • Added new Mono.Linker.Tests.Cases.MultiAssembly test cases (and dependencies) covering multi-assembly linking and type forwarding.
  • Updated/generated ILLink.RoslynAnalyzer.Tests suite mappings to include the new test cases.

Reviewed changes

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

Show a summary per file
FileDescription
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/TypeRefToAssembly.csAdds a multi-assembly typeref scope/keep assertion test.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/MultiAssembly.csAdds a multi-assembly member retention test for a dependency assembly.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/ForwarderReference.csAdds a type-forwarding scenario validating reference removal/retention across assemblies.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/Dependencies/TypeRefToAssembly_Library.csDependency type for TypeRefToAssembly test.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/Dependencies/Forwarder.csDependency assembly-level type forwarder attribute for forwarding scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/Dependencies/ForwardedType.csDefines forwarded type and members used in forwarder test.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/Dependencies/Dep.csDefines dependency members used by MultiAssembly test.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/VirtualMethods.csAdds virtual dispatch retention test.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/TypeSpecSignature.csAdds typespec/unsafe signature coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/TypeOf.csAdds basic typeof retention scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Switch.csAdds switch statement/expression coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Resources.csAdds embedded resource preservation coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/MultiDimArraySignature.csAdds multidimensional array signature coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/MethodSpecSignature.csAdds generic method instantiation signature coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/LibraryModeTest.csAdds test targeting library-mode linker behavior.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/InterfaceOrder.csAdds interface ordering metadata/retention coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/InterfaceCalls.csAdds interface call retention coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/InstanceFields.csAdds instance field/layout scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/GenericType.csAdds generic base type chain retention coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/GenericParameters.csAdds open generic parameter/type name scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/FunctionPointer.csAdds function-pointer signature coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/First.csAdds “first method”/entry-point style scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Finalizer.csAdds finalizer retention/removal behavior test.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/FieldsOfEnum.csAdds enum field retention/formatting coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/FieldSignature.csAdds field signature/type reference coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/FieldRVA.csAdds RVA/initializer data retention coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/ExceptionRegions.csAdds try/catch/filter/finally region coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Calli.csAdds calli emission scenario (with ILVerify skipped).
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Dependencies/Resources_EmbeddedResource.txtAdds embedded resource content used by Resources test.
src/tools/illink/test/ILLink.RoslynAnalyzer.Tests/generated/ILLink.RoslynAnalyzer.Tests.Generator/ILLink.RoslynAnalyzer.Tests.TestCaseGenerator/MultiAssemblyTests.g.csRegisters new MultiAssembly suite test methods for analyzer harness.
src/tools/illink/test/ILLink.RoslynAnalyzer.Tests/generated/ILLink.RoslynAnalyzer.Tests.Generator/ILLink.RoslynAnalyzer.Tests.TestCaseGenerator/BasicTests.g.csRegisters new Basic suite test methods for analyzer harness.

Comment on lines +6 to +7
class GenericParameters
{

CopilotAIMar 29, 2026

Copy link

Choose a reason for hiding this comment

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

Indentation uses tab characters on the class declaration; repo .editorconfig sets indent_style=space. Please replace tabs with spaces so formatting is consistent and tooling doesn't churn the file.

Suggested change
class GenericParameters
{
class GenericParameters
{

Copilot uses AI. Check for mistakes.
Comment on lines +7 to +12
class FieldRVA
{
[Kept]
[KeptInitializerData]
static int Main() => new byte[] { 1, 2, 3, 4, 5 }.Length;
}

CopilotAIMar 29, 2026

Copy link

Choose a reason for hiding this comment

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

Indentation uses tab characters for the type declaration/closing brace; repo .editorconfig sets indent_style=space. Please convert these tabs to spaces to match formatting conventions.

Suggested change
class FieldRVA
{
[Kept]
[KeptInitializerData]
staticintMain()=>newbyte[]{1,2,3,4,5}.Length;
}
class FieldRVA
{
[Kept]
[KeptInitializerData]
staticintMain()=>newbyte[]{1,2,3,4,5}.Length;
}

Copilot uses AI. Check for mistakes.
Comment on lines +1 to +7

using Mono.Linker.Tests.Cases.Expectations.Assertions;
using Mono.Linker.Tests.Cases.Expectations.Metadata;

namespace Mono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction ("link", "Dep")]

CopilotAIMar 29, 2026

Copy link

Choose a reason for hiding this comment

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

This file starts with an empty line and uses spacing like [SetupLinkerAction ("link", ...)] (space before the (). Most test cases in this tree avoid the leading blank line and use [SetupLinkerAction("link", ...)]; aligning to that style reduces diff churn.

Suggested change
usingMono.Linker.Tests.Cases.Expectations.Assertions;
usingMono.Linker.Tests.Cases.Expectations.Metadata;
namespaceMono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction("link","Dep")]
usingMono.Linker.Tests.Cases.Expectations.Assertions;
usingMono.Linker.Tests.Cases.Expectations.Metadata;
namespaceMono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction("link","Dep")]

Copilot uses AI. Check for mistakes.
Comment on lines +1 to +10

using Mono.Linker.Tests.Cases.Expectations.Assertions;
using Mono.Linker.Tests.Cases.Expectations.Metadata;

namespace Mono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction ("link", "ForwardedType")]
[SetupCompileBefore("Forwarder.dll", new[] { "Dependencies/ForwardedType.cs" })]

[SetupCompileAfter ("ForwardedType.dll", new[] { "Dependencies/ForwardedType.cs" })]

CopilotAIMar 29, 2026

Copy link

Choose a reason for hiding this comment

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

This file starts with an empty line and has inconsistent attribute invocation spacing (e.g., SetupLinkerAction (, SetupCompileAfter (). Most test cases here use no space before ( and no leading blank line; please normalize formatting to match the surrounding convention.

Suggested change
usingMono.Linker.Tests.Cases.Expectations.Assertions;
usingMono.Linker.Tests.Cases.Expectations.Metadata;
namespaceMono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction("link","ForwardedType")]
[SetupCompileBefore("Forwarder.dll",new[]{"Dependencies/ForwardedType.cs"})]
[SetupCompileAfter("ForwardedType.dll",new[]{"Dependencies/ForwardedType.cs"})]
usingMono.Linker.Tests.Cases.Expectations.Assertions;
usingMono.Linker.Tests.Cases.Expectations.Metadata;
namespaceMono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction("link","ForwardedType")]
[SetupCompileBefore("Forwarder.dll",new[]{"Dependencies/ForwardedType.cs"})]
[SetupCompileAfter("ForwardedType.dll",new[]{"Dependencies/ForwardedType.cs"})]

Copilot uses AI. Check for mistakes.

@sbomersbomer left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

No objection from me!

b.Method1();

// TODO: uncomment once we're okay with ToString bringing the whole world into closure
//((object)default(MyValueType)).ToString();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Should this be removed or uncommented?

agocke added a commit that referenced this pull request Apr 14, 2026
5 years ago we did a hackathon exploring illink written on top of the
ILCompiler.DependencyAnalysisFramework/managed type system and
System.Reflection.Metadata.
I let Claude:
* rebase the commits on top of main (required interventions by Claude
since things didn't merge cleanly)
* make things buildable again
* replace ILTrim.TypeSystem with ILCompiler.TypeSystem
* Get rid of most of ILTrim.Tests in favor of just taking
Mono.Linker.Tests as-is
* Extracting the tests into a separate pull request #126275
* Add some extra code to ILTrim.Tests to let us baseline failing tests
in a sidecar test file (feels better than adding Tools.ILTrim).
* 32% of test pass
* We had ~14000 lines unique to iltrim hackathon in the branch, now down
to ~7000.
I experimentally started prompting Claude to fix failing tests and have
a couple good result, but this is not part of that.
Submitting as a draft, I haven't really reviewed this myself either.
Cc @dotnet/illink
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

Running illink tests became much slower after the xunit migration, so let's not add unnecessary tests.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 27, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Tools-ILLink.NET linker development as well as trimming analyzerslinkable-frameworkIssues associated with delivering a linker friendly framework

Projects

None yet

Development

Successfully merging this pull request may close these issues.

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

Pull in tests from iltrim prototype - #126275

Closed
MichalStrehovsky wants to merge 1 commit into
dotnet:mainfrom
MichalStrehovsky:iltrim-new-tests
Closed

Pull in tests from iltrim prototype#126275
MichalStrehovsky wants to merge 1 commit into
dotnet:mainfrom
MichalStrehovsky:iltrim-new-tests

Conversation

@MichalStrehovsky

Copy link
Copy Markdown
Member

When we did the iltrim hackathon, we wrote some new tests. These are the tests from https://github.com/MichalStrehovsky/iltrim, moved to the illink tree.

Sending this out for considerations. We can say we don't want them and that would be fine too.

Cc @dotnet/illink

@MichalStrehovskyMichalStrehovsky added the area-Tools-ILLink .NET linker development as well as trimming analyzers label Mar 29, 2026
CopilotAI review requested due to automatic review settings March 29, 2026 12:42
@dotnet-policy-servicedotnet-policy-serviceBot added the linkable-framework Issues associated with delivering a linker friendly framework label Mar 29, 2026

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

Adds a set of new linker/analyzer test cases (ported from the iltrim prototype repo) into the illink test tree, and wires them into the Roslyn analyzer test-case generator output so they run as part of the existing suites.

Changes:

  • Added new Mono.Linker.Tests.Cases.Basic test cases covering signatures, control flow, resources, generics, virtual/interface scenarios, etc.
  • Added new Mono.Linker.Tests.Cases.MultiAssembly test cases (and dependencies) covering multi-assembly linking and type forwarding.
  • Updated/generated ILLink.RoslynAnalyzer.Tests suite mappings to include the new test cases.

Reviewed changes

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

Show a summary per file
FileDescription
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/TypeRefToAssembly.csAdds a multi-assembly typeref scope/keep assertion test.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/MultiAssembly.csAdds a multi-assembly member retention test for a dependency assembly.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/ForwarderReference.csAdds a type-forwarding scenario validating reference removal/retention across assemblies.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/Dependencies/TypeRefToAssembly_Library.csDependency type for TypeRefToAssembly test.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/Dependencies/Forwarder.csDependency assembly-level type forwarder attribute for forwarding scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/Dependencies/ForwardedType.csDefines forwarded type and members used in forwarder test.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/Dependencies/Dep.csDefines dependency members used by MultiAssembly test.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/VirtualMethods.csAdds virtual dispatch retention test.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/TypeSpecSignature.csAdds typespec/unsafe signature coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/TypeOf.csAdds basic typeof retention scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Switch.csAdds switch statement/expression coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Resources.csAdds embedded resource preservation coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/MultiDimArraySignature.csAdds multidimensional array signature coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/MethodSpecSignature.csAdds generic method instantiation signature coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/LibraryModeTest.csAdds test targeting library-mode linker behavior.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/InterfaceOrder.csAdds interface ordering metadata/retention coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/InterfaceCalls.csAdds interface call retention coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/InstanceFields.csAdds instance field/layout scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/GenericType.csAdds generic base type chain retention coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/GenericParameters.csAdds open generic parameter/type name scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/FunctionPointer.csAdds function-pointer signature coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/First.csAdds “first method”/entry-point style scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Finalizer.csAdds finalizer retention/removal behavior test.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/FieldsOfEnum.csAdds enum field retention/formatting coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/FieldSignature.csAdds field signature/type reference coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/FieldRVA.csAdds RVA/initializer data retention coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/ExceptionRegions.csAdds try/catch/filter/finally region coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Calli.csAdds calli emission scenario (with ILVerify skipped).
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Dependencies/Resources_EmbeddedResource.txtAdds embedded resource content used by Resources test.
src/tools/illink/test/ILLink.RoslynAnalyzer.Tests/generated/ILLink.RoslynAnalyzer.Tests.Generator/ILLink.RoslynAnalyzer.Tests.TestCaseGenerator/MultiAssemblyTests.g.csRegisters new MultiAssembly suite test methods for analyzer harness.
src/tools/illink/test/ILLink.RoslynAnalyzer.Tests/generated/ILLink.RoslynAnalyzer.Tests.Generator/ILLink.RoslynAnalyzer.Tests.TestCaseGenerator/BasicTests.g.csRegisters new Basic suite test methods for analyzer harness.

Comment on lines +6 to +7
class GenericParameters
{

CopilotAIMar 29, 2026

Copy link

Choose a reason for hiding this comment

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

Indentation uses tab characters on the class declaration; repo .editorconfig sets indent_style=space. Please replace tabs with spaces so formatting is consistent and tooling doesn't churn the file.

Suggested change
class GenericParameters
{
class GenericParameters
{

Copilot uses AI. Check for mistakes.
Comment on lines +7 to +12
class FieldRVA
{
[Kept]
[KeptInitializerData]
static int Main() => new byte[] { 1, 2, 3, 4, 5 }.Length;
}

CopilotAIMar 29, 2026

Copy link

Choose a reason for hiding this comment

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

Indentation uses tab characters for the type declaration/closing brace; repo .editorconfig sets indent_style=space. Please convert these tabs to spaces to match formatting conventions.

Suggested change
class FieldRVA
{
[Kept]
[KeptInitializerData]
staticintMain()=>newbyte[]{1,2,3,4,5}.Length;
}
class FieldRVA
{
[Kept]
[KeptInitializerData]
staticintMain()=>newbyte[]{1,2,3,4,5}.Length;
}

Copilot uses AI. Check for mistakes.
Comment on lines +1 to +7

using Mono.Linker.Tests.Cases.Expectations.Assertions;
using Mono.Linker.Tests.Cases.Expectations.Metadata;

namespace Mono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction ("link", "Dep")]

CopilotAIMar 29, 2026

Copy link

Choose a reason for hiding this comment

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

This file starts with an empty line and uses spacing like [SetupLinkerAction ("link", ...)] (space before the (). Most test cases in this tree avoid the leading blank line and use [SetupLinkerAction("link", ...)]; aligning to that style reduces diff churn.

Suggested change
usingMono.Linker.Tests.Cases.Expectations.Assertions;
usingMono.Linker.Tests.Cases.Expectations.Metadata;
namespaceMono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction("link","Dep")]
usingMono.Linker.Tests.Cases.Expectations.Assertions;
usingMono.Linker.Tests.Cases.Expectations.Metadata;
namespaceMono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction("link","Dep")]

Copilot uses AI. Check for mistakes.
Comment on lines +1 to +10

using Mono.Linker.Tests.Cases.Expectations.Assertions;
using Mono.Linker.Tests.Cases.Expectations.Metadata;

namespace Mono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction ("link", "ForwardedType")]
[SetupCompileBefore("Forwarder.dll", new[] { "Dependencies/ForwardedType.cs" })]

[SetupCompileAfter ("ForwardedType.dll", new[] { "Dependencies/ForwardedType.cs" })]

CopilotAIMar 29, 2026

Copy link

Choose a reason for hiding this comment

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

This file starts with an empty line and has inconsistent attribute invocation spacing (e.g., SetupLinkerAction (, SetupCompileAfter (). Most test cases here use no space before ( and no leading blank line; please normalize formatting to match the surrounding convention.

Suggested change
usingMono.Linker.Tests.Cases.Expectations.Assertions;
usingMono.Linker.Tests.Cases.Expectations.Metadata;
namespaceMono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction("link","ForwardedType")]
[SetupCompileBefore("Forwarder.dll",new[]{"Dependencies/ForwardedType.cs"})]
[SetupCompileAfter("ForwardedType.dll",new[]{"Dependencies/ForwardedType.cs"})]
usingMono.Linker.Tests.Cases.Expectations.Assertions;
usingMono.Linker.Tests.Cases.Expectations.Metadata;
namespaceMono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction("link","ForwardedType")]
[SetupCompileBefore("Forwarder.dll",new[]{"Dependencies/ForwardedType.cs"})]
[SetupCompileAfter("ForwardedType.dll",new[]{"Dependencies/ForwardedType.cs"})]

Copilot uses AI. Check for mistakes.

@sbomersbomer left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

No objection from me!

b.Method1();

// TODO: uncomment once we're okay with ToString bringing the whole world into closure
//((object)default(MyValueType)).ToString();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Should this be removed or uncommented?

agocke added a commit that referenced this pull request Apr 14, 2026
5 years ago we did a hackathon exploring illink written on top of the
ILCompiler.DependencyAnalysisFramework/managed type system and
System.Reflection.Metadata.
I let Claude:
* rebase the commits on top of main (required interventions by Claude
since things didn't merge cleanly)
* make things buildable again
* replace ILTrim.TypeSystem with ILCompiler.TypeSystem
* Get rid of most of ILTrim.Tests in favor of just taking
Mono.Linker.Tests as-is
* Extracting the tests into a separate pull request #126275
* Add some extra code to ILTrim.Tests to let us baseline failing tests
in a sidecar test file (feels better than adding Tools.ILTrim).
* 32% of test pass
* We had ~14000 lines unique to iltrim hackathon in the branch, now down
to ~7000.
I experimentally started prompting Claude to fix failing tests and have
a couple good result, but this is not part of that.
Submitting as a draft, I haven't really reviewed this myself either.
Cc @dotnet/illink
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

Running illink tests became much slower after the xunit migration, so let's not add unnecessary tests.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 27, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Tools-ILLink.NET linker development as well as trimming analyzerslinkable-frameworkIssues associated with delivering a linker friendly framework

Projects

None yet

Development

Successfully merging this pull request may close these issues.

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

Pull in tests from iltrim prototype - #126275

Closed
MichalStrehovsky wants to merge 1 commit into
dotnet:mainfrom
MichalStrehovsky:iltrim-new-tests
Closed

Pull in tests from iltrim prototype#126275
MichalStrehovsky wants to merge 1 commit into
dotnet:mainfrom
MichalStrehovsky:iltrim-new-tests

Conversation

@MichalStrehovsky

Copy link
Copy Markdown
Member

When we did the iltrim hackathon, we wrote some new tests. These are the tests from https://github.com/MichalStrehovsky/iltrim, moved to the illink tree.

Sending this out for considerations. We can say we don't want them and that would be fine too.

Cc @dotnet/illink

@MichalStrehovskyMichalStrehovsky added the area-Tools-ILLink .NET linker development as well as trimming analyzers label Mar 29, 2026
CopilotAI review requested due to automatic review settings March 29, 2026 12:42
@dotnet-policy-servicedotnet-policy-serviceBot added the linkable-framework Issues associated with delivering a linker friendly framework label Mar 29, 2026

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

Adds a set of new linker/analyzer test cases (ported from the iltrim prototype repo) into the illink test tree, and wires them into the Roslyn analyzer test-case generator output so they run as part of the existing suites.

Changes:

  • Added new Mono.Linker.Tests.Cases.Basic test cases covering signatures, control flow, resources, generics, virtual/interface scenarios, etc.
  • Added new Mono.Linker.Tests.Cases.MultiAssembly test cases (and dependencies) covering multi-assembly linking and type forwarding.
  • Updated/generated ILLink.RoslynAnalyzer.Tests suite mappings to include the new test cases.

Reviewed changes

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

Show a summary per file
FileDescription
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/TypeRefToAssembly.csAdds a multi-assembly typeref scope/keep assertion test.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/MultiAssembly.csAdds a multi-assembly member retention test for a dependency assembly.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/ForwarderReference.csAdds a type-forwarding scenario validating reference removal/retention across assemblies.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/Dependencies/TypeRefToAssembly_Library.csDependency type for TypeRefToAssembly test.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/Dependencies/Forwarder.csDependency assembly-level type forwarder attribute for forwarding scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/Dependencies/ForwardedType.csDefines forwarded type and members used in forwarder test.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/Dependencies/Dep.csDefines dependency members used by MultiAssembly test.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/VirtualMethods.csAdds virtual dispatch retention test.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/TypeSpecSignature.csAdds typespec/unsafe signature coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/TypeOf.csAdds basic typeof retention scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Switch.csAdds switch statement/expression coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Resources.csAdds embedded resource preservation coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/MultiDimArraySignature.csAdds multidimensional array signature coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/MethodSpecSignature.csAdds generic method instantiation signature coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/LibraryModeTest.csAdds test targeting library-mode linker behavior.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/InterfaceOrder.csAdds interface ordering metadata/retention coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/InterfaceCalls.csAdds interface call retention coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/InstanceFields.csAdds instance field/layout scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/GenericType.csAdds generic base type chain retention coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/GenericParameters.csAdds open generic parameter/type name scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/FunctionPointer.csAdds function-pointer signature coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/First.csAdds “first method”/entry-point style scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Finalizer.csAdds finalizer retention/removal behavior test.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/FieldsOfEnum.csAdds enum field retention/formatting coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/FieldSignature.csAdds field signature/type reference coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/FieldRVA.csAdds RVA/initializer data retention coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/ExceptionRegions.csAdds try/catch/filter/finally region coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Calli.csAdds calli emission scenario (with ILVerify skipped).
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Dependencies/Resources_EmbeddedResource.txtAdds embedded resource content used by Resources test.
src/tools/illink/test/ILLink.RoslynAnalyzer.Tests/generated/ILLink.RoslynAnalyzer.Tests.Generator/ILLink.RoslynAnalyzer.Tests.TestCaseGenerator/MultiAssemblyTests.g.csRegisters new MultiAssembly suite test methods for analyzer harness.
src/tools/illink/test/ILLink.RoslynAnalyzer.Tests/generated/ILLink.RoslynAnalyzer.Tests.Generator/ILLink.RoslynAnalyzer.Tests.TestCaseGenerator/BasicTests.g.csRegisters new Basic suite test methods for analyzer harness.

Comment on lines +6 to +7
class GenericParameters
{

CopilotAIMar 29, 2026

Copy link

Choose a reason for hiding this comment

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

Indentation uses tab characters on the class declaration; repo .editorconfig sets indent_style=space. Please replace tabs with spaces so formatting is consistent and tooling doesn't churn the file.

Suggested change
class GenericParameters
{
class GenericParameters
{

Copilot uses AI. Check for mistakes.
Comment on lines +7 to +12
class FieldRVA
{
[Kept]
[KeptInitializerData]
static int Main() => new byte[] { 1, 2, 3, 4, 5 }.Length;
}

CopilotAIMar 29, 2026

Copy link

Choose a reason for hiding this comment

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

Indentation uses tab characters for the type declaration/closing brace; repo .editorconfig sets indent_style=space. Please convert these tabs to spaces to match formatting conventions.

Suggested change
class FieldRVA
{
[Kept]
[KeptInitializerData]
staticintMain()=>newbyte[]{1,2,3,4,5}.Length;
}
class FieldRVA
{
[Kept]
[KeptInitializerData]
staticintMain()=>newbyte[]{1,2,3,4,5}.Length;
}

Copilot uses AI. Check for mistakes.
Comment on lines +1 to +7

using Mono.Linker.Tests.Cases.Expectations.Assertions;
using Mono.Linker.Tests.Cases.Expectations.Metadata;

namespace Mono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction ("link", "Dep")]

CopilotAIMar 29, 2026

Copy link

Choose a reason for hiding this comment

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

This file starts with an empty line and uses spacing like [SetupLinkerAction ("link", ...)] (space before the (). Most test cases in this tree avoid the leading blank line and use [SetupLinkerAction("link", ...)]; aligning to that style reduces diff churn.

Suggested change
usingMono.Linker.Tests.Cases.Expectations.Assertions;
usingMono.Linker.Tests.Cases.Expectations.Metadata;
namespaceMono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction("link","Dep")]
usingMono.Linker.Tests.Cases.Expectations.Assertions;
usingMono.Linker.Tests.Cases.Expectations.Metadata;
namespaceMono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction("link","Dep")]

Copilot uses AI. Check for mistakes.
Comment on lines +1 to +10

using Mono.Linker.Tests.Cases.Expectations.Assertions;
using Mono.Linker.Tests.Cases.Expectations.Metadata;

namespace Mono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction ("link", "ForwardedType")]
[SetupCompileBefore("Forwarder.dll", new[] { "Dependencies/ForwardedType.cs" })]

[SetupCompileAfter ("ForwardedType.dll", new[] { "Dependencies/ForwardedType.cs" })]

CopilotAIMar 29, 2026

Copy link

Choose a reason for hiding this comment

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

This file starts with an empty line and has inconsistent attribute invocation spacing (e.g., SetupLinkerAction (, SetupCompileAfter (). Most test cases here use no space before ( and no leading blank line; please normalize formatting to match the surrounding convention.

Suggested change
usingMono.Linker.Tests.Cases.Expectations.Assertions;
usingMono.Linker.Tests.Cases.Expectations.Metadata;
namespaceMono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction("link","ForwardedType")]
[SetupCompileBefore("Forwarder.dll",new[]{"Dependencies/ForwardedType.cs"})]
[SetupCompileAfter("ForwardedType.dll",new[]{"Dependencies/ForwardedType.cs"})]
usingMono.Linker.Tests.Cases.Expectations.Assertions;
usingMono.Linker.Tests.Cases.Expectations.Metadata;
namespaceMono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction("link","ForwardedType")]
[SetupCompileBefore("Forwarder.dll",new[]{"Dependencies/ForwardedType.cs"})]
[SetupCompileAfter("ForwardedType.dll",new[]{"Dependencies/ForwardedType.cs"})]

Copilot uses AI. Check for mistakes.

@sbomersbomer left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

No objection from me!

b.Method1();

// TODO: uncomment once we're okay with ToString bringing the whole world into closure
//((object)default(MyValueType)).ToString();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Should this be removed or uncommented?

agocke added a commit that referenced this pull request Apr 14, 2026
5 years ago we did a hackathon exploring illink written on top of the
ILCompiler.DependencyAnalysisFramework/managed type system and
System.Reflection.Metadata.
I let Claude:
* rebase the commits on top of main (required interventions by Claude
since things didn't merge cleanly)
* make things buildable again
* replace ILTrim.TypeSystem with ILCompiler.TypeSystem
* Get rid of most of ILTrim.Tests in favor of just taking
Mono.Linker.Tests as-is
* Extracting the tests into a separate pull request #126275
* Add some extra code to ILTrim.Tests to let us baseline failing tests
in a sidecar test file (feels better than adding Tools.ILTrim).
* 32% of test pass
* We had ~14000 lines unique to iltrim hackathon in the branch, now down
to ~7000.
I experimentally started prompting Claude to fix failing tests and have
a couple good result, but this is not part of that.
Submitting as a draft, I haven't really reviewed this myself either.
Cc @dotnet/illink
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

Running illink tests became much slower after the xunit migration, so let's not add unnecessary tests.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 27, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Tools-ILLink.NET linker development as well as trimming analyzerslinkable-frameworkIssues associated with delivering a linker friendly framework

Projects

None yet

Development

Successfully merging this pull request may close these issues.

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

Pull in tests from iltrim prototype - #126275

Closed
MichalStrehovsky wants to merge 1 commit into
dotnet:mainfrom
MichalStrehovsky:iltrim-new-tests
Closed

Pull in tests from iltrim prototype#126275
MichalStrehovsky wants to merge 1 commit into
dotnet:mainfrom
MichalStrehovsky:iltrim-new-tests

Conversation

@MichalStrehovsky

Copy link
Copy Markdown
Member

When we did the iltrim hackathon, we wrote some new tests. These are the tests from https://github.com/MichalStrehovsky/iltrim, moved to the illink tree.

Sending this out for considerations. We can say we don't want them and that would be fine too.

Cc @dotnet/illink

@MichalStrehovskyMichalStrehovsky added the area-Tools-ILLink .NET linker development as well as trimming analyzers label Mar 29, 2026
CopilotAI review requested due to automatic review settings March 29, 2026 12:42
@dotnet-policy-servicedotnet-policy-serviceBot added the linkable-framework Issues associated with delivering a linker friendly framework label Mar 29, 2026

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

Adds a set of new linker/analyzer test cases (ported from the iltrim prototype repo) into the illink test tree, and wires them into the Roslyn analyzer test-case generator output so they run as part of the existing suites.

Changes:

  • Added new Mono.Linker.Tests.Cases.Basic test cases covering signatures, control flow, resources, generics, virtual/interface scenarios, etc.
  • Added new Mono.Linker.Tests.Cases.MultiAssembly test cases (and dependencies) covering multi-assembly linking and type forwarding.
  • Updated/generated ILLink.RoslynAnalyzer.Tests suite mappings to include the new test cases.

Reviewed changes

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

Show a summary per file
FileDescription
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/TypeRefToAssembly.csAdds a multi-assembly typeref scope/keep assertion test.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/MultiAssembly.csAdds a multi-assembly member retention test for a dependency assembly.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/ForwarderReference.csAdds a type-forwarding scenario validating reference removal/retention across assemblies.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/Dependencies/TypeRefToAssembly_Library.csDependency type for TypeRefToAssembly test.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/Dependencies/Forwarder.csDependency assembly-level type forwarder attribute for forwarding scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/Dependencies/ForwardedType.csDefines forwarded type and members used in forwarder test.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/Dependencies/Dep.csDefines dependency members used by MultiAssembly test.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/VirtualMethods.csAdds virtual dispatch retention test.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/TypeSpecSignature.csAdds typespec/unsafe signature coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/TypeOf.csAdds basic typeof retention scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Switch.csAdds switch statement/expression coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Resources.csAdds embedded resource preservation coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/MultiDimArraySignature.csAdds multidimensional array signature coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/MethodSpecSignature.csAdds generic method instantiation signature coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/LibraryModeTest.csAdds test targeting library-mode linker behavior.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/InterfaceOrder.csAdds interface ordering metadata/retention coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/InterfaceCalls.csAdds interface call retention coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/InstanceFields.csAdds instance field/layout scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/GenericType.csAdds generic base type chain retention coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/GenericParameters.csAdds open generic parameter/type name scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/FunctionPointer.csAdds function-pointer signature coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/First.csAdds “first method”/entry-point style scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Finalizer.csAdds finalizer retention/removal behavior test.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/FieldsOfEnum.csAdds enum field retention/formatting coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/FieldSignature.csAdds field signature/type reference coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/FieldRVA.csAdds RVA/initializer data retention coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/ExceptionRegions.csAdds try/catch/filter/finally region coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Calli.csAdds calli emission scenario (with ILVerify skipped).
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Dependencies/Resources_EmbeddedResource.txtAdds embedded resource content used by Resources test.
src/tools/illink/test/ILLink.RoslynAnalyzer.Tests/generated/ILLink.RoslynAnalyzer.Tests.Generator/ILLink.RoslynAnalyzer.Tests.TestCaseGenerator/MultiAssemblyTests.g.csRegisters new MultiAssembly suite test methods for analyzer harness.
src/tools/illink/test/ILLink.RoslynAnalyzer.Tests/generated/ILLink.RoslynAnalyzer.Tests.Generator/ILLink.RoslynAnalyzer.Tests.TestCaseGenerator/BasicTests.g.csRegisters new Basic suite test methods for analyzer harness.

Comment on lines +6 to +7
class GenericParameters
{

CopilotAIMar 29, 2026

Copy link

Choose a reason for hiding this comment

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

Indentation uses tab characters on the class declaration; repo .editorconfig sets indent_style=space. Please replace tabs with spaces so formatting is consistent and tooling doesn't churn the file.

Suggested change
class GenericParameters
{
class GenericParameters
{

Copilot uses AI. Check for mistakes.
Comment on lines +7 to +12
class FieldRVA
{
[Kept]
[KeptInitializerData]
static int Main() => new byte[] { 1, 2, 3, 4, 5 }.Length;
}

CopilotAIMar 29, 2026

Copy link

Choose a reason for hiding this comment

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

Indentation uses tab characters for the type declaration/closing brace; repo .editorconfig sets indent_style=space. Please convert these tabs to spaces to match formatting conventions.

Suggested change
class FieldRVA
{
[Kept]
[KeptInitializerData]
staticintMain()=>newbyte[]{1,2,3,4,5}.Length;
}
class FieldRVA
{
[Kept]
[KeptInitializerData]
staticintMain()=>newbyte[]{1,2,3,4,5}.Length;
}

Copilot uses AI. Check for mistakes.
Comment on lines +1 to +7

using Mono.Linker.Tests.Cases.Expectations.Assertions;
using Mono.Linker.Tests.Cases.Expectations.Metadata;

namespace Mono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction ("link", "Dep")]

CopilotAIMar 29, 2026

Copy link

Choose a reason for hiding this comment

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

This file starts with an empty line and uses spacing like [SetupLinkerAction ("link", ...)] (space before the (). Most test cases in this tree avoid the leading blank line and use [SetupLinkerAction("link", ...)]; aligning to that style reduces diff churn.

Suggested change
usingMono.Linker.Tests.Cases.Expectations.Assertions;
usingMono.Linker.Tests.Cases.Expectations.Metadata;
namespaceMono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction("link","Dep")]
usingMono.Linker.Tests.Cases.Expectations.Assertions;
usingMono.Linker.Tests.Cases.Expectations.Metadata;
namespaceMono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction("link","Dep")]

Copilot uses AI. Check for mistakes.
Comment on lines +1 to +10

using Mono.Linker.Tests.Cases.Expectations.Assertions;
using Mono.Linker.Tests.Cases.Expectations.Metadata;

namespace Mono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction ("link", "ForwardedType")]
[SetupCompileBefore("Forwarder.dll", new[] { "Dependencies/ForwardedType.cs" })]

[SetupCompileAfter ("ForwardedType.dll", new[] { "Dependencies/ForwardedType.cs" })]

CopilotAIMar 29, 2026

Copy link

Choose a reason for hiding this comment

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

This file starts with an empty line and has inconsistent attribute invocation spacing (e.g., SetupLinkerAction (, SetupCompileAfter (). Most test cases here use no space before ( and no leading blank line; please normalize formatting to match the surrounding convention.

Suggested change
usingMono.Linker.Tests.Cases.Expectations.Assertions;
usingMono.Linker.Tests.Cases.Expectations.Metadata;
namespaceMono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction("link","ForwardedType")]
[SetupCompileBefore("Forwarder.dll",new[]{"Dependencies/ForwardedType.cs"})]
[SetupCompileAfter("ForwardedType.dll",new[]{"Dependencies/ForwardedType.cs"})]
usingMono.Linker.Tests.Cases.Expectations.Assertions;
usingMono.Linker.Tests.Cases.Expectations.Metadata;
namespaceMono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction("link","ForwardedType")]
[SetupCompileBefore("Forwarder.dll",new[]{"Dependencies/ForwardedType.cs"})]
[SetupCompileAfter("ForwardedType.dll",new[]{"Dependencies/ForwardedType.cs"})]

Copilot uses AI. Check for mistakes.

@sbomersbomer left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

No objection from me!

b.Method1();

// TODO: uncomment once we're okay with ToString bringing the whole world into closure
//((object)default(MyValueType)).ToString();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Should this be removed or uncommented?

agocke added a commit that referenced this pull request Apr 14, 2026
5 years ago we did a hackathon exploring illink written on top of the
ILCompiler.DependencyAnalysisFramework/managed type system and
System.Reflection.Metadata.
I let Claude:
* rebase the commits on top of main (required interventions by Claude
since things didn't merge cleanly)
* make things buildable again
* replace ILTrim.TypeSystem with ILCompiler.TypeSystem
* Get rid of most of ILTrim.Tests in favor of just taking
Mono.Linker.Tests as-is
* Extracting the tests into a separate pull request #126275
* Add some extra code to ILTrim.Tests to let us baseline failing tests
in a sidecar test file (feels better than adding Tools.ILTrim).
* 32% of test pass
* We had ~14000 lines unique to iltrim hackathon in the branch, now down
to ~7000.
I experimentally started prompting Claude to fix failing tests and have
a couple good result, but this is not part of that.
Submitting as a draft, I haven't really reviewed this myself either.
Cc @dotnet/illink
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

Running illink tests became much slower after the xunit migration, so let's not add unnecessary tests.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 27, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Tools-ILLink.NET linker development as well as trimming analyzerslinkable-frameworkIssues associated with delivering a linker friendly framework

Projects

None yet

Development

Successfully merging this pull request may close these issues.

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

Pull in tests from iltrim prototype - #126275

Closed
MichalStrehovsky wants to merge 1 commit into
dotnet:mainfrom
MichalStrehovsky:iltrim-new-tests
Closed

Pull in tests from iltrim prototype#126275
MichalStrehovsky wants to merge 1 commit into
dotnet:mainfrom
MichalStrehovsky:iltrim-new-tests

Conversation

@MichalStrehovsky

Copy link
Copy Markdown
Member

When we did the iltrim hackathon, we wrote some new tests. These are the tests from https://github.com/MichalStrehovsky/iltrim, moved to the illink tree.

Sending this out for considerations. We can say we don't want them and that would be fine too.

Cc @dotnet/illink

@MichalStrehovskyMichalStrehovsky added the area-Tools-ILLink .NET linker development as well as trimming analyzers label Mar 29, 2026
CopilotAI review requested due to automatic review settings March 29, 2026 12:42
@dotnet-policy-servicedotnet-policy-serviceBot added the linkable-framework Issues associated with delivering a linker friendly framework label Mar 29, 2026

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

Adds a set of new linker/analyzer test cases (ported from the iltrim prototype repo) into the illink test tree, and wires them into the Roslyn analyzer test-case generator output so they run as part of the existing suites.

Changes:

  • Added new Mono.Linker.Tests.Cases.Basic test cases covering signatures, control flow, resources, generics, virtual/interface scenarios, etc.
  • Added new Mono.Linker.Tests.Cases.MultiAssembly test cases (and dependencies) covering multi-assembly linking and type forwarding.
  • Updated/generated ILLink.RoslynAnalyzer.Tests suite mappings to include the new test cases.

Reviewed changes

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

Show a summary per file
FileDescription
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/TypeRefToAssembly.csAdds a multi-assembly typeref scope/keep assertion test.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/MultiAssembly.csAdds a multi-assembly member retention test for a dependency assembly.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/ForwarderReference.csAdds a type-forwarding scenario validating reference removal/retention across assemblies.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/Dependencies/TypeRefToAssembly_Library.csDependency type for TypeRefToAssembly test.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/Dependencies/Forwarder.csDependency assembly-level type forwarder attribute for forwarding scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/Dependencies/ForwardedType.csDefines forwarded type and members used in forwarder test.
src/tools/illink/test/Mono.Linker.Tests.Cases/MultiAssembly/Dependencies/Dep.csDefines dependency members used by MultiAssembly test.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/VirtualMethods.csAdds virtual dispatch retention test.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/TypeSpecSignature.csAdds typespec/unsafe signature coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/TypeOf.csAdds basic typeof retention scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Switch.csAdds switch statement/expression coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Resources.csAdds embedded resource preservation coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/MultiDimArraySignature.csAdds multidimensional array signature coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/MethodSpecSignature.csAdds generic method instantiation signature coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/LibraryModeTest.csAdds test targeting library-mode linker behavior.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/InterfaceOrder.csAdds interface ordering metadata/retention coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/InterfaceCalls.csAdds interface call retention coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/InstanceFields.csAdds instance field/layout scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/GenericType.csAdds generic base type chain retention coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/GenericParameters.csAdds open generic parameter/type name scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/FunctionPointer.csAdds function-pointer signature coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/First.csAdds “first method”/entry-point style scenario.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Finalizer.csAdds finalizer retention/removal behavior test.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/FieldsOfEnum.csAdds enum field retention/formatting coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/FieldSignature.csAdds field signature/type reference coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/FieldRVA.csAdds RVA/initializer data retention coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/ExceptionRegions.csAdds try/catch/filter/finally region coverage.
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Calli.csAdds calli emission scenario (with ILVerify skipped).
src/tools/illink/test/Mono.Linker.Tests.Cases/Basic/Dependencies/Resources_EmbeddedResource.txtAdds embedded resource content used by Resources test.
src/tools/illink/test/ILLink.RoslynAnalyzer.Tests/generated/ILLink.RoslynAnalyzer.Tests.Generator/ILLink.RoslynAnalyzer.Tests.TestCaseGenerator/MultiAssemblyTests.g.csRegisters new MultiAssembly suite test methods for analyzer harness.
src/tools/illink/test/ILLink.RoslynAnalyzer.Tests/generated/ILLink.RoslynAnalyzer.Tests.Generator/ILLink.RoslynAnalyzer.Tests.TestCaseGenerator/BasicTests.g.csRegisters new Basic suite test methods for analyzer harness.

Comment on lines +6 to +7
class GenericParameters
{

CopilotAIMar 29, 2026

Copy link

Choose a reason for hiding this comment

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

Indentation uses tab characters on the class declaration; repo .editorconfig sets indent_style=space. Please replace tabs with spaces so formatting is consistent and tooling doesn't churn the file.

Suggested change
class GenericParameters
{
class GenericParameters
{

Copilot uses AI. Check for mistakes.
Comment on lines +7 to +12
class FieldRVA
{
[Kept]
[KeptInitializerData]
static int Main() => new byte[] { 1, 2, 3, 4, 5 }.Length;
}

CopilotAIMar 29, 2026

Copy link

Choose a reason for hiding this comment

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

Indentation uses tab characters for the type declaration/closing brace; repo .editorconfig sets indent_style=space. Please convert these tabs to spaces to match formatting conventions.

Suggested change
class FieldRVA
{
[Kept]
[KeptInitializerData]
staticintMain()=>newbyte[]{1,2,3,4,5}.Length;
}
class FieldRVA
{
[Kept]
[KeptInitializerData]
staticintMain()=>newbyte[]{1,2,3,4,5}.Length;
}

Copilot uses AI. Check for mistakes.
Comment on lines +1 to +7

using Mono.Linker.Tests.Cases.Expectations.Assertions;
using Mono.Linker.Tests.Cases.Expectations.Metadata;

namespace Mono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction ("link", "Dep")]

CopilotAIMar 29, 2026

Copy link

Choose a reason for hiding this comment

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

This file starts with an empty line and uses spacing like [SetupLinkerAction ("link", ...)] (space before the (). Most test cases in this tree avoid the leading blank line and use [SetupLinkerAction("link", ...)]; aligning to that style reduces diff churn.

Suggested change
usingMono.Linker.Tests.Cases.Expectations.Assertions;
usingMono.Linker.Tests.Cases.Expectations.Metadata;
namespaceMono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction("link","Dep")]
usingMono.Linker.Tests.Cases.Expectations.Assertions;
usingMono.Linker.Tests.Cases.Expectations.Metadata;
namespaceMono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction("link","Dep")]

Copilot uses AI. Check for mistakes.
Comment on lines +1 to +10

using Mono.Linker.Tests.Cases.Expectations.Assertions;
using Mono.Linker.Tests.Cases.Expectations.Metadata;

namespace Mono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction ("link", "ForwardedType")]
[SetupCompileBefore("Forwarder.dll", new[] { "Dependencies/ForwardedType.cs" })]

[SetupCompileAfter ("ForwardedType.dll", new[] { "Dependencies/ForwardedType.cs" })]

CopilotAIMar 29, 2026

Copy link

Choose a reason for hiding this comment

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

This file starts with an empty line and has inconsistent attribute invocation spacing (e.g., SetupLinkerAction (, SetupCompileAfter (). Most test cases here use no space before ( and no leading blank line; please normalize formatting to match the surrounding convention.

Suggested change
usingMono.Linker.Tests.Cases.Expectations.Assertions;
usingMono.Linker.Tests.Cases.Expectations.Metadata;
namespaceMono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction("link","ForwardedType")]
[SetupCompileBefore("Forwarder.dll",new[]{"Dependencies/ForwardedType.cs"})]
[SetupCompileAfter("ForwardedType.dll",new[]{"Dependencies/ForwardedType.cs"})]
usingMono.Linker.Tests.Cases.Expectations.Assertions;
usingMono.Linker.Tests.Cases.Expectations.Metadata;
namespaceMono.Linker.Tests.Cases.MultiAssembly
{
[SetupLinkerAction("link","ForwardedType")]
[SetupCompileBefore("Forwarder.dll",new[]{"Dependencies/ForwardedType.cs"})]
[SetupCompileAfter("ForwardedType.dll",new[]{"Dependencies/ForwardedType.cs"})]

Copilot uses AI. Check for mistakes.

@sbomersbomer left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

No objection from me!

b.Method1();

// TODO: uncomment once we're okay with ToString bringing the whole world into closure
//((object)default(MyValueType)).ToString();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Should this be removed or uncommented?

agocke added a commit that referenced this pull request Apr 14, 2026
5 years ago we did a hackathon exploring illink written on top of the
ILCompiler.DependencyAnalysisFramework/managed type system and
System.Reflection.Metadata.
I let Claude:
* rebase the commits on top of main (required interventions by Claude
since things didn't merge cleanly)
* make things buildable again
* replace ILTrim.TypeSystem with ILCompiler.TypeSystem
* Get rid of most of ILTrim.Tests in favor of just taking
Mono.Linker.Tests as-is
* Extracting the tests into a separate pull request #126275
* Add some extra code to ILTrim.Tests to let us baseline failing tests
in a sidecar test file (feels better than adding Tools.ILTrim).
* 32% of test pass
* We had ~14000 lines unique to iltrim hackathon in the branch, now down
to ~7000.
I experimentally started prompting Claude to fix failing tests and have
a couple good result, but this is not part of that.
Submitting as a draft, I haven't really reviewed this myself either.
Cc @dotnet/illink
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

Running illink tests became much slower after the xunit migration, so let's not add unnecessary tests.

@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 27, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Tools-ILLink.NET linker development as well as trimming analyzerslinkable-frameworkIssues associated with delivering a linker friendly framework

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@MichalStrehovsky@sbomer