diff --git a/src/ILLink.RoslynAnalyzer/TrimAnalysis/TrimAnalysisVisitor.cs b/src/ILLink.RoslynAnalyzer/TrimAnalysis/TrimAnalysisVisitor.cs index 26c79b4c66fc..7a61a03a8a52 100644 --- a/src/ILLink.RoslynAnalyzer/TrimAnalysis/TrimAnalysisVisitor.cs +++ b/src/ILLink.RoslynAnalyzer/TrimAnalysis/TrimAnalysisVisitor.cs @@ -70,7 +70,14 @@ public override MultiValue VisitInstanceReference (IInstanceReferenceOperation i public override MultiValue VisitFieldReference (IFieldReferenceOperation fieldRef, StateValue state) { - return fieldRef.Field.Type.IsTypeInterestingForDataflow () ? new FieldValue (fieldRef.Field) : TopValue; + if (!fieldRef.Field.Type.IsTypeInterestingForDataflow ()) + return TopValue; + + var field = fieldRef.Field; + if (field.Name is "Empty" && field.ContainingType.HasName ("System.String")) + return new KnownStringValue (string.Empty); + + return new FieldValue (fieldRef.Field); } public override MultiValue VisitTypeOf (ITypeOfOperation typeOfOperation, StateValue state) diff --git a/test/ILLink.RoslynAnalyzer.Tests/DataFlowTests.cs b/test/ILLink.RoslynAnalyzer.Tests/DataFlowTests.cs index 9a7461dc1d97..955d7ba04055 100644 --- a/test/ILLink.RoslynAnalyzer.Tests/DataFlowTests.cs +++ b/test/ILLink.RoslynAnalyzer.Tests/DataFlowTests.cs @@ -100,10 +100,11 @@ public Task GetNestedTypeOnAllAnnotatedType () return RunTest (allowMissingWarnings: true); } - [Fact (Skip = "https://github.com/dotnet/linker/issues/2273")] + [Fact] public Task GetTypeDataFlow () { - return RunTest (nameof (GetTypeDataFlow)); + // https://github.com/dotnet/linker/issues/2273 + return RunTest (allowMissingWarnings: true); } [Fact] diff --git a/test/Mono.Linker.Tests.Cases/DataFlow/FieldDataFlow.cs b/test/Mono.Linker.Tests.Cases/DataFlow/FieldDataFlow.cs index 8b0995b8fdaa..ac46bfab1a5a 100644 --- a/test/Mono.Linker.Tests.Cases/DataFlow/FieldDataFlow.cs +++ b/test/Mono.Linker.Tests.Cases/DataFlow/FieldDataFlow.cs @@ -34,6 +34,8 @@ public static void Main () instance.WriteUnknownValue (); _ = _annotationOnWrongType; + + TestStringEmpty (); } [DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] @@ -148,6 +150,17 @@ static void MakeArrayValuesUnknown (object[] array) } } + private static void TestStringEmpty () + { + RequirePublicMethods (string.Empty); + } + + private static void RequirePublicMethods ( + [DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicMethods)] + string s) + { + } + private static void RequirePublicParameterlessConstructor ( [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] Type type)