Skip to content

Commit

Permalink
Add test for dotnet/runtime#73048 (#2977)
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
MichalStrehovsky committed Aug 17, 2022
1 parent 6252a21 commit c42e3cb
Showing 1 changed file with 109 additions and 0 deletions.
109 changes: 109 additions & 0 deletions test/Mono.Linker.Tests.Cases/DataFlow/CompilerGeneratedCodeDataflow.cs
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,113 @@ static IEnumerable<int> FlowAcrossYieldReturnWithBackwardsBranch (int n = 0)
}
}

[ExpectedWarning ("IL2072", nameof (GetWithPublicMethods), nameof (DataFlowTypeExtensions.RequiresAll), CompilerGeneratedCode = true)]
static IEnumerable<object[]> 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
Expand All @@ -103,6 +210,8 @@ public static void Test ()
FlowParameterAcrossYieldReturn ();
FlowUnannotatedParameterAcrossYieldReturn ();
FlowAcrossYieldReturnWithBackwardsBranch ();

foreach (var o in ReturnManyObjects ());
}
}

Expand Down

0 comments on commit c42e3cb

Please sign in to comment.