Skip to content

Commit 750eee7

Browse files
authored
Fix Activator.CreateInstance case (dotnet/linker#2146)
* Fix Activator.CreateInstance case When no ctor parameters are passed, and non-public binding flags are used, we only need to require parameterless constructors. * Add test Commit migrated from dotnet/linker@2174dc1
1 parent 21c3c91 commit 750eee7

File tree

2 files changed

+14
-4
lines changed

2 files changed

+14
-4
lines changed

src/tools/illink/src/linker/Linker.Dataflow/ReflectionMethodBodyScanner.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1596,10 +1596,10 @@ public override bool HandleCall (MethodBody callingMethodBody, MethodReference c
15961596
var requiredMemberTypes = GetDynamicallyAccessedMemberTypesFromBindingFlagsForConstructors (bindingFlags);
15971597

15981598
// Special case the public parameterless constructor if we know that there are 0 args passed in
1599-
if (ctorParameterCount == 0 &&
1600-
requiredMemberTypes.HasFlag (DynamicallyAccessedMemberTypes.PublicConstructors) &&
1601-
!requiredMemberTypes.HasFlag (DynamicallyAccessedMemberTypes.NonPublicConstructors))
1602-
requiredMemberTypes = DynamicallyAccessedMemberTypes.PublicParameterlessConstructor;
1599+
if (ctorParameterCount == 0 && requiredMemberTypes.HasFlag (DynamicallyAccessedMemberTypes.PublicConstructors)) {
1600+
requiredMemberTypes &= ~DynamicallyAccessedMemberTypes.PublicConstructors;
1601+
requiredMemberTypes |= DynamicallyAccessedMemberTypes.PublicParameterlessConstructor;
1602+
}
16031603

16041604
RequireDynamicallyAccessedMembers (ref reflectionContext, requiredMemberTypes, value, calledMethod.Parameters[0]);
16051605
}

src/tools/illink/test/Mono.Linker.Tests.Cases/Reflection/ActivatorCreateInstance.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ public static void Main ()
5555
TestNullArgsOnKnownType ();
5656
TestNullArgsOnAnnotatedType (typeof (TestType));
5757
TestNullArgsNonPublicOnly (typeof (TestType));
58+
TestNullArgsNonPublicWithNonPublicAnnotation (typeof (TestType));
5859

5960
CreateInstanceWithGetTypeFromHierarchy.Test ();
6061
}
@@ -532,6 +533,15 @@ private static void TestNullArgsNonPublicOnly (
532533
Activator.CreateInstance (type, BindingFlags.NonPublic | BindingFlags.Instance, null, null, CultureInfo.InvariantCulture);
533534
}
534535

536+
[Kept]
537+
[ExpectedNoWarnings]
538+
private static void TestNullArgsNonPublicWithNonPublicAnnotation (
539+
[DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicParameterlessConstructor | DynamicallyAccessedMemberTypes.NonPublicConstructors),
540+
KeptAttributeAttribute (typeof (DynamicallyAccessedMembersAttribute))] Type type)
541+
{
542+
Activator.CreateInstance (type, nonPublic: true);
543+
}
544+
535545
[Kept]
536546
class CreateInstanceWithGetTypeFromHierarchy
537547
{

0 commit comments

Comments
 (0)