From 42ab36fb84dd37d1508112d9d611684cdfaa40fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Strehovsk=C3=BD?= Date: Wed, 17 Aug 2022 16:49:02 +0900 Subject: [PATCH] Add test for dotnet/runtime#73048 Running dataflow analysis on the added test takes about 20 seconds. Double the number of `yield returns` and it will take several minutes. In the runtime repo we're running into this on https://github.com/dotnet/runtime/blob/main/src/libraries/System.Runtime.Serialization.Formatters/tests/BinaryFormatterTestData.cs (method `SerializableObjects()`). That one has even more `yield returns` and I lost patience waiting for it to finish. --- .../DataFlow/CompilerGeneratedCodeDataflow.cs | 109 ++++++++++++++++++ 1 file changed, 109 insertions(+) diff --git a/test/Mono.Linker.Tests.Cases/DataFlow/CompilerGeneratedCodeDataflow.cs b/test/Mono.Linker.Tests.Cases/DataFlow/CompilerGeneratedCodeDataflow.cs index abed4646c595..53032ae723e4 100644 --- a/test/Mono.Linker.Tests.Cases/DataFlow/CompilerGeneratedCodeDataflow.cs +++ b/test/Mono.Linker.Tests.Cases/DataFlow/CompilerGeneratedCodeDataflow.cs @@ -93,6 +93,113 @@ static IEnumerable FlowAcrossYieldReturnWithBackwardsBranch (int n = 0) } } + [ExpectedWarning ("IL2072", nameof (GetWithPublicMethods), nameof (DataFlowTypeExtensions.RequiresAll), CompilerGeneratedCode = true)] + static IEnumerable ReturnManyObjects () + { + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + Type t = GetWithPublicMethods (); + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + yield return new object[] { 1, 2, new object[] { 1, 2 }, new object[] { 1, 2 } }; + t.RequiresAll (); + } + public static void Test () { FlowAcrossYieldReturn ().GetEnumerator ().MoveNext (); // Has to call MoveNext otherwise AOT will actually remove it @@ -103,6 +210,8 @@ public static void Test () FlowParameterAcrossYieldReturn (); FlowUnannotatedParameterAcrossYieldReturn (); FlowAcrossYieldReturnWithBackwardsBranch (); + + foreach (var o in ReturnManyObjects ()); } }