diff options
3 files changed, 49 insertions, 0 deletions
diff --git a/src/linker/Linker.Dataflow/ReflectionMethodBodyScanner.cs b/src/linker/Linker.Dataflow/ReflectionMethodBodyScanner.cs index d90565b6d..476e86bcf 100644 --- a/src/linker/Linker.Dataflow/ReflectionMethodBodyScanner.cs +++ b/src/linker/Linker.Dataflow/ReflectionMethodBodyScanner.cs @@ -1294,6 +1294,9 @@ namespace Mono.Linker.Dataflow if (dynamicallyAccessedMemberNode.DynamicallyAccessedMemberTypes.HasFlag (DynamicallyAccessedMemberTypes.PublicProperties)) propagatedMemberTypes |= DynamicallyAccessedMemberTypes.PublicProperties; + + if (dynamicallyAccessedMemberNode.DynamicallyAccessedMemberTypes.HasFlag (DynamicallyAccessedMemberTypes.Interfaces)) + propagatedMemberTypes |= DynamicallyAccessedMemberTypes.Interfaces; } methodReturnValue = MergePointValue.MergeValues (methodReturnValue, CreateMethodReturnValue (calledMethod, propagatedMemberTypes)); diff --git a/test/Mono.Linker.Tests.Cases/DataFlow/TypeBaseTypeDataFlow.cs b/test/Mono.Linker.Tests.Cases/DataFlow/TypeBaseTypeDataFlow.cs index abe5aaada..68d232252 100644 --- a/test/Mono.Linker.Tests.Cases/DataFlow/TypeBaseTypeDataFlow.cs +++ b/test/Mono.Linker.Tests.Cases/DataFlow/TypeBaseTypeDataFlow.cs @@ -34,6 +34,8 @@ namespace Mono.Linker.Tests.Cases.DataFlow TestNonPublicNestedTypesAreNotPropagated (typeof (TestType)); TestNonPublicPropertiesAreNotPropagated (typeof (TestType)); + TestInterfacesPropagated (typeof (TestType)); + TestCombinationOfPublicsIsPropagated (typeof (TestType)); TestCombinationOfNonPublicsIsNotPropagated (typeof (TestType)); TestCombinationOfPublicAndNonPublicsPropagatesPublicOnly (typeof (TestType)); @@ -165,6 +167,12 @@ namespace Mono.Linker.Tests.Cases.DataFlow } [RecognizedReflectionAccessPattern] + static void TestInterfacesPropagated ([DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.Interfaces)] Type derivedType) + { + derivedType.BaseType.RequiresInterfaces (); + } + + [RecognizedReflectionAccessPattern] static void TestCombinationOfPublicsIsPropagated ( [DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.PublicProperties)] Type derivedType) { diff --git a/test/Mono.Linker.Tests.Cases/Reflection/TypeUsedViaReflection.cs b/test/Mono.Linker.Tests.Cases/Reflection/TypeUsedViaReflection.cs index 1907cd653..0f660e6ed 100644 --- a/test/Mono.Linker.Tests.Cases/Reflection/TypeUsedViaReflection.cs +++ b/test/Mono.Linker.Tests.Cases/Reflection/TypeUsedViaReflection.cs @@ -42,6 +42,8 @@ namespace Mono.Linker.Tests.Cases.Reflection TestUnkownIgnoreCase3Params (1); TestUnkownIgnoreCase5Params (1); TestGenericTypeWithAnnotations (); + + BaseTypeInterfaces.Test (); } [Kept] @@ -409,5 +411,41 @@ namespace Mono.Linker.Tests.Cases.Reflection " test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"; Type.GetType (reflectionTypeKeptString); } + + [Kept] + class BaseTypeInterfaces + { + [Kept] + interface ITest + { + [Kept] + void Method (); + } + + [Kept] + [KeptInterface (typeof (ITest))] + class BaseType : ITest + { + [Kept] + public void Method () { } + } + + [Kept] + [KeptBaseType (typeof (BaseType))] + [KeptInterface (typeof (ITest))] + class DerivedType : BaseType, ITest + { + [Kept] + public void Method () { } + } + + [Kept] + public static void Test () + { + ITest t = null; + t.Method (); + typeof (DerivedType).GetInterfaces (); + } + } } } |