diff --git a/src/linker/Linker.Dataflow/ReflectionMethodBodyScanner.cs b/src/linker/Linker.Dataflow/ReflectionMethodBodyScanner.cs index a46b19953eb5..73a103bcc0d0 100644 --- a/src/linker/Linker.Dataflow/ReflectionMethodBodyScanner.cs +++ b/src/linker/Linker.Dataflow/ReflectionMethodBodyScanner.cs @@ -1357,7 +1357,12 @@ void ProcessCreateInstanceByName (ref ReflectionPatternContext reflectionContext void RequireDynamicallyAccessedMembers (ref ReflectionPatternContext reflectionContext, DynamicallyAccessedMemberTypes requiredMemberTypes, ValueNode value, IMetadataTokenProvider targetContext) { foreach (var uniqueValue in value.UniqueValues ()) { - if (uniqueValue is LeafValueWithDynamicallyAccessedMemberNode valueWithDynamicallyAccessedMember) { + if (requiredMemberTypes == DynamicallyAccessedMemberTypes.PublicParameterlessConstructor + && uniqueValue is SystemTypeForGenericParameterValue genericParam + && genericParam.GenericParameter.HasDefaultConstructorConstraint) { + // We allow a new() constraint on a generic parameter to satisfy DynamicallyAccessedMemberTypes.PublicParameterlessConstructor + reflectionContext.RecordHandledPattern (); + } else if (uniqueValue is LeafValueWithDynamicallyAccessedMemberNode valueWithDynamicallyAccessedMember) { if (!valueWithDynamicallyAccessedMember.DynamicallyAccessedMemberTypes.HasFlag (requiredMemberTypes)) { reflectionContext.RecordUnrecognizedPattern ($"The {GetValueDescriptionForErrorMessage (valueWithDynamicallyAccessedMember)} " + $"with dynamically accessed member kinds '{DiagnosticUtilities.GetDynamicallyAccessedMemberTypesDescription (valueWithDynamicallyAccessedMember.DynamicallyAccessedMemberTypes)}' " + diff --git a/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs b/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs index aefda2f7f6a9..2350c95d243c 100644 --- a/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs +++ b/test/Mono.Linker.Tests.Cases/DataFlow/GenericParameterDataFlow.cs @@ -28,6 +28,8 @@ public static void Main () TestMakeGenericType (); TestMakeGenericMethod (); + + TestNewConstraintSatisfiesParameterlessConstructor (); } static void TestSingleGenericParameterOnType () @@ -788,5 +790,15 @@ static void MethodMakeGenericWithNoRequirements () public class TestType { } + + [RecognizedReflectionAccessPattern] + static void TestNewConstraintSatisfiesParameterlessConstructor () where T : new() + { + RequiresParameterlessConstructor (); + } + + static void RequiresParameterlessConstructor<[DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] T> () + { + } } }