/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenAsyncLocalsTests.cs
2 186 строк
84 KB
Copilot
Implement runtime async support for dynamic (#83713)
04 июн 2026, 03:14
Не верифицирован
04 июн 2026, 03:14
563c933
Код
Авторство
О чём код?
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. #nullable disable using System; using System.Collections.Generic; using System.Linq; using Microsoft.CodeAnalysis.CSharp.Symbols; using Microsoft.CodeAnalysis.CSharp.Test.Utilities; using Microsoft.CodeAnalysis.Test.Utilities; using Roslyn.Test.Utilities; using Roslyn.Utilities; using Xunit; namespace Microsoft.CodeAnalysis.CSharp.UnitTests.CodeGen { [CompilerTrait(CompilerFeature.Async)] public class CodeGenAsyncLocalsTests : EmitMetadataTestBase { private static readonly MetadataReference[] s_asyncRefs = new[] { MscorlibRef_v4_0_30316_17626, SystemRef_v4_0_30319_17929, SystemCoreRef_v4_0_30319_17929 }; public CodeGenAsyncLocalsTests() { } private CompilationVerifier CompileAndVerify(string source, string expectedOutput = null, IEnumerable<MetadataReference> references = null, CSharpCompilationOptions options = null, Verification verify = default) { references = (references != null) ? references.Concat(s_asyncRefs) : s_asyncRefs; return base.CompileAndVerify(source, targetFramework: TargetFramework.Empty, expectedOutput: expectedOutput, references: references, options: options, verify: verify); } private string GetFieldLoadsAndStores(CompilationVerifier c, string qualifiedMethodName) { var actualLines = c.VisualizeIL(qualifiedMethodName).Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); return string.Join(Environment.NewLine, from pair in actualLines.Zip(actualLines.Skip(1), (line1, line2) => new { line1, line2 }) where pair.line2.Contains("ldfld") || pair.line2.Contains("stfld") select pair.line1.Trim() + Environment.NewLine + pair.line2.Trim()); } [Fact] public void AsyncWithLocals() { var source = @" using System; using System.Threading.Tasks; class Test { public static async Task<int> F(int x) { return await Task.Factory.StartNew(() => { return x; }); } public static async Task<int> G(int x) { int c = 0; await F(x); c += x; await F(x); c += x; return c; } public static void Main() { Task<int> t = G(21); t.Wait(1000 * 60); Console.WriteLine(t.Result); } }"; var expected = @" 42 "; CompileAndVerify(source, expectedOutput: expected); } [Fact] [WorkItem(13867, "https://github.com/dotnet/roslyn/issues/13867")] public void AsyncWithLotsLocals() { var source = @" using System; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { static void Main() { DoItAsync().Wait(); } public static async Task DoItAsync() { var var1 = 0; var var2 = 0; var var3 = 0; var var4 = 0; var var5 = 0; var var6 = 0; var var7 = 0; var var8 = 0; var var9 = 0; var var10 = 0; var var11 = 0; var var12 = 0; var var13 = 0; var var14 = 0; var var15 = 0; var var16 = 0; var var17 = 0; var var18 = 0; var var19 = 0; var var20 = 0; var var21 = 0; var var22 = 0; var var23 = 0; var var24 = 0; var var25 = 0; var var26 = 0; var var27 = 0; var var28 = 0; var var29 = 0; var var30 = 0; var var31 = 0; string s; if (true) { s = ""a""; await Task.Yield(); } else { s = ""b""; } Console.WriteLine(s ?? ""null""); // should be ""a"" always, somehow is ""null"" } } }"; var expected = @" a "; CompileAndVerify(source, options: TestOptions.ReleaseExe, expectedOutput: expected); CompileAndVerify(source, options: TestOptions.DebugExe, expectedOutput: expected); } [Fact] public void AsyncWithParam() { var source = @" using System; using System.Threading.Tasks; class Test { public static async Task<int> G(int x) { await Task.Factory.StartNew(() => { return x; }); x += 21; await Task.Factory.StartNew(() => { return x; }); x += 21; return x; } public static void Main() { Task<int> t = G(0); t.Wait(1000 * 60); Console.WriteLine(t.Result); } }"; var expected = @" 42 "; CompileAndVerify(source, expectedOutput: expected); } [Fact] public void AsyncWithParamsAndLocals_Unhoisted() { var source = @" using System; using System.Threading.Tasks; class Test { public static async Task<int> F(int x) { return await Task.Factory.StartNew(() => { return x; }); } public static async Task<int> G(int x) { int c = 0; c = await F(x); return c; } public static void Main() { Task<int> t = G(21); t.Wait(1000 * 60); Console.WriteLine(t.Result); } }"; var expected = @" 21 "; CompileAndVerify(source, expectedOutput: expected); } [Fact] public void HoistedParameters() { var source = @" using System; using System.Threading.Tasks; class C { public static Task<int> G() => null; public static async Task M(int x, int y, int z) { x = z; await G(); y = 1; } }"; CompileAndVerify(source, options: TestOptions.ReleaseDll.WithMetadataImportOptions(MetadataImportOptions.All), symbolValidator: module => { AssertEx.Equal(new[] { "<>1__state", "<>t__builder", "x", "z", "y", "<>u__1", }, module.GetFieldNames("C.<M>d__1")); }); CompileAndVerify(source, options: TestOptions.DebugDll.WithMetadataImportOptions(MetadataImportOptions.All), symbolValidator: module => { AssertEx.Equal(new[] { "<>1__state", "<>t__builder", "x", "y", "z", "<>u__1", }, module.GetFieldNames("C.<M>d__1")); }); } [Fact] public void SynthesizedVariables1() { var source = @" using System; using System.Threading.Tasks; class C { public static Task<int> H() => null; public static Task<int> G(int a, int b, int c) => null; public static int F(int a) => 1; public async Task M(IDisposable disposable) { foreach (var item in new[] { 1, 2, 3 }) { using (disposable) { await H(); } } foreach (var item in new[] { 1, 2, 3 }) { } using (disposable) { await H(); } if (disposable != null) { using (disposable) { await G(F(1), F(2), await G(F(3), F(4), await H())); } } using (disposable) { await H(); } if (disposable != null) { using (disposable) { } } lock (this) { } } }"; CompileAndVerify(source, options: TestOptions.ReleaseDll.WithMetadataImportOptions(MetadataImportOptions.All), symbolValidator: module => { AssertEx.Equal(new[] { "<>1__state", "<>t__builder", "disposable", "<>4__this", "<>7__wrap1", "<>7__wrap2", "<>7__wrap3", "<>u__1", "<>7__wrap4", "<>7__wrap5", "<>7__wrap6", }, module.GetFieldNames("C.<M>d__3")); }); var vd = CompileAndVerify(source, options: TestOptions.DebugDll.WithMetadataImportOptions(MetadataImportOptions.All), symbolValidator: module => { AssertEx.Equal(new[] { "<>1__state", "<>t__builder", "disposable", "<>4__this", "<>s__1", "<>s__2", "<item>5__3", "<>s__4", "<>s__5", "<>s__6", "<item>5__7", "<>s__8", "<>s__9", "<>s__10", "<>s__11", "<>s__12", "<>s__13", "<>s__14", "<>s__15", "<>s__16", "<>s__17", "<>s__18", "<>s__19", "<>u__1", }, module.GetFieldNames("C.<M>d__3")); }); if (ExecutionConditionUtil.IsWindows) { vd.VerifyPdb("C.M", @" <symbols> <methods> <method containingType=""C"" name=""M"" parameterNames=""disposable""> <customDebugInfo> <forwardIterator name=""<M>d__3"" /> <encLocalSlotMap> <slot kind=""6"" offset=""11"" /> <slot kind=""8"" offset=""11"" /> <slot kind=""0"" offset=""11"" /> <slot kind=""4"" offset=""53"" /> <slot kind=""6"" offset=""98"" /> <slot kind=""8"" offset=""98"" /> <slot kind=""0"" offset=""98"" /> <slot kind=""4"" offset=""151"" /> <slot kind=""4"" offset=""220"" /> <slot kind=""28"" offset=""261"" /> <slot kind=""28"" offset=""261"" ordinal=""1"" /> <slot kind=""28"" offset=""261"" ordinal=""2"" /> <slot kind=""28"" offset=""281"" /> <slot kind=""28"" offset=""281"" ordinal=""1"" /> <slot kind=""28"" offset=""281"" ordinal=""2"" /> <slot kind=""4"" offset=""307"" /> <slot kind=""4"" offset=""376"" /> <slot kind=""3"" offset=""410"" /> <slot kind=""2"" offset=""410"" /> </encLocalSlotMap> <encStateMachineStateMap> <state number=""0"" offset=""74"" /> <state number=""1"" offset=""172"" /> <state number=""4"" offset=""241"" /> <state number=""3"" offset=""261"" /> <state number=""2"" offset=""281"" /> <state number=""5"" offset=""328"" /> </encStateMachineStateMap> </customDebugInfo> </method> </methods> </symbols> ", options: PdbValidationOptions.ExcludeDocuments); } } [Fact] public void CaptureThis() { var source = @" using System.Threading; using System.Threading.Tasks; using System; struct TestCase { public async Task<int> Run() { return await Goo(); } public async Task<int> Goo() { return await Task.Factory.StartNew(() => 42); } } class Driver { static void Main() { var t = new TestCase(); var task = t.Run(); task.Wait(); Console.WriteLine(task.Result); } }"; var expected = @" 42 "; CompileAndVerify(source, expected); } [Fact] public void CaptureThis2() { var source = @" using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using System; struct TestCase { public IEnumerable<int> Run() { yield return Goo(); } public int Goo() { return 42; } } class Driver { static void Main() { var t = new TestCase(); foreach (var x in t.Run()) { Console.WriteLine(x); } } }"; var expected = @" 42 "; CompileAndVerify(source, expected); } [Fact] public void AsyncWithDynamic() { var source = @" using System; using System.Threading.Tasks; class Test { public static async Task<int> F(dynamic t) { return await t; } public static void Main() { Task<int> t = F(Task.Factory.StartNew(() => { return 42; })); t.Wait(1000 * 60); Console.WriteLine(t.Result); } }"; var expected = @" 42 "; CompileAndVerify(source, expectedOutput: expected, references: new[] { CSharpRef }); var comp = CreateRuntimeAsyncCompilation(source, TestOptions.ReleaseExe); CompileAndVerify(comp, expectedOutput: RuntimeAsyncTestHelpers.ExpectedOutput(expected), verify: Verification.Fails); } [Fact] public void AsyncWithThisRef() { var source = @" using System; using System.Threading.Tasks; class C { int x = 42; public async Task<int> F() { int c = this.x; return await Task.Factory.StartNew(() => c); } } class Test { public static void Main() { Task<int> t = new C().F(); t.Wait(1000 * 60); Console.WriteLine(t.Result); } }"; var expected = @" 42 "; var verifier = CompileAndVerify(source, expectedOutput: expected); verifier.VerifyIL("C.<F>d__1.System.Runtime.CompilerServices.IAsyncStateMachine.MoveNext()", @" { // Code size 191 (0xbf) .maxstack 3 .locals init (int V_0, C V_1, int V_2, C.<>c__DisplayClass1_0 V_3, //CS$<>8__locals0 System.Runtime.CompilerServices.TaskAwaiter<int> V_4, System.Exception V_5) IL_0000: ldarg.0 IL_0001: ldfld ""int C.<F>d__1.<>1__state"" IL_0006: stloc.0 IL_0007: ldarg.0 IL_0008: ldfld ""C C.<F>d__1.<>4__this"" IL_000d: stloc.1 .try { IL_000e: ldloc.0 IL_000f: brfalse.s IL_006a IL_0011: newobj ""C.<>c__DisplayClass1_0..ctor()"" IL_0016: stloc.3 IL_0017: ldloc.3 IL_0018: ldloc.1 IL_0019: ldfld ""int C.x"" IL_001e: stfld ""int C.<>c__DisplayClass1_0.c"" IL_0023: call ""System.Threading.Tasks.TaskFactory System.Threading.Tasks.Task.Factory.get"" IL_0028: ldloc.3 IL_0029: ldftn ""int C.<>c__DisplayClass1_0.<F>b__0()"" IL_002f: newobj ""System.Func<int>..ctor(object, System.IntPtr)"" IL_0034: callvirt ""System.Threading.Tasks.Task<int> System.Threading.Tasks.TaskFactory.StartNew<int>(System.Func<int>)"" IL_0039: callvirt ""System.Runtime.CompilerServices.TaskAwaiter<int> System.Threading.Tasks.Task<int>.GetAwaiter()"" IL_003e: stloc.s V_4 IL_0040: ldloca.s V_4 IL_0042: call ""bool System.Runtime.CompilerServices.TaskAwaiter<int>.IsCompleted.get"" IL_0047: brtrue.s IL_0087 IL_0049: ldarg.0 IL_004a: ldc.i4.0 IL_004b: dup IL_004c: stloc.0 IL_004d: stfld ""int C.<F>d__1.<>1__state"" IL_0052: ldarg.0 IL_0053: ldloc.s V_4 IL_0055: stfld ""System.Runtime.CompilerServices.TaskAwaiter<int> C.<F>d__1.<>u__1"" IL_005a: ldarg.0 IL_005b: ldflda ""System.Runtime.CompilerServices.AsyncTaskMethodBuilder<int> C.<F>d__1.<>t__builder"" IL_0060: ldloca.s V_4 IL_0062: ldarg.0 IL_0063: call ""void System.Runtime.CompilerServices.AsyncTaskMethodBuilder<int>.AwaitUnsafeOnCompleted<System.Runtime.CompilerServices.TaskAwaiter<int>, C.<F>d__1>(ref System.Runtime.CompilerServices.TaskAwaiter<int>, ref C.<F>d__1)"" IL_0068: leave.s IL_00be IL_006a: ldarg.0 IL_006b: ldfld ""System.Runtime.CompilerServices.TaskAwaiter<int> C.<F>d__1.<>u__1"" IL_0070: stloc.s V_4 IL_0072: ldarg.0 IL_0073: ldflda ""System.Runtime.CompilerServices.TaskAwaiter<int> C.<F>d__1.<>u__1"" IL_0078: initobj ""System.Runtime.CompilerServices.TaskAwaiter<int>"" IL_007e: ldarg.0 IL_007f: ldc.i4.m1 IL_0080: dup IL_0081: stloc.0 IL_0082: stfld ""int C.<F>d__1.<>1__state"" IL_0087: ldloca.s V_4 IL_0089: call ""int System.Runtime.CompilerServices.TaskAwaiter<int>.GetResult()"" IL_008e: stloc.2 IL_008f: leave.s IL_00aa } catch System.Exception { IL_0091: stloc.s V_5 IL_0093: ldarg.0 IL_0094: ldc.i4.s -2 IL_0096: stfld ""int C.<F>d__1.<>1__state"" IL_009b: ldarg.0 IL_009c: ldflda ""System.Runtime.CompilerServices.AsyncTaskMethodBuilder<int> C.<F>d__1.<>t__builder"" IL_00a1: ldloc.s V_5 IL_00a3: call ""void System.Runtime.CompilerServices.AsyncTaskMethodBuilder<int>.SetException(System.Exception)"" IL_00a8: leave.s IL_00be } IL_00aa: ldarg.0 IL_00ab: ldc.i4.s -2 IL_00ad: stfld ""int C.<F>d__1.<>1__state"" IL_00b2: ldarg.0 IL_00b3: ldflda ""System.Runtime.CompilerServices.AsyncTaskMethodBuilder<int> C.<F>d__1.<>t__builder"" IL_00b8: ldloc.2 IL_00b9: call ""void System.Runtime.CompilerServices.AsyncTaskMethodBuilder<int>.SetResult(int)"" IL_00be: ret } "); } [Fact] public void AsyncWithThisRef01() { var source = @" using System; using System.Threading.Tasks; class C { int x => 14; public async Task<int> F() { int c = this.x; await Task.Yield(); c += this.x; await Task.Yield(); c += this.x; await Task.Yield(); await Task.Yield(); await Task.Yield(); return c; } } class Test { public static void Main() { Task<int> t = new C().F(); t.Wait(1000 * 60); Console.WriteLine(t.Result); } }"; var expected = @" 42 "; var verifier = CompileAndVerify(source, expectedOutput: expected); verifier.VerifyIL("C.<F>d__2.System.Runtime.CompilerServices.IAsyncStateMachine.MoveNext()", @" { // Code size 612 (0x264) .maxstack 3 .locals init (int V_0, C V_1, int V_2, System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter V_3, System.Runtime.CompilerServices.YieldAwaitable V_4, System.Exception V_5) IL_0000: ldarg.0 IL_0001: ldfld ""int C.<F>d__2.<>1__state"" IL_0006: stloc.0 IL_0007: ldarg.0 IL_0008: ldfld ""C C.<F>d__2.<>4__this"" IL_000d: stloc.1 .try { IL_000e: ldloc.0 IL_000f: switch ( IL_006f, IL_00e0, IL_0151, IL_01af, IL_020a) IL_0028: ldarg.0 IL_0029: ldloc.1 IL_002a: call ""int C.x.get"" IL_002f: stfld ""int C.<F>d__2.<c>5__2"" IL_0034: call ""System.Runtime.CompilerServices.YieldAwaitable System.Threading.Tasks.Task.Yield()"" IL_0039: stloc.s V_4 IL_003b: ldloca.s V_4 IL_003d: call ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter System.Runtime.CompilerServices.YieldAwaitable.GetAwaiter()"" IL_0042: stloc.3 IL_0043: ldloca.s V_3 IL_0045: call ""bool System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter.IsCompleted.get"" IL_004a: brtrue.s IL_008b IL_004c: ldarg.0 IL_004d: ldc.i4.0 IL_004e: dup IL_004f: stloc.0 IL_0050: stfld ""int C.<F>d__2.<>1__state"" IL_0055: ldarg.0 IL_0056: ldloc.3 IL_0057: stfld ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter C.<F>d__2.<>u__1"" IL_005c: ldarg.0 IL_005d: ldflda ""System.Runtime.CompilerServices.AsyncTaskMethodBuilder<int> C.<F>d__2.<>t__builder"" IL_0062: ldloca.s V_3 IL_0064: ldarg.0 IL_0065: call ""void System.Runtime.CompilerServices.AsyncTaskMethodBuilder<int>.AwaitUnsafeOnCompleted<System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter, C.<F>d__2>(ref System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter, ref C.<F>d__2)"" IL_006a: leave IL_0263 IL_006f: ldarg.0 IL_0070: ldfld ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter C.<F>d__2.<>u__1"" IL_0075: stloc.3 IL_0076: ldarg.0 IL_0077: ldflda ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter C.<F>d__2.<>u__1"" IL_007c: initobj ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter"" IL_0082: ldarg.0 IL_0083: ldc.i4.m1 IL_0084: dup IL_0085: stloc.0 IL_0086: stfld ""int C.<F>d__2.<>1__state"" IL_008b: ldloca.s V_3 IL_008d: call ""void System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter.GetResult()"" IL_0092: ldarg.0 IL_0093: ldarg.0 IL_0094: ldfld ""int C.<F>d__2.<c>5__2"" IL_0099: ldloc.1 IL_009a: call ""int C.x.get"" IL_009f: add IL_00a0: stfld ""int C.<F>d__2.<c>5__2"" IL_00a5: call ""System.Runtime.CompilerServices.YieldAwaitable System.Threading.Tasks.Task.Yield()"" IL_00aa: stloc.s V_4 IL_00ac: ldloca.s V_4 IL_00ae: call ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter System.Runtime.CompilerServices.YieldAwaitable.GetAwaiter()"" IL_00b3: stloc.3 IL_00b4: ldloca.s V_3 IL_00b6: call ""bool System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter.IsCompleted.get"" IL_00bb: brtrue.s IL_00fc IL_00bd: ldarg.0 IL_00be: ldc.i4.1 IL_00bf: dup IL_00c0: stloc.0 IL_00c1: stfld ""int C.<F>d__2.<>1__state"" IL_00c6: ldarg.0 IL_00c7: ldloc.3 IL_00c8: stfld ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter C.<F>d__2.<>u__1"" IL_00cd: ldarg.0 IL_00ce: ldflda ""System.Runtime.CompilerServices.AsyncTaskMethodBuilder<int> C.<F>d__2.<>t__builder"" IL_00d3: ldloca.s V_3 IL_00d5: ldarg.0 IL_00d6: call ""void System.Runtime.CompilerServices.AsyncTaskMethodBuilder<int>.AwaitUnsafeOnCompleted<System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter, C.<F>d__2>(ref System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter, ref C.<F>d__2)"" IL_00db: leave IL_0263 IL_00e0: ldarg.0 IL_00e1: ldfld ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter C.<F>d__2.<>u__1"" IL_00e6: stloc.3 IL_00e7: ldarg.0 IL_00e8: ldflda ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter C.<F>d__2.<>u__1"" IL_00ed: initobj ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter"" IL_00f3: ldarg.0 IL_00f4: ldc.i4.m1 IL_00f5: dup IL_00f6: stloc.0 IL_00f7: stfld ""int C.<F>d__2.<>1__state"" IL_00fc: ldloca.s V_3 IL_00fe: call ""void System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter.GetResult()"" IL_0103: ldarg.0 IL_0104: ldarg.0 IL_0105: ldfld ""int C.<F>d__2.<c>5__2"" IL_010a: ldloc.1 IL_010b: call ""int C.x.get"" IL_0110: add IL_0111: stfld ""int C.<F>d__2.<c>5__2"" IL_0116: call ""System.Runtime.CompilerServices.YieldAwaitable System.Threading.Tasks.Task.Yield()"" IL_011b: stloc.s V_4 IL_011d: ldloca.s V_4 IL_011f: call ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter System.Runtime.CompilerServices.YieldAwaitable.GetAwaiter()"" IL_0124: stloc.3 IL_0125: ldloca.s V_3 IL_0127: call ""bool System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter.IsCompleted.get"" IL_012c: brtrue.s IL_016d IL_012e: ldarg.0 IL_012f: ldc.i4.2 IL_0130: dup IL_0131: stloc.0 IL_0132: stfld ""int C.<F>d__2.<>1__state"" IL_0137: ldarg.0 IL_0138: ldloc.3 IL_0139: stfld ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter C.<F>d__2.<>u__1"" IL_013e: ldarg.0 IL_013f: ldflda ""System.Runtime.CompilerServices.AsyncTaskMethodBuilder<int> C.<F>d__2.<>t__builder"" IL_0144: ldloca.s V_3 IL_0146: ldarg.0 IL_0147: call ""void System.Runtime.CompilerServices.AsyncTaskMethodBuilder<int>.AwaitUnsafeOnCompleted<System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter, C.<F>d__2>(ref System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter, ref C.<F>d__2)"" IL_014c: leave IL_0263 IL_0151: ldarg.0 IL_0152: ldfld ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter C.<F>d__2.<>u__1"" IL_0157: stloc.3 IL_0158: ldarg.0 IL_0159: ldflda ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter C.<F>d__2.<>u__1"" IL_015e: initobj ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter"" IL_0164: ldarg.0 IL_0165: ldc.i4.m1 IL_0166: dup IL_0167: stloc.0 IL_0168: stfld ""int C.<F>d__2.<>1__state"" IL_016d: ldloca.s V_3 IL_016f: call ""void System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter.GetResult()"" IL_0174: call ""System.Runtime.CompilerServices.YieldAwaitable System.Threading.Tasks.Task.Yield()"" IL_0179: stloc.s V_4 IL_017b: ldloca.s V_4 IL_017d: call ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter System.Runtime.CompilerServices.YieldAwaitable.GetAwaiter()"" IL_0182: stloc.3 IL_0183: ldloca.s V_3 IL_0185: call ""bool System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter.IsCompleted.get"" IL_018a: brtrue.s IL_01cb IL_018c: ldarg.0 IL_018d: ldc.i4.3 IL_018e: dup IL_018f: stloc.0 IL_0190: stfld ""int C.<F>d__2.<>1__state"" IL_0195: ldarg.0 IL_0196: ldloc.3 IL_0197: stfld ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter C.<F>d__2.<>u__1"" IL_019c: ldarg.0 IL_019d: ldflda ""System.Runtime.CompilerServices.AsyncTaskMethodBuilder<int> C.<F>d__2.<>t__builder"" IL_01a2: ldloca.s V_3 IL_01a4: ldarg.0 IL_01a5: call ""void System.Runtime.CompilerServices.AsyncTaskMethodBuilder<int>.AwaitUnsafeOnCompleted<System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter, C.<F>d__2>(ref System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter, ref C.<F>d__2)"" IL_01aa: leave IL_0263 IL_01af: ldarg.0 IL_01b0: ldfld ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter C.<F>d__2.<>u__1"" IL_01b5: stloc.3 IL_01b6: ldarg.0 IL_01b7: ldflda ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter C.<F>d__2.<>u__1"" IL_01bc: initobj ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter"" IL_01c2: ldarg.0 IL_01c3: ldc.i4.m1 IL_01c4: dup IL_01c5: stloc.0 IL_01c6: stfld ""int C.<F>d__2.<>1__state"" IL_01cb: ldloca.s V_3 IL_01cd: call ""void System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter.GetResult()"" IL_01d2: call ""System.Runtime.CompilerServices.YieldAwaitable System.Threading.Tasks.Task.Yield()"" IL_01d7: stloc.s V_4 IL_01d9: ldloca.s V_4 IL_01db: call ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter System.Runtime.CompilerServices.YieldAwaitable.GetAwaiter()"" IL_01e0: stloc.3 IL_01e1: ldloca.s V_3 IL_01e3: call ""bool System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter.IsCompleted.get"" IL_01e8: brtrue.s IL_0226 IL_01ea: ldarg.0 IL_01eb: ldc.i4.4 IL_01ec: dup IL_01ed: stloc.0 IL_01ee: stfld ""int C.<F>d__2.<>1__state"" IL_01f3: ldarg.0 IL_01f4: ldloc.3 IL_01f5: stfld ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter C.<F>d__2.<>u__1"" IL_01fa: ldarg.0 IL_01fb: ldflda ""System.Runtime.CompilerServices.AsyncTaskMethodBuilder<int> C.<F>d__2.<>t__builder"" IL_0200: ldloca.s V_3 IL_0202: ldarg.0 IL_0203: call ""void System.Runtime.CompilerServices.AsyncTaskMethodBuilder<int>.AwaitUnsafeOnCompleted<System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter, C.<F>d__2>(ref System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter, ref C.<F>d__2)"" IL_0208: leave.s IL_0263 IL_020a: ldarg.0 IL_020b: ldfld ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter C.<F>d__2.<>u__1"" IL_0210: stloc.3 IL_0211: ldarg.0 IL_0212: ldflda ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter C.<F>d__2.<>u__1"" IL_0217: initobj ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter"" IL_021d: ldarg.0 IL_021e: ldc.i4.m1 IL_021f: dup IL_0220: stloc.0 IL_0221: stfld ""int C.<F>d__2.<>1__state"" IL_0226: ldloca.s V_3 IL_0228: call ""void System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter.GetResult()"" IL_022d: ldarg.0 IL_022e: ldfld ""int C.<F>d__2.<c>5__2"" IL_0233: stloc.2 IL_0234: leave.s IL_024f } catch System.Exception { IL_0236: stloc.s V_5 IL_0238: ldarg.0 IL_0239: ldc.i4.s -2 IL_023b: stfld ""int C.<F>d__2.<>1__state"" IL_0240: ldarg.0 IL_0241: ldflda ""System.Runtime.CompilerServices.AsyncTaskMethodBuilder<int> C.<F>d__2.<>t__builder"" IL_0246: ldloc.s V_5 IL_0248: call ""void System.Runtime.CompilerServices.AsyncTaskMethodBuilder<int>.SetException(System.Exception)"" IL_024d: leave.s IL_0263 } IL_024f: ldarg.0 IL_0250: ldc.i4.s -2 IL_0252: stfld ""int C.<F>d__2.<>1__state"" IL_0257: ldarg.0 IL_0258: ldflda ""System.Runtime.CompilerServices.AsyncTaskMethodBuilder<int> C.<F>d__2.<>t__builder"" IL_025d: ldloc.2 IL_025e: call ""void System.Runtime.CompilerServices.AsyncTaskMethodBuilder<int>.SetResult(int)"" IL_0263: ret } "); } [Fact] public void AsyncWithBaseRef() { var source = @" using System; using System.Threading.Tasks; class B { protected int x = 42; } class C : B { public async Task<int> F() { int c = base.x; return await Task.Factory.StartNew(() => c); } } class Test { public static void Main() { Task<int> t = new C().F(); t.Wait(1000 * 60); Console.WriteLine(t.Result); } }"; var expected = @" 42 "; CompileAndVerify(source, expectedOutput: expected); } [Fact] public void ReuseFields_SpillTemps() { var source = @" using System.Threading.Tasks; class Test { static void F1(int x, int y) { } async static Task<int> F2() { return await Task.Factory.StartNew(() => 42); } public static async void Run() { int x = 1; F1(x, await F2()); int y = 2; F1(y, await F2()); int z = 3; F1(z, await F2()); } public static void Main() { Run(); } }"; var reference = CreateCompilationWithMscorlib461(source, references: new MetadataReference[] { SystemRef_v4_0_30319_17929 }).EmitToImageReference(); var comp = CreateCompilationWithMscorlib461("", new[] { reference }, options: TestOptions.ReleaseDll.WithMetadataImportOptions(MetadataImportOptions.Internal)); var testClass = comp.GlobalNamespace.GetMember<NamedTypeSymbol>("Test"); var stateMachineClass = (NamedTypeSymbol)testClass.GetMembers().Single(s => s.Name.StartsWith("<Run>", StringComparison.Ordinal)); IEnumerable<IGrouping<TypeSymbol, FieldSymbol>> spillFieldsByType = stateMachineClass.GetMembers().Where(m => m.Kind == SymbolKind.Field && m.Name.StartsWith("<>7__wrap", StringComparison.Ordinal)).Cast<FieldSymbol>().GroupBy(x => x.Type); Assert.Equal(1, spillFieldsByType.Count()); Assert.Equal(1, spillFieldsByType.Single(x => TypeSymbol.Equals(x.Key, comp.GetSpecialType(SpecialType.System_Int32), TypeCompareKind.ConsiderEverything2)).Count()); } [Fact] public void ReuseFields_Generic() { var source = @" using System.Collections.Generic; using System.Threading.Tasks; class Test<U> { static IEnumerable<T> GetEnum<T>() => null; static Task<int> F(int a) => null; public static async void M<S, T>() { foreach (var x in GetEnum<T>()) await F(1); foreach (var x in GetEnum<S>()) await F(2); foreach (var x in GetEnum<T>()) await F(3); foreach (var x in GetEnum<U>()) await F(4); foreach (var x in GetEnum<U>()) await F(5); } }"; var c = CompileAndVerify(source, expectedOutput: null, options: TestOptions.ReleaseDll); var actual = GetFieldLoadsAndStores(c, "Test<U>.<M>d__2<S, T>.System.Runtime.CompilerServices.IAsyncStateMachine.MoveNext"); // make sure we are reusing synthesized iterator locals and that the locals are nulled: AssertEx.AssertEqualToleratingWhitespaceDifferences(@" IL_0000: ldarg.0 IL_0001: ldfld ""int Test<U>.<M>d__2<S, T>.<>1__state"" IL_0027: callvirt ""System.Collections.Generic.IEnumerator<T> System.Collections.Generic.IEnumerable<T>.GetEnumerator()"" IL_002c: stfld ""System.Collections.Generic.IEnumerator<T> Test<U>.<M>d__2<S, T>.<>7__wrap1"" IL_0037: ldarg.0 IL_0038: ldfld ""System.Collections.Generic.IEnumerator<T> Test<U>.<M>d__2<S, T>.<>7__wrap1"" IL_005b: stloc.0 IL_005c: stfld ""int Test<U>.<M>d__2<S, T>.<>1__state"" IL_0062: ldloc.1 IL_0063: stfld ""System.Runtime.CompilerServices.TaskAwaiter<int> Test<U>.<M>d__2<S, T>.<>u__1"" IL_0068: ldarg.0 IL_0069: ldflda ""System.Runtime.CompilerServices.AsyncVoidMethodBuilder Test<U>.<M>d__2<S, T>.<>t__builder"" IL_007b: ldarg.0 IL_007c: ldfld ""System.Runtime.CompilerServices.TaskAwaiter<int> Test<U>.<M>d__2<S, T>.<>u__1"" IL_0082: ldarg.0 IL_0083: ldflda ""System.Runtime.CompilerServices.TaskAwaiter<int> Test<U>.<M>d__2<S, T>.<>u__1"" IL_0091: stloc.0 IL_0092: stfld ""int Test<U>.<M>d__2<S, T>.<>1__state"" IL_009f: ldarg.0 IL_00a0: ldfld ""System.Collections.Generic.IEnumerator<T> Test<U>.<M>d__2<S, T>.<>7__wrap1"" IL_00b2: ldarg.0 IL_00b3: ldfld ""System.Collections.Generic.IEnumerator<T> Test<U>.<M>d__2<S, T>.<>7__wrap1"" IL_00ba: ldarg.0 IL_00bb: ldfld ""System.Collections.Generic.IEnumerator<T> Test<U>.<M>d__2<S, T>.<>7__wrap1"" IL_00c7: ldnull IL_00c8: stfld ""System.Collections.Generic.IEnumerator<T> Test<U>.<M>d__2<S, T>.<>7__wrap1"" IL_00d3: callvirt ""System.Collections.Generic.IEnumerator<S> System.Collections.Generic.IEnumerable<S>.GetEnumerator()"" IL_00d8: stfld ""System.Collections.Generic.IEnumerator<S> Test<U>.<M>d__2<S, T>.<>7__wrap2"" IL_00e4: ldarg.0 IL_00e5: ldfld ""System.Collections.Generic.IEnumerator<S> Test<U>.<M>d__2<S, T>.<>7__wrap2"" IL_0108: stloc.0 IL_0109: stfld ""int Test<U>.<M>d__2<S, T>.<>1__state"" IL_010f: ldloc.1 IL_0110: stfld ""System.Runtime.CompilerServices.TaskAwaiter<int> Test<U>.<M>d__2<S, T>.<>u__1"" IL_0115: ldarg.0 IL_0116: ldflda ""System.Runtime.CompilerServices.AsyncVoidMethodBuilder Test<U>.<M>d__2<S, T>.<>t__builder"" IL_0128: ldarg.0 IL_0129: ldfld ""System.Runtime.CompilerServices.TaskAwaiter<int> Test<U>.<M>d__2<S, T>.<>u__1"" IL_012f: ldarg.0 IL_0130: ldflda ""System.Runtime.CompilerServices.TaskAwaiter<int> Test<U>.<M>d__2<S, T>.<>u__1"" IL_013e: stloc.0 IL_013f: stfld ""int Test<U>.<M>d__2<S, T>.<>1__state"" IL_014c: ldarg.0 IL_014d: ldfld ""System.Collections.Generic.IEnumerator<S> Test<U>.<M>d__2<S, T>.<>7__wrap2"" IL_015f: ldarg.0 IL_0160: ldfld ""System.Collections.Generic.IEnumerator<S> Test<U>.<M>d__2<S, T>.<>7__wrap2"" IL_0167: ldarg.0 IL_0168: ldfld ""System.Collections.Generic.IEnumerator<S> Test<U>.<M>d__2<S, T>.<>7__wrap2"" IL_0174: ldnull IL_0175: stfld ""System.Collections.Generic.IEnumerator<S> Test<U>.<M>d__2<S, T>.<>7__wrap2"" IL_0180: callvirt ""System.Collections.Generic.IEnumerator<T> System.Collections.Generic.IEnumerable<T>.GetEnumerator()"" IL_0185: stfld ""System.Collections.Generic.IEnumerator<T> Test<U>.<M>d__2<S, T>.<>7__wrap1"" IL_0191: ldarg.0 IL_0192: ldfld ""System.Collections.Generic.IEnumerator<T> Test<U>.<M>d__2<S, T>.<>7__wrap1"" IL_01b5: stloc.0 IL_01b6: stfld ""int Test<U>.<M>d__2<S, T>.<>1__state"" IL_01bc: ldloc.1 IL_01bd: stfld ""System.Runtime.CompilerServices.TaskAwaiter<int> Test<U>.<M>d__2<S, T>.<>u__1"" IL_01c2: ldarg.0 IL_01c3: ldflda ""System.Runtime.CompilerServices.AsyncVoidMethodBuilder Test<U>.<M>d__2<S, T>.<>t__builder"" IL_01d5: ldarg.0 IL_01d6: ldfld ""System.Runtime.CompilerServices.TaskAwaiter<int> Test<U>.<M>d__2<S, T>.<>u__1"" IL_01dc: ldarg.0 IL_01dd: ldflda ""System.Runtime.CompilerServices.TaskAwaiter<int> Test<U>.<M>d__2<S, T>.<>u__1"" IL_01eb: stloc.0 IL_01ec: stfld ""int Test<U>.<M>d__2<S, T>.<>1__state"" IL_01f9: ldarg.0 IL_01fa: ldfld ""System.Collections.Generic.IEnumerator<T> Test<U>.<M>d__2<S, T>.<>7__wrap1"" IL_020c: ldarg.0 IL_020d: ldfld ""System.Collections.Generic.IEnumerator<T> Test<U>.<M>d__2<S, T>.<>7__wrap1"" IL_0214: ldarg.0 IL_0215: ldfld ""System.Collections.Generic.IEnumerator<T> Test<U>.<M>d__2<S, T>.<>7__wrap1"" IL_0221: ldnull IL_0222: stfld ""System.Collections.Generic.IEnumerator<T> Test<U>.<M>d__2<S, T>.<>7__wrap1"" IL_022d: callvirt ""System.Collections.Generic.IEnumerator<U> System.Collections.Generic.IEnumerable<U>.GetEnumerator()"" IL_0232: stfld ""System.Collections.Generic.IEnumerator<U> Test<U>.<M>d__2<S, T>.<>7__wrap3"" IL_023e: ldarg.0 IL_023f: ldfld ""System.Collections.Generic.IEnumerator<U> Test<U>.<M>d__2<S, T>.<>7__wrap3"" IL_0262: stloc.0 IL_0263: stfld ""int Test<U>.<M>d__2<S, T>.<>1__state"" IL_0269: ldloc.1 IL_026a: stfld ""System.Runtime.CompilerServices.TaskAwaiter<int> Test<U>.<M>d__2<S, T>.<>u__1"" IL_026f: ldarg.0 IL_0270: ldflda ""System.Runtime.CompilerServices.AsyncVoidMethodBuilder Test<U>.<M>d__2<S, T>.<>t__builder"" IL_0282: ldarg.0 IL_0283: ldfld ""System.Runtime.CompilerServices.TaskAwaiter<int> Test<U>.<M>d__2<S, T>.<>u__1"" IL_0289: ldarg.0 IL_028a: ldflda ""System.Runtime.CompilerServices.TaskAwaiter<int> Test<U>.<M>d__2<S, T>.<>u__1"" IL_0298: stloc.0 IL_0299: stfld ""int Test<U>.<M>d__2<S, T>.<>1__state"" IL_02a6: ldarg.0 IL_02a7: ldfld ""System.Collections.Generic.IEnumerator<U> Test<U>.<M>d__2<S, T>.<>7__wrap3"" IL_02b9: ldarg.0 IL_02ba: ldfld ""System.Collections.Generic.IEnumerator<U> Test<U>.<M>d__2<S, T>.<>7__wrap3"" IL_02c1: ldarg.0 IL_02c2: ldfld ""System.Collections.Generic.IEnumerator<U> Test<U>.<M>d__2<S, T>.<>7__wrap3"" IL_02ce: ldnull IL_02cf: stfld ""System.Collections.Generic.IEnumerator<U> Test<U>.<M>d__2<S, T>.<>7__wrap3"" IL_02da: callvirt ""System.Collections.Generic.IEnumerator<U> System.Collections.Generic.IEnumerable<U>.GetEnumerator()"" IL_02df: stfld ""System.Collections.Generic.IEnumerator<U> Test<U>.<M>d__2<S, T>.<>7__wrap3"" IL_02eb: ldarg.0 IL_02ec: ldfld ""System.Collections.Generic.IEnumerator<U> Test<U>.<M>d__2<S, T>.<>7__wrap3"" IL_030f: stloc.0 IL_0310: stfld ""int Test<U>.<M>d__2<S, T>.<>1__state"" IL_0316: ldloc.1 IL_0317: stfld ""System.Runtime.CompilerServices.TaskAwaiter<int> Test<U>.<M>d__2<S, T>.<>u__1"" IL_031c: ldarg.0 IL_031d: ldflda ""System.Runtime.CompilerServices.AsyncVoidMethodBuilder Test<U>.<M>d__2<S, T>.<>t__builder"" IL_032c: ldarg.0 IL_032d: ldfld ""System.Runtime.CompilerServices.TaskAwaiter<int> Test<U>.<M>d__2<S, T>.<>u__1"" IL_0333: ldarg.0 IL_0334: ldflda ""System.Runtime.CompilerServices.TaskAwaiter<int> Test<U>.<M>d__2<S, T>.<>u__1"" IL_0342: stloc.0 IL_0343: stfld ""int Test<U>.<M>d__2<S, T>.<>1__state"" IL_0350: ldarg.0 IL_0351: ldfld ""System.Collections.Generic.IEnumerator<U> Test<U>.<M>d__2<S, T>.<>7__wrap3"" IL_0363: ldarg.0 IL_0364: ldfld ""System.Collections.Generic.IEnumerator<U> Test<U>.<M>d__2<S, T>.<>7__wrap3"" IL_036b: ldarg.0 IL_036c: ldfld ""System.Collections.Generic.IEnumerator<U> Test<U>.<M>d__2<S, T>.<>7__wrap3"" IL_0378: ldnull IL_0379: stfld ""System.Collections.Generic.IEnumerator<U> Test<U>.<M>d__2<S, T>.<>7__wrap3"" IL_0382: ldc.i4.s -2 IL_0384: stfld ""int Test<U>.<M>d__2<S, T>.<>1__state"" IL_0389: ldarg.0 IL_038a: ldflda ""System.Runtime.CompilerServices.AsyncVoidMethodBuilder Test<U>.<M>d__2<S, T>.<>t__builder"" IL_0398: ldc.i4.s -2 IL_039a: stfld ""int Test<U>.<M>d__2<S, T>.<>1__state"" IL_039f: ldarg.0 IL_03a0: ldflda ""System.Runtime.CompilerServices.AsyncVoidMethodBuilder Test<U>.<M>d__2<S, T>.<>t__builder"" ", actual); } [Fact] public void ReuseFields_Dynamic() { var source = @" using System.Collections.Generic; using System.Threading.Tasks; class Test { static IEnumerable<dynamic> GetDynamicEnum() => null; static IEnumerable<object> GetObjectEnum() => null; static Task<int> F(int a) => null; public static async void M() { foreach (var x in GetDynamicEnum()) await F(1); foreach (var x in GetObjectEnum()) await F(2); } }"; var c = CompileAndVerify(source, expectedOutput: null, options: TestOptions.ReleaseDll); var actual = GetFieldLoadsAndStores(c, "Test.<M>d__3.System.Runtime.CompilerServices.IAsyncStateMachine.MoveNext"); // make sure we are reusing synthesized iterator locals and that the locals are nulled: AssertEx.AssertEqualToleratingWhitespaceDifferences(@" IL_0000: ldarg.0 IL_0001: ldfld ""int Test.<M>d__3.<>1__state"" IL_0017: callvirt ""System.Collections.Generic.IEnumerator<dynamic> System.Collections.Generic.IEnumerable<dynamic>.GetEnumerator()"" IL_001c: stfld ""System.Collections.Generic.IEnumerator<dynamic> Test.<M>d__3.<>7__wrap1"" IL_0027: ldarg.0 IL_0028: ldfld ""System.Collections.Generic.IEnumerator<dynamic> Test.<M>d__3.<>7__wrap1"" IL_004b: stloc.0 IL_004c: stfld ""int Test.<M>d__3.<>1__state"" IL_0052: ldloc.1 IL_0053: stfld ""System.Runtime.CompilerServices.TaskAwaiter<int> Test.<M>d__3.<>u__1"" IL_0058: ldarg.0 IL_0059: ldflda ""System.Runtime.CompilerServices.AsyncVoidMethodBuilder Test.<M>d__3.<>t__builder"" IL_006b: ldarg.0 IL_006c: ldfld ""System.Runtime.CompilerServices.TaskAwaiter<int> Test.<M>d__3.<>u__1"" IL_0072: ldarg.0 IL_0073: ldflda ""System.Runtime.CompilerServices.TaskAwaiter<int> Test.<M>d__3.<>u__1"" IL_0081: stloc.0 IL_0082: stfld ""int Test.<M>d__3.<>1__state"" IL_008f: ldarg.0 IL_0090: ldfld ""System.Collections.Generic.IEnumerator<dynamic> Test.<M>d__3.<>7__wrap1"" IL_00a2: ldarg.0 IL_00a3: ldfld ""System.Collections.Generic.IEnumerator<dynamic> Test.<M>d__3.<>7__wrap1"" IL_00aa: ldarg.0 IL_00ab: ldfld ""System.Collections.Generic.IEnumerator<dynamic> Test.<M>d__3.<>7__wrap1"" IL_00b7: ldnull IL_00b8: stfld ""System.Collections.Generic.IEnumerator<dynamic> Test.<M>d__3.<>7__wrap1"" IL_00c3: callvirt ""System.Collections.Generic.IEnumerator<object> System.Collections.Generic.IEnumerable<object>.GetEnumerator()"" IL_00c8: stfld ""System.Collections.Generic.IEnumerator<dynamic> Test.<M>d__3.<>7__wrap1"" IL_00d4: ldarg.0 IL_00d5: ldfld ""System.Collections.Generic.IEnumerator<dynamic> Test.<M>d__3.<>7__wrap1"" IL_00f8: stloc.0 IL_00f9: stfld ""int Test.<M>d__3.<>1__state"" IL_00ff: ldloc.1 IL_0100: stfld ""System.Runtime.CompilerServices.TaskAwaiter<int> Test.<M>d__3.<>u__1"" IL_0105: ldarg.0 IL_0106: ldflda ""System.Runtime.CompilerServices.AsyncVoidMethodBuilder Test.<M>d__3.<>t__builder"" IL_0115: ldarg.0 IL_0116: ldfld ""System.Runtime.CompilerServices.TaskAwaiter<int> Test.<M>d__3.<>u__1"" IL_011c: ldarg.0 IL_011d: ldflda ""System.Runtime.CompilerServices.TaskAwaiter<int> Test.<M>d__3.<>u__1"" IL_012b: stloc.0 IL_012c: stfld ""int Test.<M>d__3.<>1__state"" IL_0139: ldarg.0 IL_013a: ldfld ""System.Collections.Generic.IEnumerator<dynamic> Test.<M>d__3.<>7__wrap1"" IL_014c: ldarg.0 IL_014d: ldfld ""System.Collections.Generic.IEnumerator<dynamic> Test.<M>d__3.<>7__wrap1"" IL_0154: ldarg.0 IL_0155: ldfld ""System.Collections.Generic.IEnumerator<dynamic> Test.<M>d__3.<>7__wrap1"" IL_0161: ldnull IL_0162: stfld ""System.Collections.Generic.IEnumerator<dynamic> Test.<M>d__3.<>7__wrap1"" IL_016b: ldc.i4.s -2 IL_016d: stfld ""int Test.<M>d__3.<>1__state"" IL_0172: ldarg.0 IL_0173: ldflda ""System.Runtime.CompilerServices.AsyncVoidMethodBuilder Test.<M>d__3.<>t__builder"" IL_0181: ldc.i4.s -2 IL_0183: stfld ""int Test.<M>d__3.<>1__state"" IL_0188: ldarg.0 IL_0189: ldflda ""System.Runtime.CompilerServices.AsyncVoidMethodBuilder Test.<M>d__3.<>t__builder"" ", actual); } [Fact] public void ManySynthesizedNames() { string source = @" using System; using System.Threading.Tasks; public class C { public async Task F() { var a1 = await Task.FromResult(default(Tuple<char, char, char>)); var a2 = await Task.FromResult(default(Tuple<char, char, byte>)); var a3 = await Task.FromResult(default(Tuple<char, byte, char>)); var a4 = await Task.FromResult(default(Tuple<char, byte, byte>)); var a5 = await Task.FromResult(default(Tuple<byte, char, char>)); var a6 = await Task.FromResult(default(Tuple<byte, char, byte>)); var a7 = await Task.FromResult(default(Tuple<byte, byte, char>)); var a8 = await Task.FromResult(default(Tuple<byte, byte, byte>)); var b1 = await Task.FromResult(default(Tuple<int, int, int>)); var b2 = await Task.FromResult(default(Tuple<int, int, long>)); var b3 = await Task.FromResult(default(Tuple<int, long, int>)); var b4 = await Task.FromResult(default(Tuple<int, long, long>)); var b5 = await Task.FromResult(default(Tuple<long, int, int>)); var b6 = await Task.FromResult(default(Tuple<long, int, long>)); var b7 = await Task.FromResult(default(Tuple<long, long, int>)); var b8 = await Task.FromResult(default(Tuple<long, long, long>)); } }"; CompileAndVerify(source, targetFramework: TargetFramework.Empty, references: s_asyncRefs, options: TestOptions.ReleaseDll.WithMetadataImportOptions(MetadataImportOptions.All), symbolValidator: module => { AssertEx.Equal(new[] { "<>1__state", "<>t__builder", "<>u__1", "<>u__2", "<>u__3", "<>u__4", "<>u__5", "<>u__6", "<>u__7", "<>u__8", "<>u__9", "<>u__10", "<>u__11", "<>u__12", "<>u__13", "<>u__14", "<>u__15", "<>u__16", }, module.GetFieldNames("C.<F>d__0")); }); } [WorkItem(9775, "https://github.com/dotnet/roslyn/issues/9775")] [Fact] public void Fixed_Debug() { var text = @"using System; using System.Threading.Tasks; class C { static async Task<int> F(byte[] b) { int i; unsafe { fixed (byte* p = b) { i = *p; } } await Task.Yield(); return i; } static void Main() { var i = F(new byte[] { 1, 2, 3 }).Result; Console.Write(i); } }"; var verifier = CompileAndVerify(text, options: TestOptions.UnsafeReleaseExe, expectedOutput: @"1", verify: Verification.Fails); verifier.VerifyIL("C.<F>d__0.System.Runtime.CompilerServices.IAsyncStateMachine.MoveNext()", @" { // Code size 198 (0xc6) .maxstack 3 .locals init (int V_0, int V_1, byte* V_2, //p pinned byte[] V_3, System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter V_4, System.Runtime.CompilerServices.YieldAwaitable V_5, System.Exception V_6) IL_0000: ldarg.0 IL_0001: ldfld ""int C.<F>d__0.<>1__state"" IL_0006: stloc.0 .try { IL_0007: ldloc.0 IL_0008: brfalse.s IL_006b IL_000a: ldarg.0 IL_000b: ldfld ""byte[] C.<F>d__0.b"" IL_0010: dup IL_0011: stloc.3 IL_0012: brfalse.s IL_0019 IL_0014: ldloc.3 IL_0015: ldlen IL_0016: conv.i4 IL_0017: brtrue.s IL_001e IL_0019: ldc.i4.0 IL_001a: conv.u IL_001b: stloc.2 IL_001c: br.s IL_0027 IL_001e: ldloc.3 IL_001f: ldc.i4.0 IL_0020: ldelema ""byte"" IL_0025: conv.u IL_0026: stloc.2 IL_0027: ldarg.0 IL_0028: ldloc.2 IL_0029: ldind.u1 IL_002a: stfld ""int C.<F>d__0.<i>5__2"" IL_002f: ldnull IL_0030: stloc.3 IL_0031: call ""System.Runtime.CompilerServices.YieldAwaitable System.Threading.Tasks.Task.Yield()"" IL_0036: stloc.s V_5 IL_0038: ldloca.s V_5 IL_003a: call ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter System.Runtime.CompilerServices.YieldAwaitable.GetAwaiter()"" IL_003f: stloc.s V_4 IL_0041: ldloca.s V_4 IL_0043: call ""bool System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter.IsCompleted.get"" IL_0048: brtrue.s IL_0088 IL_004a: ldarg.0 IL_004b: ldc.i4.0 IL_004c: dup IL_004d: stloc.0 IL_004e: stfld ""int C.<F>d__0.<>1__state"" IL_0053: ldarg.0 IL_0054: ldloc.s V_4 IL_0056: stfld ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter C.<F>d__0.<>u__1"" IL_005b: ldarg.0 IL_005c: ldflda ""System.Runtime.CompilerServices.AsyncTaskMethodBuilder<int> C.<F>d__0.<>t__builder"" IL_0061: ldloca.s V_4 IL_0063: ldarg.0 IL_0064: call ""void System.Runtime.CompilerServices.AsyncTaskMethodBuilder<int>.AwaitUnsafeOnCompleted<System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter, C.<F>d__0>(ref System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter, ref C.<F>d__0)"" IL_0069: leave.s IL_00c5 IL_006b: ldarg.0 IL_006c: ldfld ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter C.<F>d__0.<>u__1"" IL_0071: stloc.s V_4 IL_0073: ldarg.0 IL_0074: ldflda ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter C.<F>d__0.<>u__1"" IL_0079: initobj ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter"" IL_007f: ldarg.0 IL_0080: ldc.i4.m1 IL_0081: dup IL_0082: stloc.0 IL_0083: stfld ""int C.<F>d__0.<>1__state"" IL_0088: ldloca.s V_4 IL_008a: call ""void System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter.GetResult()"" IL_008f: ldarg.0 IL_0090: ldfld ""int C.<F>d__0.<i>5__2"" IL_0095: stloc.1 IL_0096: leave.s IL_00b1 } catch System.Exception { IL_0098: stloc.s V_6 IL_009a: ldarg.0 IL_009b: ldc.i4.s -2 IL_009d: stfld ""int C.<F>d__0.<>1__state"" IL_00a2: ldarg.0 IL_00a3: ldflda ""System.Runtime.CompilerServices.AsyncTaskMethodBuilder<int> C.<F>d__0.<>t__builder"" IL_00a8: ldloc.s V_6 IL_00aa: call ""void System.Runtime.CompilerServices.AsyncTaskMethodBuilder<int>.SetException(System.Exception)"" IL_00af: leave.s IL_00c5 } IL_00b1: ldarg.0 IL_00b2: ldc.i4.s -2 IL_00b4: stfld ""int C.<F>d__0.<>1__state"" IL_00b9: ldarg.0 IL_00ba: ldflda ""System.Runtime.CompilerServices.AsyncTaskMethodBuilder<int> C.<F>d__0.<>t__builder"" IL_00bf: ldloc.1 IL_00c0: call ""void System.Runtime.CompilerServices.AsyncTaskMethodBuilder<int>.SetResult(int)"" IL_00c5: ret }"); verifier = CompileAndVerify(text, options: TestOptions.UnsafeDebugExe, expectedOutput: @"1", verify: Verification.Fails); verifier.VerifyIL("C.<F>d__0.System.Runtime.CompilerServices.IAsyncStateMachine.MoveNext()", @" { // Code size 227 (0xe3) .maxstack 3 .locals init (int V_0, int V_1, pinned byte[] V_2, System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter V_3, System.Runtime.CompilerServices.YieldAwaitable V_4, C.<F>d__0 V_5, System.Exception V_6) IL_0000: ldarg.0 IL_0001: ldfld ""int C.<F>d__0.<>1__state"" IL_0006: stloc.0 .try { IL_0007: ldloc.0 IL_0008: brfalse.s IL_000c IL_000a: br.s IL_000e IL_000c: br.s IL_0086 IL_000e: nop IL_000f: nop IL_0010: ldarg.0 IL_0011: ldfld ""byte[] C.<F>d__0.b"" IL_0016: dup IL_0017: stloc.2 IL_0018: brfalse.s IL_001f IL_001a: ldloc.2 IL_001b: ldlen IL_001c: conv.i4 IL_001d: brtrue.s IL_0029 IL_001f: ldarg.0 IL_0020: ldc.i4.0 IL_0021: conv.u IL_0022: stfld ""byte* C.<F>d__0.<p>5__2"" IL_0027: br.s IL_0037 IL_0029: ldarg.0 IL_002a: ldloc.2 IL_002b: ldc.i4.0 IL_002c: ldelema ""byte"" IL_0031: conv.u IL_0032: stfld ""byte* C.<F>d__0.<p>5__2"" IL_0037: nop IL_0038: ldarg.0 IL_0039: ldarg.0 IL_003a: ldfld ""byte* C.<F>d__0.<p>5__2"" IL_003f: ldind.u1 IL_0040: stfld ""int C.<F>d__0.<i>5__1"" IL_0045: nop IL_0046: ldnull IL_0047: stloc.2 IL_0048: nop IL_0049: call ""System.Runtime.CompilerServices.YieldAwaitable System.Threading.Tasks.Task.Yield()"" IL_004e: stloc.s V_4 IL_0050: ldloca.s V_4 IL_0052: call ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter System.Runtime.CompilerServices.YieldAwaitable.GetAwaiter()"" IL_0057: stloc.3 IL_0058: ldloca.s V_3 IL_005a: call ""bool System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter.IsCompleted.get"" IL_005f: brtrue.s IL_00a2 IL_0061: ldarg.0 IL_0062: ldc.i4.0 IL_0063: dup IL_0064: stloc.0 IL_0065: stfld ""int C.<F>d__0.<>1__state"" IL_006a: ldarg.0 IL_006b: ldloc.3 IL_006c: stfld ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter C.<F>d__0.<>u__1"" IL_0071: ldarg.0 IL_0072: stloc.s V_5 IL_0074: ldarg.0 IL_0075: ldflda ""System.Runtime.CompilerServices.AsyncTaskMethodBuilder<int> C.<F>d__0.<>t__builder"" IL_007a: ldloca.s V_3 IL_007c: ldloca.s V_5 IL_007e: call ""void System.Runtime.CompilerServices.AsyncTaskMethodBuilder<int>.AwaitUnsafeOnCompleted<System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter, C.<F>d__0>(ref System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter, ref C.<F>d__0)"" IL_0083: nop IL_0084: leave.s IL_00e2 IL_0086: ldarg.0 IL_0087: ldfld ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter C.<F>d__0.<>u__1"" IL_008c: stloc.3 IL_008d: ldarg.0 IL_008e: ldflda ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter C.<F>d__0.<>u__1"" IL_0093: initobj ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter"" IL_0099: ldarg.0 IL_009a: ldc.i4.m1 IL_009b: dup IL_009c: stloc.0 IL_009d: stfld ""int C.<F>d__0.<>1__state"" IL_00a2: ldloca.s V_3 IL_00a4: call ""void System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter.GetResult()"" IL_00a9: nop IL_00aa: ldarg.0 IL_00ab: ldfld ""int C.<F>d__0.<i>5__1"" IL_00b0: stloc.1 IL_00b1: leave.s IL_00cd } catch System.Exception { IL_00b3: stloc.s V_6 IL_00b5: ldarg.0 IL_00b6: ldc.i4.s -2 IL_00b8: stfld ""int C.<F>d__0.<>1__state"" IL_00bd: ldarg.0 IL_00be: ldflda ""System.Runtime.CompilerServices.AsyncTaskMethodBuilder<int> C.<F>d__0.<>t__builder"" IL_00c3: ldloc.s V_6 IL_00c5: call ""void System.Runtime.CompilerServices.AsyncTaskMethodBuilder<int>.SetException(System.Exception)"" IL_00ca: nop IL_00cb: leave.s IL_00e2 } IL_00cd: ldarg.0 IL_00ce: ldc.i4.s -2 IL_00d0: stfld ""int C.<F>d__0.<>1__state"" IL_00d5: ldarg.0 IL_00d6: ldflda ""System.Runtime.CompilerServices.AsyncTaskMethodBuilder<int> C.<F>d__0.<>t__builder"" IL_00db: ldloc.1 IL_00dc: call ""void System.Runtime.CompilerServices.AsyncTaskMethodBuilder<int>.SetResult(int)"" IL_00e1: nop IL_00e2: ret }"); } [WorkItem(15290, "https://github.com/dotnet/roslyn/issues/15290")] [Fact] public void ReuseLocals() { var text = @" using System; using System.Threading.Tasks; class Test { public static void Main(string[] args) => MainAsync(args).GetAwaiter().GetResult(); private static async Task MainAsync(string[] args) { if (args.Length > 0) { int a = 1; await Task.Yield(); Console.WriteLine(a); } else { int b = 2; await Task.Yield(); Console.WriteLine(b); } } }"; var verifier = CompileAndVerify(text, options: TestOptions.ReleaseExe, expectedOutput: @"2"); // NOTE: only one hoisted int local: // int Test.<MainAsync>d__1.<a>5__2 verifier.VerifyIL("Test.<MainAsync>d__1.System.Runtime.CompilerServices.IAsyncStateMachine.MoveNext()", @" { // Code size 292 (0x124) .maxstack 3 .locals init (int V_0, System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter V_1, System.Runtime.CompilerServices.YieldAwaitable V_2, System.Exception V_3) IL_0000: ldarg.0 IL_0001: ldfld ""int Test.<MainAsync>d__1.<>1__state"" IL_0006: stloc.0 .try { IL_0007: ldloc.0 IL_0008: brfalse.s IL_005b IL_000a: ldloc.0 IL_000b: ldc.i4.1 IL_000c: beq IL_00c9 IL_0011: ldarg.0 IL_0012: ldfld ""string[] Test.<MainAsync>d__1.args"" IL_0017: ldlen IL_0018: brfalse.s IL_008b IL_001a: ldarg.0 IL_001b: ldc.i4.1 IL_001c: stfld ""int Test.<MainAsync>d__1.<a>5__2"" IL_0021: call ""System.Runtime.CompilerServices.YieldAwaitable System.Threading.Tasks.Task.Yield()"" IL_0026: stloc.2 IL_0027: ldloca.s V_2 IL_0029: call ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter System.Runtime.CompilerServices.YieldAwaitable.GetAwaiter()"" IL_002e: stloc.1 IL_002f: ldloca.s V_1 IL_0031: call ""bool System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter.IsCompleted.get"" IL_0036: brtrue.s IL_0077 IL_0038: ldarg.0 IL_0039: ldc.i4.0 IL_003a: dup IL_003b: stloc.0 IL_003c: stfld ""int Test.<MainAsync>d__1.<>1__state"" IL_0041: ldarg.0 IL_0042: ldloc.1 IL_0043: stfld ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter Test.<MainAsync>d__1.<>u__1"" IL_0048: ldarg.0 IL_0049: ldflda ""System.Runtime.CompilerServices.AsyncTaskMethodBuilder Test.<MainAsync>d__1.<>t__builder"" IL_004e: ldloca.s V_1 IL_0050: ldarg.0 IL_0051: call ""void System.Runtime.CompilerServices.AsyncTaskMethodBuilder.AwaitUnsafeOnCompleted<System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter, Test.<MainAsync>d__1>(ref System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter, ref Test.<MainAsync>d__1)"" IL_0056: leave IL_0123 IL_005b: ldarg.0 IL_005c: ldfld ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter Test.<MainAsync>d__1.<>u__1"" IL_0061: stloc.1 IL_0062: ldarg.0 IL_0063: ldflda ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter Test.<MainAsync>d__1.<>u__1"" IL_0068: initobj ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter"" IL_006e: ldarg.0 IL_006f: ldc.i4.m1 IL_0070: dup IL_0071: stloc.0 IL_0072: stfld ""int Test.<MainAsync>d__1.<>1__state"" IL_0077: ldloca.s V_1 IL_0079: call ""void System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter.GetResult()"" IL_007e: ldarg.0 IL_007f: ldfld ""int Test.<MainAsync>d__1.<a>5__2"" IL_0084: call ""void System.Console.WriteLine(int)"" IL_0089: br.s IL_00f7 IL_008b: ldarg.0 IL_008c: ldc.i4.2 IL_008d: stfld ""int Test.<MainAsync>d__1.<a>5__2"" IL_0092: call ""System.Runtime.CompilerServices.YieldAwaitable System.Threading.Tasks.Task.Yield()"" IL_0097: stloc.2 IL_0098: ldloca.s V_2 IL_009a: call ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter System.Runtime.CompilerServices.YieldAwaitable.GetAwaiter()"" IL_009f: stloc.1 IL_00a0: ldloca.s V_1 IL_00a2: call ""bool System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter.IsCompleted.get"" IL_00a7: brtrue.s IL_00e5 IL_00a9: ldarg.0 IL_00aa: ldc.i4.1 IL_00ab: dup IL_00ac: stloc.0 IL_00ad: stfld ""int Test.<MainAsync>d__1.<>1__state"" IL_00b2: ldarg.0 IL_00b3: ldloc.1 IL_00b4: stfld ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter Test.<MainAsync>d__1.<>u__1"" IL_00b9: ldarg.0 IL_00ba: ldflda ""System.Runtime.CompilerServices.AsyncTaskMethodBuilder Test.<MainAsync>d__1.<>t__builder"" IL_00bf: ldloca.s V_1 IL_00c1: ldarg.0 IL_00c2: call ""void System.Runtime.CompilerServices.AsyncTaskMethodBuilder.AwaitUnsafeOnCompleted<System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter, Test.<MainAsync>d__1>(ref System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter, ref Test.<MainAsync>d__1)"" IL_00c7: leave.s IL_0123 IL_00c9: ldarg.0 IL_00ca: ldfld ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter Test.<MainAsync>d__1.<>u__1"" IL_00cf: stloc.1 IL_00d0: ldarg.0 IL_00d1: ldflda ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter Test.<MainAsync>d__1.<>u__1"" IL_00d6: initobj ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter"" IL_00dc: ldarg.0 IL_00dd: ldc.i4.m1 IL_00de: dup IL_00df: stloc.0 IL_00e0: stfld ""int Test.<MainAsync>d__1.<>1__state"" IL_00e5: ldloca.s V_1 IL_00e7: call ""void System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter.GetResult()"" IL_00ec: ldarg.0 IL_00ed: ldfld ""int Test.<MainAsync>d__1.<a>5__2"" IL_00f2: call ""void System.Console.WriteLine(int)"" IL_00f7: leave.s IL_0110 } catch System.Exception { IL_00f9: stloc.3 IL_00fa: ldarg.0 IL_00fb: ldc.i4.s -2 IL_00fd: stfld ""int Test.<MainAsync>d__1.<>1__state"" IL_0102: ldarg.0 IL_0103: ldflda ""System.Runtime.CompilerServices.AsyncTaskMethodBuilder Test.<MainAsync>d__1.<>t__builder"" IL_0108: ldloc.3 IL_0109: call ""void System.Runtime.CompilerServices.AsyncTaskMethodBuilder.SetException(System.Exception)"" IL_010e: leave.s IL_0123 } IL_0110: ldarg.0 IL_0111: ldc.i4.s -2 IL_0113: stfld ""int Test.<MainAsync>d__1.<>1__state"" IL_0118: ldarg.0 IL_0119: ldflda ""System.Runtime.CompilerServices.AsyncTaskMethodBuilder Test.<MainAsync>d__1.<>t__builder"" IL_011e: call ""void System.Runtime.CompilerServices.AsyncTaskMethodBuilder.SetResult()"" IL_0123: ret }"); verifier = CompileAndVerify(text, options: TestOptions.DebugExe, expectedOutput: @"2"); // NOTE: two separate hoisted int locals: // int Test.<MainAsync>d__1.<a>5__1 and // int Test.<MainAsync>d__1.<b>5__2 verifier.VerifyIL("Test.<MainAsync>d__1.System.Runtime.CompilerServices.IAsyncStateMachine.MoveNext()", @" { // Code size 331 (0x14b) .maxstack 3 .locals init (int V_0, bool V_1, System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter V_2, System.Runtime.CompilerServices.YieldAwaitable V_3, Test.<MainAsync>d__1 V_4, System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter V_5, System.Exception V_6) IL_0000: ldarg.0 IL_0001: ldfld ""int Test.<MainAsync>d__1.<>1__state"" IL_0006: stloc.0 .try { IL_0007: ldloc.0 IL_0008: brfalse.s IL_0012 IL_000a: br.s IL_000c IL_000c: ldloc.0 IL_000d: ldc.i4.1 IL_000e: beq.s IL_0014 IL_0010: br.s IL_0019 IL_0012: br.s IL_006f IL_0014: br IL_00e8 IL_0019: nop IL_001a: ldarg.0 IL_001b: ldfld ""string[] Test.<MainAsync>d__1.args"" IL_0020: ldlen IL_0021: ldc.i4.0 IL_0022: cgt.un IL_0024: stloc.1 IL_0025: ldloc.1 IL_0026: brfalse.s IL_00a2 IL_0028: nop IL_0029: ldarg.0 IL_002a: ldc.i4.1 IL_002b: stfld ""int Test.<MainAsync>d__1.<a>5__1"" IL_0030: call ""System.Runtime.CompilerServices.YieldAwaitable System.Threading.Tasks.Task.Yield()"" IL_0035: stloc.3 IL_0036: ldloca.s V_3 IL_0038: call ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter System.Runtime.CompilerServices.YieldAwaitable.GetAwaiter()"" IL_003d: stloc.2 IL_003e: ldloca.s V_2 IL_0040: call ""bool System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter.IsCompleted.get"" IL_0045: brtrue.s IL_008b IL_0047: ldarg.0 IL_0048: ldc.i4.0 IL_0049: dup IL_004a: stloc.0 IL_004b: stfld ""int Test.<MainAsync>d__1.<>1__state"" IL_0050: ldarg.0 IL_0051: ldloc.2 IL_0052: stfld ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter Test.<MainAsync>d__1.<>u__1"" IL_0057: ldarg.0 IL_0058: stloc.s V_4 IL_005a: ldarg.0 IL_005b: ldflda ""System.Runtime.CompilerServices.AsyncTaskMethodBuilder Test.<MainAsync>d__1.<>t__builder"" IL_0060: ldloca.s V_2 IL_0062: ldloca.s V_4 IL_0064: call ""void System.Runtime.CompilerServices.AsyncTaskMethodBuilder.AwaitUnsafeOnCompleted<System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter, Test.<MainAsync>d__1>(ref System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter, ref Test.<MainAsync>d__1)"" IL_0069: nop IL_006a: leave IL_014a IL_006f: ldarg.0 IL_0070: ldfld ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter Test.<MainAsync>d__1.<>u__1"" IL_0075: stloc.2 IL_0076: ldarg.0 IL_0077: ldflda ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter Test.<MainAsync>d__1.<>u__1"" IL_007c: initobj ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter"" IL_0082: ldarg.0 IL_0083: ldc.i4.m1 IL_0084: dup IL_0085: stloc.0 IL_0086: stfld ""int Test.<MainAsync>d__1.<>1__state"" IL_008b: ldloca.s V_2 IL_008d: call ""void System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter.GetResult()"" IL_0092: nop IL_0093: ldarg.0 IL_0094: ldfld ""int Test.<MainAsync>d__1.<a>5__1"" IL_0099: call ""void System.Console.WriteLine(int)"" IL_009e: nop IL_009f: nop IL_00a0: br.s IL_011a IL_00a2: nop IL_00a3: ldarg.0 IL_00a4: ldc.i4.2 IL_00a5: stfld ""int Test.<MainAsync>d__1.<b>5__2"" IL_00aa: call ""System.Runtime.CompilerServices.YieldAwaitable System.Threading.Tasks.Task.Yield()"" IL_00af: stloc.3 IL_00b0: ldloca.s V_3 IL_00b2: call ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter System.Runtime.CompilerServices.YieldAwaitable.GetAwaiter()"" IL_00b7: stloc.s V_5 IL_00b9: ldloca.s V_5 IL_00bb: call ""bool System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter.IsCompleted.get"" IL_00c0: brtrue.s IL_0105 IL_00c2: ldarg.0 IL_00c3: ldc.i4.1 IL_00c4: dup IL_00c5: stloc.0 IL_00c6: stfld ""int Test.<MainAsync>d__1.<>1__state"" IL_00cb: ldarg.0 IL_00cc: ldloc.s V_5 IL_00ce: stfld ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter Test.<MainAsync>d__1.<>u__1"" IL_00d3: ldarg.0 IL_00d4: stloc.s V_4 IL_00d6: ldarg.0 IL_00d7: ldflda ""System.Runtime.CompilerServices.AsyncTaskMethodBuilder Test.<MainAsync>d__1.<>t__builder"" IL_00dc: ldloca.s V_5 IL_00de: ldloca.s V_4 IL_00e0: call ""void System.Runtime.CompilerServices.AsyncTaskMethodBuilder.AwaitUnsafeOnCompleted<System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter, Test.<MainAsync>d__1>(ref System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter, ref Test.<MainAsync>d__1)"" IL_00e5: nop IL_00e6: leave.s IL_014a IL_00e8: ldarg.0 IL_00e9: ldfld ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter Test.<MainAsync>d__1.<>u__1"" IL_00ee: stloc.s V_5 IL_00f0: ldarg.0 IL_00f1: ldflda ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter Test.<MainAsync>d__1.<>u__1"" IL_00f6: initobj ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter"" IL_00fc: ldarg.0 IL_00fd: ldc.i4.m1 IL_00fe: dup IL_00ff: stloc.0 IL_0100: stfld ""int Test.<MainAsync>d__1.<>1__state"" IL_0105: ldloca.s V_5 IL_0107: call ""void System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter.GetResult()"" IL_010c: nop IL_010d: ldarg.0 IL_010e: ldfld ""int Test.<MainAsync>d__1.<b>5__2"" IL_0113: call ""void System.Console.WriteLine(int)"" IL_0118: nop IL_0119: nop IL_011a: leave.s IL_0136 } catch System.Exception { IL_011c: stloc.s V_6 IL_011e: ldarg.0 IL_011f: ldc.i4.s -2 IL_0121: stfld ""int Test.<MainAsync>d__1.<>1__state"" IL_0126: ldarg.0 IL_0127: ldflda ""System.Runtime.CompilerServices.AsyncTaskMethodBuilder Test.<MainAsync>d__1.<>t__builder"" IL_012c: ldloc.s V_6 IL_012e: call ""void System.Runtime.CompilerServices.AsyncTaskMethodBuilder.SetException(System.Exception)"" IL_0133: nop IL_0134: leave.s IL_014a } IL_0136: ldarg.0 IL_0137: ldc.i4.s -2 IL_0139: stfld ""int Test.<MainAsync>d__1.<>1__state"" IL_013e: ldarg.0 IL_013f: ldflda ""System.Runtime.CompilerServices.AsyncTaskMethodBuilder Test.<MainAsync>d__1.<>t__builder"" IL_0144: call ""void System.Runtime.CompilerServices.AsyncTaskMethodBuilder.SetResult()"" IL_0149: nop IL_014a: ret }"); } [WorkItem(15290, "https://github.com/dotnet/roslyn/issues/15290")] [Fact] public void ReuseLocalsSynthetic() { var text = @" using System; using System.Threading.Tasks; class Test { public static void Main(string[] args) => MainAsync(args).GetAwaiter().GetResult(); private static async Task MainAsync(string[] args) { if (args.Length > 0) { int a = 1; await Task.Yield(); Console.WriteLine(a); } else { int b = 2; await Task.Yield(); Console.WriteLine(b); } } }"; var verifier = CompileAndVerify(text, options: TestOptions.ReleaseExe, expectedOutput: @"2"); // NOTE: only one hoisted int local: // int Test.<MainAsync>d__1.<a>5__2 verifier.VerifyIL("Test.<MainAsync>d__1.System.Runtime.CompilerServices.IAsyncStateMachine.MoveNext()", @" { // Code size 292 (0x124) .maxstack 3 .locals init (int V_0, System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter V_1, System.Runtime.CompilerServices.YieldAwaitable V_2, System.Exception V_3) IL_0000: ldarg.0 IL_0001: ldfld ""int Test.<MainAsync>d__1.<>1__state"" IL_0006: stloc.0 .try { IL_0007: ldloc.0 IL_0008: brfalse.s IL_005b IL_000a: ldloc.0 IL_000b: ldc.i4.1 IL_000c: beq IL_00c9 IL_0011: ldarg.0 IL_0012: ldfld ""string[] Test.<MainAsync>d__1.args"" IL_0017: ldlen IL_0018: brfalse.s IL_008b IL_001a: ldarg.0 IL_001b: ldc.i4.1 IL_001c: stfld ""int Test.<MainAsync>d__1.<a>5__2"" IL_0021: call ""System.Runtime.CompilerServices.YieldAwaitable System.Threading.Tasks.Task.Yield()"" IL_0026: stloc.2 IL_0027: ldloca.s V_2 IL_0029: call ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter System.Runtime.CompilerServices.YieldAwaitable.GetAwaiter()"" IL_002e: stloc.1 IL_002f: ldloca.s V_1 IL_0031: call ""bool System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter.IsCompleted.get"" IL_0036: brtrue.s IL_0077 IL_0038: ldarg.0 IL_0039: ldc.i4.0 IL_003a: dup IL_003b: stloc.0 IL_003c: stfld ""int Test.<MainAsync>d__1.<>1__state"" IL_0041: ldarg.0 IL_0042: ldloc.1 IL_0043: stfld ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter Test.<MainAsync>d__1.<>u__1"" IL_0048: ldarg.0 IL_0049: ldflda ""System.Runtime.CompilerServices.AsyncTaskMethodBuilder Test.<MainAsync>d__1.<>t__builder"" IL_004e: ldloca.s V_1 IL_0050: ldarg.0 IL_0051: call ""void System.Runtime.CompilerServices.AsyncTaskMethodBuilder.AwaitUnsafeOnCompleted<System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter, Test.<MainAsync>d__1>(ref System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter, ref Test.<MainAsync>d__1)"" IL_0056: leave IL_0123 IL_005b: ldarg.0 IL_005c: ldfld ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter Test.<MainAsync>d__1.<>u__1"" IL_0061: stloc.1 IL_0062: ldarg.0 IL_0063: ldflda ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter Test.<MainAsync>d__1.<>u__1"" IL_0068: initobj ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter"" IL_006e: ldarg.0 IL_006f: ldc.i4.m1 IL_0070: dup IL_0071: stloc.0 IL_0072: stfld ""int Test.<MainAsync>d__1.<>1__state"" IL_0077: ldloca.s V_1 IL_0079: call ""void System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter.GetResult()"" IL_007e: ldarg.0 IL_007f: ldfld ""int Test.<MainAsync>d__1.<a>5__2"" IL_0084: call ""void System.Console.WriteLine(int)"" IL_0089: br.s IL_00f7 IL_008b: ldarg.0 IL_008c: ldc.i4.2 IL_008d: stfld ""int Test.<MainAsync>d__1.<a>5__2"" IL_0092: call ""System.Runtime.CompilerServices.YieldAwaitable System.Threading.Tasks.Task.Yield()"" IL_0097: stloc.2 IL_0098: ldloca.s V_2 IL_009a: call ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter System.Runtime.CompilerServices.YieldAwaitable.GetAwaiter()"" IL_009f: stloc.1 IL_00a0: ldloca.s V_1 IL_00a2: call ""bool System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter.IsCompleted.get"" IL_00a7: brtrue.s IL_00e5 IL_00a9: ldarg.0 IL_00aa: ldc.i4.1 IL_00ab: dup IL_00ac: stloc.0 IL_00ad: stfld ""int Test.<MainAsync>d__1.<>1__state"" IL_00b2: ldarg.0 IL_00b3: ldloc.1 IL_00b4: stfld ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter Test.<MainAsync>d__1.<>u__1"" IL_00b9: ldarg.0 IL_00ba: ldflda ""System.Runtime.CompilerServices.AsyncTaskMethodBuilder Test.<MainAsync>d__1.<>t__builder"" IL_00bf: ldloca.s V_1 IL_00c1: ldarg.0 IL_00c2: call ""void System.Runtime.CompilerServices.AsyncTaskMethodBuilder.AwaitUnsafeOnCompleted<System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter, Test.<MainAsync>d__1>(ref System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter, ref Test.<MainAsync>d__1)"" IL_00c7: leave.s IL_0123 IL_00c9: ldarg.0 IL_00ca: ldfld ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter Test.<MainAsync>d__1.<>u__1"" IL_00cf: stloc.1 IL_00d0: ldarg.0 IL_00d1: ldflda ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter Test.<MainAsync>d__1.<>u__1"" IL_00d6: initobj ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter"" IL_00dc: ldarg.0 IL_00dd: ldc.i4.m1 IL_00de: dup IL_00df: stloc.0 IL_00e0: stfld ""int Test.<MainAsync>d__1.<>1__state"" IL_00e5: ldloca.s V_1 IL_00e7: call ""void System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter.GetResult()"" IL_00ec: ldarg.0 IL_00ed: ldfld ""int Test.<MainAsync>d__1.<a>5__2"" IL_00f2: call ""void System.Console.WriteLine(int)"" IL_00f7: leave.s IL_0110 } catch System.Exception { IL_00f9: stloc.3 IL_00fa: ldarg.0 IL_00fb: ldc.i4.s -2 IL_00fd: stfld ""int Test.<MainAsync>d__1.<>1__state"" IL_0102: ldarg.0 IL_0103: ldflda ""System.Runtime.CompilerServices.AsyncTaskMethodBuilder Test.<MainAsync>d__1.<>t__builder"" IL_0108: ldloc.3 IL_0109: call ""void System.Runtime.CompilerServices.AsyncTaskMethodBuilder.SetException(System.Exception)"" IL_010e: leave.s IL_0123 } IL_0110: ldarg.0 IL_0111: ldc.i4.s -2 IL_0113: stfld ""int Test.<MainAsync>d__1.<>1__state"" IL_0118: ldarg.0 IL_0119: ldflda ""System.Runtime.CompilerServices.AsyncTaskMethodBuilder Test.<MainAsync>d__1.<>t__builder"" IL_011e: call ""void System.Runtime.CompilerServices.AsyncTaskMethodBuilder.SetResult()"" IL_0123: ret }"); verifier = CompileAndVerify(text, options: TestOptions.DebugExe, expectedOutput: @"2"); // NOTE: two separate hoisted int locals: // int Test.<MainAsync>d__1.<a>5__1 and // int Test.<MainAsync>d__1.<b>5__2 verifier.VerifyIL("Test.<MainAsync>d__1.System.Runtime.CompilerServices.IAsyncStateMachine.MoveNext()", @" { // Code size 331 (0x14b) .maxstack 3 .locals init (int V_0, bool V_1, System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter V_2, System.Runtime.CompilerServices.YieldAwaitable V_3, Test.<MainAsync>d__1 V_4, System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter V_5, System.Exception V_6) IL_0000: ldarg.0 IL_0001: ldfld ""int Test.<MainAsync>d__1.<>1__state"" IL_0006: stloc.0 .try { IL_0007: ldloc.0 IL_0008: brfalse.s IL_0012 IL_000a: br.s IL_000c IL_000c: ldloc.0 IL_000d: ldc.i4.1 IL_000e: beq.s IL_0014 IL_0010: br.s IL_0019 IL_0012: br.s IL_006f IL_0014: br IL_00e8 IL_0019: nop IL_001a: ldarg.0 IL_001b: ldfld ""string[] Test.<MainAsync>d__1.args"" IL_0020: ldlen IL_0021: ldc.i4.0 IL_0022: cgt.un IL_0024: stloc.1 IL_0025: ldloc.1 IL_0026: brfalse.s IL_00a2 IL_0028: nop IL_0029: ldarg.0 IL_002a: ldc.i4.1 IL_002b: stfld ""int Test.<MainAsync>d__1.<a>5__1"" IL_0030: call ""System.Runtime.CompilerServices.YieldAwaitable System.Threading.Tasks.Task.Yield()"" IL_0035: stloc.3 IL_0036: ldloca.s V_3 IL_0038: call ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter System.Runtime.CompilerServices.YieldAwaitable.GetAwaiter()"" IL_003d: stloc.2 IL_003e: ldloca.s V_2 IL_0040: call ""bool System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter.IsCompleted.get"" IL_0045: brtrue.s IL_008b IL_0047: ldarg.0 IL_0048: ldc.i4.0 IL_0049: dup IL_004a: stloc.0 IL_004b: stfld ""int Test.<MainAsync>d__1.<>1__state"" IL_0050: ldarg.0 IL_0051: ldloc.2 IL_0052: stfld ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter Test.<MainAsync>d__1.<>u__1"" IL_0057: ldarg.0 IL_0058: stloc.s V_4 IL_005a: ldarg.0 IL_005b: ldflda ""System.Runtime.CompilerServices.AsyncTaskMethodBuilder Test.<MainAsync>d__1.<>t__builder"" IL_0060: ldloca.s V_2 IL_0062: ldloca.s V_4 IL_0064: call ""void System.Runtime.CompilerServices.AsyncTaskMethodBuilder.AwaitUnsafeOnCompleted<System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter, Test.<MainAsync>d__1>(ref System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter, ref Test.<MainAsync>d__1)"" IL_0069: nop IL_006a: leave IL_014a IL_006f: ldarg.0 IL_0070: ldfld ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter Test.<MainAsync>d__1.<>u__1"" IL_0075: stloc.2 IL_0076: ldarg.0 IL_0077: ldflda ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter Test.<MainAsync>d__1.<>u__1"" IL_007c: initobj ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter"" IL_0082: ldarg.0 IL_0083: ldc.i4.m1 IL_0084: dup IL_0085: stloc.0 IL_0086: stfld ""int Test.<MainAsync>d__1.<>1__state"" IL_008b: ldloca.s V_2 IL_008d: call ""void System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter.GetResult()"" IL_0092: nop IL_0093: ldarg.0 IL_0094: ldfld ""int Test.<MainAsync>d__1.<a>5__1"" IL_0099: call ""void System.Console.WriteLine(int)"" IL_009e: nop IL_009f: nop IL_00a0: br.s IL_011a IL_00a2: nop IL_00a3: ldarg.0 IL_00a4: ldc.i4.2 IL_00a5: stfld ""int Test.<MainAsync>d__1.<b>5__2"" IL_00aa: call ""System.Runtime.CompilerServices.YieldAwaitable System.Threading.Tasks.Task.Yield()"" IL_00af: stloc.3 IL_00b0: ldloca.s V_3 IL_00b2: call ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter System.Runtime.CompilerServices.YieldAwaitable.GetAwaiter()"" IL_00b7: stloc.s V_5 IL_00b9: ldloca.s V_5 IL_00bb: call ""bool System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter.IsCompleted.get"" IL_00c0: brtrue.s IL_0105 IL_00c2: ldarg.0 IL_00c3: ldc.i4.1 IL_00c4: dup IL_00c5: stloc.0 IL_00c6: stfld ""int Test.<MainAsync>d__1.<>1__state"" IL_00cb: ldarg.0 IL_00cc: ldloc.s V_5 IL_00ce: stfld ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter Test.<MainAsync>d__1.<>u__1"" IL_00d3: ldarg.0 IL_00d4: stloc.s V_4 IL_00d6: ldarg.0 IL_00d7: ldflda ""System.Runtime.CompilerServices.AsyncTaskMethodBuilder Test.<MainAsync>d__1.<>t__builder"" IL_00dc: ldloca.s V_5 IL_00de: ldloca.s V_4 IL_00e0: call ""void System.Runtime.CompilerServices.AsyncTaskMethodBuilder.AwaitUnsafeOnCompleted<System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter, Test.<MainAsync>d__1>(ref System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter, ref Test.<MainAsync>d__1)"" IL_00e5: nop IL_00e6: leave.s IL_014a IL_00e8: ldarg.0 IL_00e9: ldfld ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter Test.<MainAsync>d__1.<>u__1"" IL_00ee: stloc.s V_5 IL_00f0: ldarg.0 IL_00f1: ldflda ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter Test.<MainAsync>d__1.<>u__1"" IL_00f6: initobj ""System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter"" IL_00fc: ldarg.0 IL_00fd: ldc.i4.m1 IL_00fe: dup IL_00ff: stloc.0 IL_0100: stfld ""int Test.<MainAsync>d__1.<>1__state"" IL_0105: ldloca.s V_5 IL_0107: call ""void System.Runtime.CompilerServices.YieldAwaitable.YieldAwaiter.GetResult()"" IL_010c: nop IL_010d: ldarg.0 IL_010e: ldfld ""int Test.<MainAsync>d__1.<b>5__2"" IL_0113: call ""void System.Console.WriteLine(int)"" IL_0118: nop IL_0119: nop IL_011a: leave.s IL_0136 } catch System.Exception { IL_011c: stloc.s V_6 IL_011e: ldarg.0 IL_011f: ldc.i4.s -2 IL_0121: stfld ""int Test.<MainAsync>d__1.<>1__state"" IL_0126: ldarg.0 IL_0127: ldflda ""System.Runtime.CompilerServices.AsyncTaskMethodBuilder Test.<MainAsync>d__1.<>t__builder"" IL_012c: ldloc.s V_6 IL_012e: call ""void System.Runtime.CompilerServices.AsyncTaskMethodBuilder.SetException(System.Exception)"" IL_0133: nop IL_0134: leave.s IL_014a } IL_0136: ldarg.0 IL_0137: ldc.i4.s -2 IL_0139: stfld ""int Test.<MainAsync>d__1.<>1__state"" IL_013e: ldarg.0 IL_013f: ldflda ""System.Runtime.CompilerServices.AsyncTaskMethodBuilder Test.<MainAsync>d__1.<>t__builder"" IL_0144: call ""void System.Runtime.CompilerServices.AsyncTaskMethodBuilder.SetResult()"" IL_0149: nop IL_014a: ret }"); } } }