From bfda57f1ae37d12174ea066cbfc8a1c9c4730fa2 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 21 Jan 2026 23:38:44 +0000 Subject: [PATCH 1/2] Initial plan From e58439e4fc19ebd78f88dc0eb64a2d9584806f43 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 21 Jan 2026 23:46:08 +0000 Subject: [PATCH 2/2] Fix ILLink duplicate warnings for new() constraint with PublicParameterlessConstructor annotation Co-authored-by: sbomer <787361+sbomer@users.noreply.github.com> --- src/tools/illink/src/linker/Linker.Steps/MarkStep.cs | 10 +++++++++- .../RequiresCapability/RequiresOnClass.cs | 2 -- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/tools/illink/src/linker/Linker.Steps/MarkStep.cs b/src/tools/illink/src/linker/Linker.Steps/MarkStep.cs index 11058cae769996..2be1e256a8d6a5 100644 --- a/src/tools/illink/src/linker/Linker.Steps/MarkStep.cs +++ b/src/tools/illink/src/linker/Linker.Steps/MarkStep.cs @@ -2940,8 +2940,16 @@ void MarkGenericArguments(IGenericInstance instance, MessageOrigin origin) MarkRelevantToVariantCasting(argumentTypeDef); + // Only mark the default constructor for new() constraint if the parameter doesn't have + // a PublicParameterlessConstructor annotation, which would already handle it via GenericArgumentDataFlow if (parameter?.HasDefaultConstructorConstraint == true) - MarkDefaultConstructor(argumentTypeDef, new DependencyInfo(DependencyKind.DefaultCtorForNewConstrainedGenericArgument, instance), origin); + { + var annotatedMemberTypes = Context.Annotations.FlowAnnotations.GetGenericParameterAnnotation(parameter); + if (!annotatedMemberTypes.HasFlag(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)) + { + MarkDefaultConstructor(argumentTypeDef, new DependencyInfo(DependencyKind.DefaultCtorForNewConstrainedGenericArgument, instance), origin); + } + } } } diff --git a/src/tools/illink/test/Mono.Linker.Tests.Cases/RequiresCapability/RequiresOnClass.cs b/src/tools/illink/test/Mono.Linker.Tests.Cases/RequiresCapability/RequiresOnClass.cs index 439a665cf0f5dd..0098ead5b76922 100644 --- a/src/tools/illink/test/Mono.Linker.Tests.Cases/RequiresCapability/RequiresOnClass.cs +++ b/src/tools/illink/test/Mono.Linker.Tests.Cases/RequiresCapability/RequiresOnClass.cs @@ -1418,11 +1418,9 @@ public ClassWithWarningOnGenericArgumentConstructor() } [ExpectedWarning("IL2026", "ClassWithRequires()", "--ClassWithRequires--")] - [ExpectedWarning("IL2026", "ClassWithRequires()", "--ClassWithRequires--", Tool.Trimmer, "https://github.com/dotnet/runtime/issues/119290")] class ClassWithWarningOnGenericArgumentConstructor_NewAndAnnotation : RequiresNewAndConstructors { [ExpectedWarning("IL2026", "--ClassWithRequires--")] - [ExpectedWarning("IL2026", "--ClassWithRequires--", Tool.Trimmer, "https://github.com/dotnet/runtime/issues/119290")] public ClassWithWarningOnGenericArgumentConstructor_NewAndAnnotation() { }