From 373d145cfea4cd1cf75580a69f628b28f32dd5a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Strehovsk=C3=BD?= Date: Thu, 24 Jul 2025 12:51:36 +0200 Subject: [PATCH 01/12] Fix --- .../Compiler/Dataflow/MethodBodyScanner.cs | 10 ++++++++-- .../Dataflow/ReflectionMethodBodyScanner.cs | 16 ++++++++++++---- .../Compiler/MetadataManager.cs | 4 ++++ .../Compiler/UsageBasedMetadataManager.cs | 9 +++++++++ .../ILCompiler.Compiler/IL/ILImporter.Scanner.cs | 7 +++++++ 5 files changed, 40 insertions(+), 6 deletions(-) diff --git a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/Dataflow/MethodBodyScanner.cs b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/Dataflow/MethodBodyScanner.cs index 77de311145e890..6b0753cfef025e 100644 --- a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/Dataflow/MethodBodyScanner.cs +++ b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/Dataflow/MethodBodyScanner.cs @@ -592,10 +592,8 @@ protected virtual void Scan(MethodIL methodBody, ref InterproceduralState interp case ILOpcode.conv_r8: case ILOpcode.ldind_ref: case ILOpcode.ldobj: - case ILOpcode.mkrefany: case ILOpcode.unbox: case ILOpcode.unbox_any: - case ILOpcode.box: case ILOpcode.neg: case ILOpcode.not: PopUnknown(currentStack, 1, methodBody, offset); @@ -603,6 +601,13 @@ protected virtual void Scan(MethodIL methodBody, ref InterproceduralState interp reader.Skip(opcode); break; + case ILOpcode.box: + case ILOpcode.mkrefany: + HandleTypeTokenAccess(methodBody, offset, (TypeDesc)methodBody.GetObject(reader.ReadILToken())); + PopUnknown(currentStack, 1, methodBody, offset); + PushUnknown(currentStack); + break; + case ILOpcode.isinst: case ILOpcode.castclass: // We can consider a NOP because the value doesn't change. @@ -622,6 +627,7 @@ protected virtual void Scan(MethodIL methodBody, ref InterproceduralState interp { StackSlot count = PopUnknown(currentStack, 1, methodBody, offset); var arrayElement = (TypeDesc)methodBody.GetObject(reader.ReadILToken()); + HandleTypeTokenAccess(methodBody, offset, arrayElement); currentStack.Push(new StackSlot(ArrayValue.Create(count.Value, arrayElement))); } break; diff --git a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/Dataflow/ReflectionMethodBodyScanner.cs b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/Dataflow/ReflectionMethodBodyScanner.cs index 4738e0755bf08b..3483348d90155b 100644 --- a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/Dataflow/ReflectionMethodBodyScanner.cs +++ b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/Dataflow/ReflectionMethodBodyScanner.cs @@ -60,6 +60,14 @@ public static bool RequiresReflectionMethodBodyScannerForAccess(FlowAnnotations field.DoesFieldRequire(DiagnosticUtilities.RequiresDynamicCodeAttribute, out _); } + public static bool RequiresReflectionMethodBodyScannerForAccess(FlowAnnotations flowAnnotations, TypeDesc type) + { + return GenericArgumentDataFlow.RequiresGenericArgumentDataFlow(flowAnnotations, type) || + type.DoesTypeRequire(DiagnosticUtilities.RequiresUnreferencedCodeAttribute, out _) || + type.DoesTypeRequire(DiagnosticUtilities.RequiresAssemblyFilesAttribute, out _) || + type.DoesTypeRequire(DiagnosticUtilities.RequiresDynamicCodeAttribute, out _); + } + internal static void CheckAndReportAllRequires(in DiagnosticContext diagnosticContext, TypeSystemEntity calledMember) { CheckAndReportRequires(diagnosticContext, calledMember, DiagnosticUtilities.RequiresUnreferencedCodeAttribute); @@ -429,10 +437,10 @@ private static bool IsComInterop(MarshalAsDescriptor? marshalInfoProvider, TypeD private void ProcessGenericArgumentDataFlow(MethodDesc method) { - // We only need to validate static methods and then all generic methods - // Instance non-generic methods don't need validation because the creation of the instance - // is the place where the validation will happen. - if (!method.Signature.IsStatic && !method.HasInstantiation && !method.IsConstructor) + // We mostly need to validate static methods and generic methods + // Instance non-generic methods on reference types don't need validation + // because the creation of the instance is the place where the validation will happen. + if (!method.Signature.IsStatic && !method.HasInstantiation && !method.IsConstructor && !method.OwningType.IsValueType) return; if (GenericArgumentDataFlow.RequiresGenericArgumentDataFlow(_annotations, method)) diff --git a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/MetadataManager.cs b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/MetadataManager.cs index 515321b37e4974..ead8231abb9543 100644 --- a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/MetadataManager.cs +++ b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/MetadataManager.cs @@ -1240,6 +1240,10 @@ public bool CanGenerateMetadata(FieldDesc field) protected abstract MetadataCategory GetMetadataCategory(TypeDesc type); protected abstract MetadataCategory GetMetadataCategory(FieldDesc field); + public virtual void GetDependenciesDueToAccess(ref DependencyList dependencies, NodeFactory factory, MethodIL methodIL, TypeDesc accessedType) + { + } + public virtual void GetDependenciesDueToAccess(ref DependencyList dependencies, NodeFactory factory, MethodIL methodIL, MethodDesc calledMethod) { } diff --git a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/UsageBasedMetadataManager.cs b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/UsageBasedMetadataManager.cs index 18fe157a668b3e..13c2e2ff9d713c 100644 --- a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/UsageBasedMetadataManager.cs +++ b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/UsageBasedMetadataManager.cs @@ -773,6 +773,15 @@ public override void GetDependenciesDueToAccess(ref DependencyList dependencies, } } + public override void GetDependenciesDueToAccess(ref DependencyList dependencies, NodeFactory factory, MethodIL methodIL, TypeDesc accessedType) + { + bool scanReflection = (_generationOptions & UsageBasedMetadataGenerationOptions.ReflectionILScanning) != 0; + if (scanReflection && Dataflow.ReflectionMethodBodyScanner.RequiresReflectionMethodBodyScannerForAccess(FlowAnnotations, accessedType)) + { + AddDataflowDependency(ref dependencies, factory, methodIL, "Access to interesting type"); + } + } + public override void GetDependenciesDueToAccess(ref DependencyList dependencies, NodeFactory factory, MethodIL methodIL, MethodDesc calledMethod) { bool scanReflection = (_generationOptions & UsageBasedMetadataGenerationOptions.ReflectionILScanning) != 0; diff --git a/src/coreclr/tools/aot/ILCompiler.Compiler/IL/ILImporter.Scanner.cs b/src/coreclr/tools/aot/ILCompiler.Compiler/IL/ILImporter.Scanner.cs index 362af202beb4ef..31c9035787ee48 100644 --- a/src/coreclr/tools/aot/ILCompiler.Compiler/IL/ILImporter.Scanner.cs +++ b/src/coreclr/tools/aot/ILCompiler.Compiler/IL/ILImporter.Scanner.cs @@ -921,6 +921,7 @@ private void ImportMkRefAny(int token) { _dependencies.Add(GetHelperEntrypoint(ReadyToRunHelper.TypeHandleToRuntimeType), "mkrefany"); _dependencies.Add(GetHelperEntrypoint(ReadyToRunHelper.TypeHandleToRuntimeTypeHandle), "mkrefany"); + _factory.MetadataManager.GetDependenciesDueToAccess(ref _dependencies, _factory, _methodIL, (TypeDesc)_canonMethodIL.GetObject(token)); ImportTypedRefOperationDependencies(token, "mkrefany"); } @@ -960,6 +961,8 @@ private void ImportLdToken(int token) } } + _factory.MetadataManager.GetDependenciesDueToAccess(ref _dependencies, _factory, _methodIL, (TypeDesc)_canonMethodIL.GetObject(token)); + _dependencies.Add(GetHelperEntrypoint(ReadyToRunHelper.GetRuntimeTypeHandle), "ldtoken"); _dependencies.Add(GetHelperEntrypoint(ReadyToRunHelper.GetRuntimeType), "ldtoken"); @@ -1190,6 +1193,9 @@ private void AddBoxingDependencies(TypeDesc type, string reason) if (!type.IsValueType) return; + TypeDesc typeForAccessCheck = type.IsRuntimeDeterminedSubtype ? type.ConvertToCanonForm(CanonicalFormKind.Specific) : type; + _factory.MetadataManager.GetDependenciesDueToAccess(ref _dependencies, _factory, _methodIL, typeForAccessCheck); + if (type.IsRuntimeDeterminedSubtype) { _dependencies.Add(GetGenericLookupHelper(ReadyToRunHelperId.TypeHandle, type), reason); @@ -1217,6 +1223,7 @@ private void ImportLeave(BasicBlock target) private void ImportNewArray(int token) { var elementType = (TypeDesc)_methodIL.GetObject(token); + _factory.MetadataManager.GetDependenciesDueToAccess(ref _dependencies, _factory, _methodIL, (TypeDesc)_canonMethodIL.GetObject(token)); if (elementType.IsRuntimeDeterminedSubtype) { _dependencies.Add(GetGenericLookupHelper(ReadyToRunHelperId.TypeHandle, elementType.MakeArrayType()), "newarr"); From c826c4e5468b0371e9fc44b5011e84ccd0d25c49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Strehovsk=C3=BD?= Date: Thu, 24 Jul 2025 13:27:30 +0200 Subject: [PATCH 02/12] Test --- .../DataFlow/GenericParameterDataFlow.cs | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs b/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs index 1a39904824fde1..df2ba8771532a9 100644 --- a/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs +++ b/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs @@ -49,6 +49,11 @@ public static void Main() TestNoWarningsInRUCMethod(); TestNoWarningsInRUCType(); TestGenericParameterFlowsToNestedType.Test(); + + TestInstanceMethodOnValueType(); + TestValueTypeBox(); + TestMkrefAny(); + TestInArray(); } static void TestSingleGenericParameterOnType() @@ -852,6 +857,49 @@ static void TestNoWarningsInRUCType() rucType.VirtualMethodRequiresPublicMethods(); } + [ExpectedWarning("IL2091", "RequiresParameterlessCtor")] + static void TestInstanceMethodOnValueType() + { + default(RequiresParameterlessCtor).Do(); + } + + [ExpectedWarning("IL2091", "RequiresParameterlessCtor")] + static void TestValueTypeBox() + { + if (default(RequiresParameterlessCtor) is IRequireParameterlessCtor i) + { + i.Do(); + } + } + + [ExpectedWarning("IL2091", "RequiresParameterlessCtor")] + static void TestMkrefAny() + { + RequiresParameterlessCtor val = default; + TypedReference tr = __makeref(val); + // This is a potential box operation, e.g. TypedReference.ToObject(tr); + } + + [ExpectedWarning("IL2091", "RequiresParameterlessCtor")] + static void TestInArray() + { + var arr = new RequiresParameterlessCtor[1]; + // This is a potential box operation, e.g. arr.GetValue(0) + } + + interface IRequireParameterlessCtor<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] T> + { + T Do(); + } + + struct RequiresParameterlessCtor<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] T> : IRequireParameterlessCtor + { + public T Do() + { + return Activator.CreateInstance(); + } + } + class TestGenericParameterFlowsToNestedType { class Generic From 6e4354a83b4e04ea29e12bf6579d17e503ff0891 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Strehovsk=C3=BD?= Date: Thu, 24 Jul 2025 22:51:08 +0200 Subject: [PATCH 03/12] ILLinker warns more on this? Unexpected warning found: ILLink: Trim analysis warning IL2091: Mono.Linker.Tests.Cases.DataFlow.GenericParameterDataFlow.TestInArray(): 'T' generic argument does not satisfy 'DynamicallyAccessedMemberTypes.PublicParameterlessConstructor' in 'Mono.Linker.Tests.Cases.DataFlow.GenericParameterDataFlow.RequiresParameterlessCtor'. The generic parameter 'T' of 'Mono.Linker.Tests.Cases.DataFlow.GenericParameterDataFlow.TestInArray()' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to. --- .../Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs b/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs index df2ba8771532a9..d2a4eda240adc1 100644 --- a/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs +++ b/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs @@ -881,6 +881,7 @@ static void TestMkrefAny() } [ExpectedWarning("IL2091", "RequiresParameterlessCtor")] + [ExpectedWarning("IL2091", "RequiresParameterlessCtor", Tool.Trimmer, "")] static void TestInArray() { var arr = new RequiresParameterlessCtor[1]; From b4e1f998cd539c629c9c75604467c3a315b02c85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Strehovsk=C3=BD?= Date: Thu, 24 Jul 2025 23:35:29 +0200 Subject: [PATCH 04/12] Update GenericParameterDataFlow.cs --- .../Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs b/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs index d2a4eda240adc1..560f6361d8d139 100644 --- a/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs +++ b/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs @@ -858,6 +858,7 @@ static void TestNoWarningsInRUCType() } [ExpectedWarning("IL2091", "RequiresParameterlessCtor")] + [ExpectedWarning("IL2091", "RequiresParameterlessCtor", Tool.Trimmer, "")] static void TestInstanceMethodOnValueType() { default(RequiresParameterlessCtor).Do(); From 5d88297a5a9007ab9b0c1f6e9b069feeef7d68b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Strehovsk=C3=BD?= Date: Thu, 24 Jul 2025 15:16:38 -0700 Subject: [PATCH 05/12] Update GenericParameterDataFlow.cs --- .../Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs b/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs index 560f6361d8d139..75efe3f591dd4a 100644 --- a/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs +++ b/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs @@ -859,6 +859,7 @@ static void TestNoWarningsInRUCType() [ExpectedWarning("IL2091", "RequiresParameterlessCtor")] [ExpectedWarning("IL2091", "RequiresParameterlessCtor", Tool.Trimmer, "")] + [ExpectedWarning("IL2091", "RequiresParameterlessCtor", Tool.Trimmer, "")] static void TestInstanceMethodOnValueType() { default(RequiresParameterlessCtor).Do(); From 8f8d1d7f86294c9608bcf3ff031b5f131dadb993 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Strehovsk=C3=BD?= Date: Thu, 24 Jul 2025 23:17:39 -0700 Subject: [PATCH 06/12] Update GenericParameterDataFlow.cs --- .../Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs b/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs index 75efe3f591dd4a..64eb8c82c5701a 100644 --- a/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs +++ b/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs @@ -875,6 +875,7 @@ static void TestValueTypeBox() } [ExpectedWarning("IL2091", "RequiresParameterlessCtor")] + [ExpectedWarning("IL2091", "RequiresParameterlessCtor", Tool.Trimmer, "")] static void TestMkrefAny() { RequiresParameterlessCtor val = default; From a789480621c5703f3943cb6323e28c9af7224b70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Strehovsk=C3=BD?= Date: Fri, 25 Jul 2025 00:13:39 -0700 Subject: [PATCH 07/12] Update GenericParameterDataFlow.cs --- .../Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs b/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs index 64eb8c82c5701a..948113da5f362a 100644 --- a/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs +++ b/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs @@ -876,6 +876,7 @@ static void TestValueTypeBox() [ExpectedWarning("IL2091", "RequiresParameterlessCtor")] [ExpectedWarning("IL2091", "RequiresParameterlessCtor", Tool.Trimmer, "")] + [ExpectedWarning("IL2091", "RequiresParameterlessCtor", Tool.Trimmer, "")] static void TestMkrefAny() { RequiresParameterlessCtor val = default; From e339823b0dc3f60d22e47c2a5cde07b3ed7c64dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Strehovsk=C3=BD?= Date: Fri, 25 Jul 2025 02:22:57 -0700 Subject: [PATCH 08/12] Update GenericParameterDataFlow.cs --- .../Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs b/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs index 948113da5f362a..951aba52a6e83b 100644 --- a/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs +++ b/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs @@ -866,6 +866,7 @@ static void TestInstanceMethodOnValueType() } [ExpectedWarning("IL2091", "RequiresParameterlessCtor")] + [ExpectedWarning("IL2091", "RequiresParameterlessCtor", Tool.Trimmer, "")] static void TestValueTypeBox() { if (default(RequiresParameterlessCtor) is IRequireParameterlessCtor i) From 80110f7edae9858071899c09c0105d6d9496496a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Strehovsk=C3=BD?= Date: Fri, 25 Jul 2025 03:26:42 -0700 Subject: [PATCH 09/12] Update GenericParameterDataFlow.cs --- .../Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs b/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs index 951aba52a6e83b..2e39ddaad4386b 100644 --- a/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs +++ b/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs @@ -867,6 +867,7 @@ static void TestInstanceMethodOnValueType() [ExpectedWarning("IL2091", "RequiresParameterlessCtor")] [ExpectedWarning("IL2091", "RequiresParameterlessCtor", Tool.Trimmer, "")] + [ExpectedWarning("IL2091", "IRequireParameterlessCtor", Tool.Trimmer, "")] static void TestValueTypeBox() { if (default(RequiresParameterlessCtor) is IRequireParameterlessCtor i) From dab9bd1ddc2fe7f45b5a2323f66265e6ccef7f27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Strehovsk=C3=BD?= Date: Fri, 25 Jul 2025 04:02:29 -0700 Subject: [PATCH 10/12] HOW MANY MORE? --- .../Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs b/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs index 2e39ddaad4386b..08fc3dc110362f 100644 --- a/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs +++ b/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs @@ -868,6 +868,7 @@ static void TestInstanceMethodOnValueType() [ExpectedWarning("IL2091", "RequiresParameterlessCtor")] [ExpectedWarning("IL2091", "RequiresParameterlessCtor", Tool.Trimmer, "")] [ExpectedWarning("IL2091", "IRequireParameterlessCtor", Tool.Trimmer, "")] + [ExpectedWarning("IL2091", "IRequireParameterlessCtor", Tool.Trimmer, "")] static void TestValueTypeBox() { if (default(RequiresParameterlessCtor) is IRequireParameterlessCtor i) From 3a560eb73e149b4b06732e456c1138662f8d9c99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Strehovsk=C3=BD?= Date: Fri, 25 Jul 2025 07:34:14 -0700 Subject: [PATCH 11/12] Update GenericParameterDataFlow.cs --- .../Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs b/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs index 08fc3dc110362f..1f2460ad711046 100644 --- a/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs +++ b/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs @@ -867,6 +867,7 @@ static void TestInstanceMethodOnValueType() [ExpectedWarning("IL2091", "RequiresParameterlessCtor")] [ExpectedWarning("IL2091", "RequiresParameterlessCtor", Tool.Trimmer, "")] + [ExpectedWarning("IL2091", "RequiresParameterlessCtor", Tool.Trimmer, "")] [ExpectedWarning("IL2091", "IRequireParameterlessCtor", Tool.Trimmer, "")] [ExpectedWarning("IL2091", "IRequireParameterlessCtor", Tool.Trimmer, "")] static void TestValueTypeBox() From b16eae2f7a984812f47a624f854c862ebb369acd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Strehovsk=C3=BD?= Date: Sat, 26 Jul 2025 00:46:30 +0200 Subject: [PATCH 12/12] Update GenericParameterDataFlow.cs --- .../DataFlow/GenericParameterDataFlow.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs b/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs index 1f2460ad711046..51baf8335050f4 100644 --- a/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs +++ b/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs @@ -857,7 +857,7 @@ static void TestNoWarningsInRUCType() rucType.VirtualMethodRequiresPublicMethods(); } - [ExpectedWarning("IL2091", "RequiresParameterlessCtor")] + [ExpectedWarning("IL2091", "RequiresParameterlessCtor", Tool.Trimmer | Tool.NativeAot, "")] [ExpectedWarning("IL2091", "RequiresParameterlessCtor", Tool.Trimmer, "")] [ExpectedWarning("IL2091", "RequiresParameterlessCtor", Tool.Trimmer, "")] static void TestInstanceMethodOnValueType() @@ -865,7 +865,7 @@ static void TestInstanceMethodOnValueType() default(RequiresParameterlessCtor).Do(); } - [ExpectedWarning("IL2091", "RequiresParameterlessCtor")] + [ExpectedWarning("IL2091", "RequiresParameterlessCtor", Tool.Trimmer | Tool.NativeAot, "")] [ExpectedWarning("IL2091", "RequiresParameterlessCtor", Tool.Trimmer, "")] [ExpectedWarning("IL2091", "RequiresParameterlessCtor", Tool.Trimmer, "")] [ExpectedWarning("IL2091", "IRequireParameterlessCtor", Tool.Trimmer, "")] @@ -878,7 +878,7 @@ static void TestValueTypeBox() } } - [ExpectedWarning("IL2091", "RequiresParameterlessCtor")] + [ExpectedWarning("IL2091", "RequiresParameterlessCtor", Tool.Trimmer | Tool.NativeAot, "")] [ExpectedWarning("IL2091", "RequiresParameterlessCtor", Tool.Trimmer, "")] [ExpectedWarning("IL2091", "RequiresParameterlessCtor", Tool.Trimmer, "")] static void TestMkrefAny() @@ -888,7 +888,7 @@ static void TestMkrefAny() // This is a potential box operation, e.g. TypedReference.ToObject(tr); } - [ExpectedWarning("IL2091", "RequiresParameterlessCtor")] + [ExpectedWarning("IL2091", "RequiresParameterlessCtor", Tool.Trimmer | Tool.NativeAot, "")] [ExpectedWarning("IL2091", "RequiresParameterlessCtor", Tool.Trimmer, "")] static void TestInArray() {