File: CodeGen\CodeGenDisplayClassOptimisationTests.cs
Web Access
Project: src\src\Compilers\CSharp\Test\Emit\Microsoft.CodeAnalysis.CSharp.Emit.UnitTests.csproj (Microsoft.CodeAnalysis.CSharp.Emit.UnitTests)
// 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 Microsoft.CodeAnalysis.CSharp.Test.Utilities;
using Microsoft.CodeAnalysis.Test.Utilities;
using Roslyn.Test.Utilities;
using Xunit;
 
namespace Microsoft.CodeAnalysis.CSharp.UnitTests.CodeGen
{
    public class CodeGenDisplayClassOptimizationTests : CSharpTestBase
    {
        private static void VerifyTypeIL(CompilationVerifier compilation, string typeName, string expected)
        {
            // .Net Core has different assemblies for the same standard library types as .Net Framework, meaning that that the emitted output will be different to the expected if we run them .Net Core
            // Since we do not expect there to be any meaningful differences between output for .Net Core and .Net Framework, we will skip these tests on .Net Core
            if (ExecutionConditionUtil.IsDesktop)
            {
                compilation.VerifyTypeIL(typeName, expected);
            }
        }
 
        [Fact]
        public void WhenOptimisationsAreEnabled_MergeDisplayClasses()
        {
            var source =
                @"using System;
using System.Collections.Generic;
 
public static class Program
{
    public static void Main()
    {
        int a = 1;
        {
            int b = 2;
            Func<int> c = () => a + b;
            Console.WriteLine(c());
        }
    }
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"3", options: TestOptions.ReleaseExe);
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 a
		.field public int32 b
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x207a
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
		.method assembly hidebysig 
			instance int32 '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x2082
			// Code size 14 (0xe)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld int32 Program/'<>c__DisplayClass0_0'::a
			IL_0006: ldarg.0
			IL_0007: ldfld int32 Program/'<>c__DisplayClass0_0'::b
			IL_000c: add
			IL_000d: ret
		} // end of method '<>c__DisplayClass0_0'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_0
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 41 (0x29)
		.maxstack 8
		.entrypoint
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: dup
		IL_0006: ldc.i4.1
		IL_0007: stfld int32 Program/'<>c__DisplayClass0_0'::a
		IL_000c: dup
		IL_000d: ldc.i4.2
		IL_000e: stfld int32 Program/'<>c__DisplayClass0_0'::b
		IL_0013: ldftn instance int32 Program/'<>c__DisplayClass0_0'::'<Main>b__0'()
		IL_0019: newobj instance void class [mscorlib]System.Func`1<int32>::.ctor(object, native int)
		IL_001e: callvirt instance !0 class [mscorlib]System.Func`1<int32>::Invoke()
		IL_0023: call void [mscorlib]System.Console::WriteLine(int32)
		IL_0028: ret
	} // end of method Program::Main
} // end of class Program");
        }
 
        [Fact]
        public void WhenOptimisationsAreDisabled_DoNotMergeDisplayClasses()
        {
            var source =
                @"using System;
using System.Collections.Generic;
 
public static class Program
{
    public static void Main()
    {
        int a = 1;
        {
            int b = 2;
            Func<int> c = () => a + b;
            Console.WriteLine(c());
        }
    }
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"3", options: TestOptions.DebugExe);
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 a
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x209a
			// Code size 8 (0x8)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: nop
			IL_0007: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
	} // end of class <>c__DisplayClass0_0
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_1'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 b
		.field public class Program/'<>c__DisplayClass0_0' 'CS$<>8__locals1'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x209a
			// Code size 8 (0x8)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: nop
			IL_0007: ret
		} // end of method '<>c__DisplayClass0_1'::.ctor
		.method assembly hidebysig 
			instance int32 '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x20a3
			// Code size 19 (0x13)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0006: ldfld int32 Program/'<>c__DisplayClass0_0'::a
			IL_000b: ldarg.0
			IL_000c: ldfld int32 Program/'<>c__DisplayClass0_1'::b
			IL_0011: add
			IL_0012: ret
		} // end of method '<>c__DisplayClass0_1'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_1
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 62 (0x3e)
		.maxstack 2
		.entrypoint
		.locals init (
			[0] class Program/'<>c__DisplayClass0_0',
			[1] class Program/'<>c__DisplayClass0_1',
			[2] class [mscorlib]System.Func`1<int32>
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: nop
		IL_0007: ldloc.0
		IL_0008: ldc.i4.1
		IL_0009: stfld int32 Program/'<>c__DisplayClass0_0'::a
		IL_000e: newobj instance void Program/'<>c__DisplayClass0_1'::.ctor()
		IL_0013: stloc.1
		IL_0014: ldloc.1
		IL_0015: ldloc.0
		IL_0016: stfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
		IL_001b: nop
		IL_001c: ldloc.1
		IL_001d: ldc.i4.2
		IL_001e: stfld int32 Program/'<>c__DisplayClass0_1'::b
		IL_0023: ldloc.1
		IL_0024: ldftn instance int32 Program/'<>c__DisplayClass0_1'::'<Main>b__0'()
		IL_002a: newobj instance void class [mscorlib]System.Func`1<int32>::.ctor(object, native int)
		IL_002f: stloc.2
		IL_0030: ldloc.2
		IL_0031: callvirt instance !0 class [mscorlib]System.Func`1<int32>::Invoke()
		IL_0036: call void [mscorlib]System.Console::WriteLine(int32)
		IL_003b: nop
		IL_003c: nop
		IL_003d: ret
	} // end of method Program::Main
} // end of class Program");
        }
 
        [Fact]
        public void ForWithBlockCorrectDisplayClassesAreCreated()
        {
            var source =
                @"using System;
using System.Collections.Generic;
 
public static class Program
{
    public static void Main()
    {
        var actions = new List<Action>();
        var strings = new List<string>() { ""one"", ""two"", ""three"" };
 
        for (var i = 0; i < strings.Count; i++)
        {
            int x = i;
            actions.Add(() => { Console.WriteLine(strings[i - x - 1]); });
        }
 
        actions[0]();
        actions[1]();
        actions[2]();
    }
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"three
two
one");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public class [mscorlib]System.Collections.Generic.List`1<string> strings
		.field public int32 i
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2115
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
	} // end of class <>c__DisplayClass0_0
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_1'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 x
		.field public class Program/'<>c__DisplayClass0_0' 'CS$<>8__locals1'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2115
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_1'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x211d
			// Code size 42 (0x2a)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0006: ldfld class [mscorlib]System.Collections.Generic.List`1<string> Program/'<>c__DisplayClass0_0'::strings
			IL_000b: ldarg.0
			IL_000c: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0011: ldfld int32 Program/'<>c__DisplayClass0_0'::i
			IL_0016: ldarg.0
			IL_0017: ldfld int32 Program/'<>c__DisplayClass0_1'::x
			IL_001c: sub
			IL_001d: ldc.i4.1
			IL_001e: sub
			IL_001f: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<string>::get_Item(int32)
			IL_0024: call void [mscorlib]System.Console::WriteLine(string)
			IL_0029: ret
		} // end of method '<>c__DisplayClass0_1'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_1
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 185 (0xb9)
		.maxstack 4
		.entrypoint
		.locals init (
			[0] class Program/'<>c__DisplayClass0_0',
			[1] class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>,
			[2] class Program/'<>c__DisplayClass0_1',
			[3] int32
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: newobj instance void class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::.ctor()
		IL_000b: stloc.1
		IL_000c: ldloc.0
		IL_000d: newobj instance void class [mscorlib]System.Collections.Generic.List`1<string>::.ctor()
		IL_0012: dup
		IL_0013: ldstr ""one""
		IL_0018: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
		IL_001d: dup
		IL_001e: ldstr ""two""
		IL_0023: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
		IL_0028: dup
		IL_0029: ldstr ""three""
		IL_002e: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
		IL_0033: stfld class [mscorlib]System.Collections.Generic.List`1<string> Program/'<>c__DisplayClass0_0'::strings
		IL_0038: ldloc.0
		IL_0039: ldc.i4.0
		IL_003a: stfld int32 Program/'<>c__DisplayClass0_0'::i
		IL_003f: br.s IL_0081
		// loop start (head: IL_0081)
			IL_0041: newobj instance void Program/'<>c__DisplayClass0_1'::.ctor()
			IL_0046: stloc.2
			IL_0047: ldloc.2
			IL_0048: ldloc.0
			IL_0049: stfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_004e: ldloc.2
			IL_004f: ldloc.2
			IL_0050: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0055: ldfld int32 Program/'<>c__DisplayClass0_0'::i
			IL_005a: stfld int32 Program/'<>c__DisplayClass0_1'::x
			IL_005f: ldloc.1
			IL_0060: ldloc.2
			IL_0061: ldftn instance void Program/'<>c__DisplayClass0_1'::'<Main>b__0'()
			IL_0067: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
			IL_006c: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::Add(!0)
			IL_0071: ldloc.0
			IL_0072: ldfld int32 Program/'<>c__DisplayClass0_0'::i
			IL_0077: stloc.3
			IL_0078: ldloc.0
			IL_0079: ldloc.3
			IL_007a: ldc.i4.1
			IL_007b: add
			IL_007c: stfld int32 Program/'<>c__DisplayClass0_0'::i
			IL_0081: ldloc.0
			IL_0082: ldfld int32 Program/'<>c__DisplayClass0_0'::i
			IL_0087: ldloc.0
			IL_0088: ldfld class [mscorlib]System.Collections.Generic.List`1<string> Program/'<>c__DisplayClass0_0'::strings
			IL_008d: callvirt instance int32 class [mscorlib]System.Collections.Generic.List`1<string>::get_Count()
			IL_0092: blt.s IL_0041
		// end loop
		IL_0094: ldloc.1
		IL_0095: ldc.i4.0
		IL_0096: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
		IL_009b: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_00a0: ldloc.1
		IL_00a1: ldc.i4.1
		IL_00a2: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
		IL_00a7: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_00ac: ldloc.1
		IL_00ad: ldc.i4.2
		IL_00ae: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
		IL_00b3: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_00b8: ret
	} // end of method Program::Main
} // end of class Program");
        }
 
        [Fact]
        public void ForInsideWhileCorrectDisplayClassesAreCreated()
        {
            var source =
                @"using System;
class C
{
    public static void Main()
    {
        int x = 0;
        int y = 0;
        while (y < 10)
        {
            for (int i = 0; i < 10; i++)
            {
                Func<int> f = () => i + x;
            }
            y++;
        }
    }
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute());
 
            VerifyTypeIL(compilation, "C", @"
.class private auto ansi beforefieldinit C
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 x
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x20a7
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
	} // end of class <>c__DisplayClass0_0
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_1'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 i
		.field public class C/'<>c__DisplayClass0_0' 'CS$<>8__locals1'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x20a7
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_1'::.ctor
		.method assembly hidebysig 
			instance int32 '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x20af
			// Code size 19 (0x13)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld int32 C/'<>c__DisplayClass0_1'::i
			IL_0006: ldarg.0
			IL_0007: ldfld class C/'<>c__DisplayClass0_0' C/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_000c: ldfld int32 C/'<>c__DisplayClass0_0'::x
			IL_0011: add
			IL_0012: ret
		} // end of method '<>c__DisplayClass0_1'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_1
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 75 (0x4b)
		.maxstack 3
		.locals init (
			[0] class C/'<>c__DisplayClass0_0',
			[1] int32,
			[2] class C/'<>c__DisplayClass0_1',
			[3] int32
		)
		IL_0000: newobj instance void C/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: ldloc.0
		IL_0007: ldc.i4.0
		IL_0008: stfld int32 C/'<>c__DisplayClass0_0'::x
		IL_000d: ldc.i4.0
		IL_000e: stloc.1
		IL_000f: br.s IL_0045
		// loop start (head: IL_0045)
			IL_0011: newobj instance void C/'<>c__DisplayClass0_1'::.ctor()
			IL_0016: stloc.2
			IL_0017: ldloc.2
			IL_0018: ldloc.0
			IL_0019: stfld class C/'<>c__DisplayClass0_0' C/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_001e: ldloc.2
			IL_001f: ldc.i4.0
			IL_0020: stfld int32 C/'<>c__DisplayClass0_1'::i
			IL_0025: br.s IL_0037
			// loop start (head: IL_0037)
				IL_0027: ldloc.2
				IL_0028: ldfld int32 C/'<>c__DisplayClass0_1'::i
				IL_002d: stloc.3
				IL_002e: ldloc.2
				IL_002f: ldloc.3
				IL_0030: ldc.i4.1
				IL_0031: add
				IL_0032: stfld int32 C/'<>c__DisplayClass0_1'::i
				IL_0037: ldloc.2
				IL_0038: ldfld int32 C/'<>c__DisplayClass0_1'::i
				IL_003d: ldc.i4.s 10
				IL_003f: blt.s IL_0027
			// end loop
			IL_0041: ldloc.1
			IL_0042: ldc.i4.1
			IL_0043: add
			IL_0044: stloc.1
			IL_0045: ldloc.1
			IL_0046: ldc.i4.s 10
			IL_0048: blt.s IL_0011
		// end loop
		IL_004a: ret
	} // end of method C::Main
	.method public hidebysig specialname rtspecialname 
		instance void .ctor () cil managed 
	{
		// Method begins at RVA 0x20a7
		// Code size 7 (0x7)
		.maxstack 8
		IL_0000: ldarg.0
		IL_0001: call instance void [mscorlib]System.Object::.ctor()
		IL_0006: ret
	} // end of method C::.ctor
} // end of class C");
        }
 
        [Fact]
        public void ForInsideEmptyForCorrectDisplayClassesAreCreated()
        {
            var source =
                @"using System;
class C
{
    public static void Main()
    {
        int x = 0;
        int y = 0;
        for(;;)
        {
            for (int i = 0; i < 10; i++)
            {
                Func<int> f = () => i + x;
            }
            y++;
            break;
        }
    }
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute());
 
            VerifyTypeIL(compilation, "C", @"
.class private auto ansi beforefieldinit C
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 x
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x20a0
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
	} // end of class <>c__DisplayClass0_0
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_1'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 i
		.field public class C/'<>c__DisplayClass0_0' 'CS$<>8__locals1'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x20a0
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_1'::.ctor
		.method assembly hidebysig 
			instance int32 '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x20a8
			// Code size 19 (0x13)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld int32 C/'<>c__DisplayClass0_1'::i
			IL_0006: ldarg.0
			IL_0007: ldfld class C/'<>c__DisplayClass0_0' C/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_000c: ldfld int32 C/'<>c__DisplayClass0_0'::x
			IL_0011: add
			IL_0012: ret
		} // end of method '<>c__DisplayClass0_1'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_1
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 68 (0x44)
		.maxstack 3
		.locals init (
			[0] class C/'<>c__DisplayClass0_0',
			[1] int32,
			[2] class C/'<>c__DisplayClass0_1',
			[3] int32
		)
		IL_0000: newobj instance void C/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: ldloc.0
		IL_0007: ldc.i4.0
		IL_0008: stfld int32 C/'<>c__DisplayClass0_0'::x
		IL_000d: ldc.i4.0
		IL_000e: stloc.1
		IL_000f: newobj instance void C/'<>c__DisplayClass0_1'::.ctor()
		IL_0014: stloc.2
		IL_0015: ldloc.2
		IL_0016: ldloc.0
		IL_0017: stfld class C/'<>c__DisplayClass0_0' C/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
		IL_001c: ldloc.2
		IL_001d: ldc.i4.0
		IL_001e: stfld int32 C/'<>c__DisplayClass0_1'::i
		IL_0023: br.s IL_0035
		// loop start (head: IL_0035)
			IL_0025: ldloc.2
			IL_0026: ldfld int32 C/'<>c__DisplayClass0_1'::i
			IL_002b: stloc.3
			IL_002c: ldloc.2
			IL_002d: ldloc.3
			IL_002e: ldc.i4.1
			IL_002f: add
			IL_0030: stfld int32 C/'<>c__DisplayClass0_1'::i
			IL_0035: ldloc.2
			IL_0036: ldfld int32 C/'<>c__DisplayClass0_1'::i
			IL_003b: ldc.i4.s 10
			IL_003d: blt.s IL_0025
		// end loop
		IL_003f: ldloc.1
		IL_0040: ldc.i4.1
		IL_0041: add
		IL_0042: stloc.1
		IL_0043: ret
	} // end of method C::Main
	.method public hidebysig specialname rtspecialname 
		instance void .ctor () cil managed 
	{
		// Method begins at RVA 0x20a0
		// Code size 7 (0x7)
		.maxstack 8
		IL_0000: ldarg.0
		IL_0001: call instance void [mscorlib]System.Object::.ctor()
		IL_0006: ret
	} // end of method C::.ctor
} // end of class C");
        }
 
        [Fact]
        public void ForWithoutBlockCorrectDisplayClassesAreCreated()
        {
            var source =
                @"using System;
using System.Collections.Generic;
 
public static class Program
{
	public static void Main()
	{
		var actions = new List<Action>();
		var strings = new List<string>() { ""one"", ""two"", ""three"" };
 
		for (var i = 0; i < strings.Count; i++)
			actions.Add(i is int x ? (Action)(() => Console.WriteLine(strings[i - x - 1])) : () => {});
 
		actions[0]();
		actions[1]();
		actions[2]();
	}
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"three
two
one");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed serializable beforefieldinit '<>c'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public static initonly class Program/'<>c' '<>9'
		.field public static class [mscorlib]System.Action '<>9__0_1'
		// Methods
		.method private hidebysig specialname rtspecialname static 
			void .cctor () cil managed 
		{
			// Method begins at RVA 0x2115
			// Code size 11 (0xb)
			.maxstack 8
			IL_0000: newobj instance void Program/'<>c'::.ctor()
			IL_0005: stsfld class Program/'<>c' Program/'<>c'::'<>9'
			IL_000a: ret
		} // end of method '<>c'::.cctor
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2121
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0_1' () cil managed 
		{
			// Method begins at RVA 0x2129
			// Code size 1 (0x1)
			.maxstack 8
			IL_0000: ret
		} // end of method '<>c'::'<Main>b__0_1'
	} // end of class <>c
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public class [mscorlib]System.Collections.Generic.List`1<string> strings
		.field public int32 i
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2121
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
	} // end of class <>c__DisplayClass0_0
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_1'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 x
		.field public class Program/'<>c__DisplayClass0_0' 'CS$<>8__locals1'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2121
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_1'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x212b
			// Code size 42 (0x2a)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0006: ldfld class [mscorlib]System.Collections.Generic.List`1<string> Program/'<>c__DisplayClass0_0'::strings
			IL_000b: ldarg.0
			IL_000c: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0011: ldfld int32 Program/'<>c__DisplayClass0_0'::i
			IL_0016: ldarg.0
			IL_0017: ldfld int32 Program/'<>c__DisplayClass0_1'::x
			IL_001c: sub
			IL_001d: ldc.i4.1
			IL_001e: sub
			IL_001f: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<string>::get_Item(int32)
			IL_0024: call void [mscorlib]System.Console::WriteLine(string)
			IL_0029: ret
		} // end of method '<>c__DisplayClass0_1'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_1
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 185 (0xb9)
		.maxstack 4
		.entrypoint
		.locals init (
			[0] class Program/'<>c__DisplayClass0_0',
			[1] class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>,
			[2] class Program/'<>c__DisplayClass0_1',
			[3] int32
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: newobj instance void class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::.ctor()
		IL_000b: stloc.1
		IL_000c: ldloc.0
		IL_000d: newobj instance void class [mscorlib]System.Collections.Generic.List`1<string>::.ctor()
		IL_0012: dup
		IL_0013: ldstr ""one""
		IL_0018: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
		IL_001d: dup
		IL_001e: ldstr ""two""
		IL_0023: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
		IL_0028: dup
		IL_0029: ldstr ""three""
		IL_002e: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
		IL_0033: stfld class [mscorlib]System.Collections.Generic.List`1<string> Program/'<>c__DisplayClass0_0'::strings
		IL_0038: ldloc.0
		IL_0039: ldc.i4.0
		IL_003a: stfld int32 Program/'<>c__DisplayClass0_0'::i
		IL_003f: br.s IL_0081
		// loop start (head: IL_0081)
			IL_0041: newobj instance void Program/'<>c__DisplayClass0_1'::.ctor()
			IL_0046: stloc.2
			IL_0047: ldloc.2
			IL_0048: ldloc.0
			IL_0049: stfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_004e: ldloc.1
			IL_004f: ldloc.2
			IL_0050: ldloc.2
			IL_0051: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0056: ldfld int32 Program/'<>c__DisplayClass0_0'::i
			IL_005b: stfld int32 Program/'<>c__DisplayClass0_1'::x
			IL_0060: ldloc.2
			IL_0061: ldftn instance void Program/'<>c__DisplayClass0_1'::'<Main>b__0'()
			IL_0067: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
			IL_006c: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::Add(!0)
			IL_0071: ldloc.0
			IL_0072: ldfld int32 Program/'<>c__DisplayClass0_0'::i
			IL_0077: stloc.3
			IL_0078: ldloc.0
			IL_0079: ldloc.3
			IL_007a: ldc.i4.1
			IL_007b: add
			IL_007c: stfld int32 Program/'<>c__DisplayClass0_0'::i
			IL_0081: ldloc.0
			IL_0082: ldfld int32 Program/'<>c__DisplayClass0_0'::i
			IL_0087: ldloc.0
			IL_0088: ldfld class [mscorlib]System.Collections.Generic.List`1<string> Program/'<>c__DisplayClass0_0'::strings
			IL_008d: callvirt instance int32 class [mscorlib]System.Collections.Generic.List`1<string>::get_Count()
			IL_0092: blt.s IL_0041
		// end loop
		IL_0094: ldloc.1
		IL_0095: ldc.i4.0
		IL_0096: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
		IL_009b: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_00a0: ldloc.1
		IL_00a1: ldc.i4.1
		IL_00a2: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
		IL_00a7: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_00ac: ldloc.1
		IL_00ad: ldc.i4.2
		IL_00ae: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
		IL_00b3: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_00b8: ret
	} // end of method Program::Main
} // end of class Program");
        }
 
        [Fact]
        public void ForeachWithBlockCorrectDisplayClassesAreCreated()
        {
            var source =
                @"using System;
using System.Collections.Generic;
using System.Linq;
 
public static class Program
{
	public static void Main()
	{
		var actions = new List<Action>();
		var strings = new List<string>() { ""one"", ""two"", ""three"" };
 
		foreach (var i in Enumerable.Range(0,3))
		{
			int x = i;
			actions.Add(() => { Console.WriteLine(strings[i - x]); });
		}
 
		actions[0]();
		actions[1]();
		actions[2]();
	}
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"one
one
one");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public class [mscorlib]System.Collections.Generic.List`1<string> strings
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2124
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
	} // end of class <>c__DisplayClass0_0
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_1'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 i
		.field public int32 x
		.field public class Program/'<>c__DisplayClass0_0' 'CS$<>8__locals1'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2124
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_1'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x212c
			// Code size 35 (0x23)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0006: ldfld class [mscorlib]System.Collections.Generic.List`1<string> Program/'<>c__DisplayClass0_0'::strings
			IL_000b: ldarg.0
			IL_000c: ldfld int32 Program/'<>c__DisplayClass0_1'::i
			IL_0011: ldarg.0
			IL_0012: ldfld int32 Program/'<>c__DisplayClass0_1'::x
			IL_0017: sub
			IL_0018: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<string>::get_Item(int32)
			IL_001d: call void [mscorlib]System.Console::WriteLine(string)
			IL_0022: ret
		} // end of method '<>c__DisplayClass0_1'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_1
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 183 (0xb7)
		.maxstack 4
		.entrypoint
		.locals init (
			[0] class Program/'<>c__DisplayClass0_0',
			[1] class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>,
			[2] class [mscorlib]System.Collections.Generic.IEnumerator`1<int32>,
			[3] class Program/'<>c__DisplayClass0_1'
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: newobj instance void class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::.ctor()
		IL_000b: stloc.1
		IL_000c: ldloc.0
		IL_000d: newobj instance void class [mscorlib]System.Collections.Generic.List`1<string>::.ctor()
		IL_0012: dup
		IL_0013: ldstr ""one""
		IL_0018: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
		IL_001d: dup
		IL_001e: ldstr ""two""
		IL_0023: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
		IL_0028: dup
		IL_0029: ldstr ""three""
		IL_002e: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
		IL_0033: stfld class [mscorlib]System.Collections.Generic.List`1<string> Program/'<>c__DisplayClass0_0'::strings
		IL_0038: ldc.i4.0
		IL_0039: ldc.i4.3
		IL_003a: call class [mscorlib]System.Collections.Generic.IEnumerable`1<int32> [System.Core]System.Linq.Enumerable::Range(int32, int32)
		IL_003f: callvirt instance class [mscorlib]System.Collections.Generic.IEnumerator`1<!0> class [mscorlib]System.Collections.Generic.IEnumerable`1<int32>::GetEnumerator()
		IL_0044: stloc.2
		.try
		{
			IL_0045: br.s IL_007e
			// loop start (head: IL_007e)
				IL_0047: newobj instance void Program/'<>c__DisplayClass0_1'::.ctor()
				IL_004c: stloc.3
				IL_004d: ldloc.3
				IL_004e: ldloc.0
				IL_004f: stfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
				IL_0054: ldloc.3
				IL_0055: ldloc.2
				IL_0056: callvirt instance !0 class [mscorlib]System.Collections.Generic.IEnumerator`1<int32>::get_Current()
				IL_005b: stfld int32 Program/'<>c__DisplayClass0_1'::i
				IL_0060: ldloc.3
				IL_0061: ldloc.3
				IL_0062: ldfld int32 Program/'<>c__DisplayClass0_1'::i
				IL_0067: stfld int32 Program/'<>c__DisplayClass0_1'::x
				IL_006c: ldloc.1
				IL_006d: ldloc.3
				IL_006e: ldftn instance void Program/'<>c__DisplayClass0_1'::'<Main>b__0'()
				IL_0074: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
				IL_0079: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::Add(!0)
				IL_007e: ldloc.2
				IL_007f: callvirt instance bool [mscorlib]System.Collections.IEnumerator::MoveNext()
				IL_0084: brtrue.s IL_0047
			// end loop
			IL_0086: leave.s IL_0092
		} // end .try
		finally
		{
			IL_0088: ldloc.2
			IL_0089: brfalse.s IL_0091
			IL_008b: ldloc.2
			IL_008c: callvirt instance void [mscorlib]System.IDisposable::Dispose()
			IL_0091: endfinally
		} // end handler
		IL_0092: ldloc.1
		IL_0093: ldc.i4.0
		IL_0094: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
		IL_0099: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_009e: ldloc.1
		IL_009f: ldc.i4.1
		IL_00a0: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
		IL_00a5: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_00aa: ldloc.1
		IL_00ab: ldc.i4.2
		IL_00ac: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
		IL_00b1: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_00b6: ret
	} // end of method Program::Main
} // end of class Program");
        }
 
        [Fact]
        public void ForeachWithoutBlockCorrectDisplayClassesAreCreated()
        {
            var source =
                @"using System;
using System.Collections.Generic;
using System.Linq;
 
public static class Program
{
	public static void Main()
	{
		var actions = new List<Action>();
		var strings = new List<string>() { ""one"", ""two"", ""three"" };
 
		foreach (var i in Enumerable.Range(0,3))
            actions.Add(i is int x ? (Action)(() => Console.WriteLine(strings[i - x])) : () => {});
 
		actions[0]();
		actions[1]();
		actions[2]();
	}
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"one
one
one");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed serializable beforefieldinit '<>c'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public static initonly class Program/'<>c' '<>9'
		.field public static class [mscorlib]System.Action '<>9__0_1'
		// Methods
		.method private hidebysig specialname rtspecialname static 
			void .cctor () cil managed 
		{
			// Method begins at RVA 0x2124
			// Code size 11 (0xb)
			.maxstack 8
			IL_0000: newobj instance void Program/'<>c'::.ctor()
			IL_0005: stsfld class Program/'<>c' Program/'<>c'::'<>9'
			IL_000a: ret
		} // end of method '<>c'::.cctor
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2130
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0_1' () cil managed 
		{
			// Method begins at RVA 0x2138
			// Code size 1 (0x1)
			.maxstack 8
			IL_0000: ret
		} // end of method '<>c'::'<Main>b__0_1'
	} // end of class <>c
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public class [mscorlib]System.Collections.Generic.List`1<string> strings
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2130
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
	} // end of class <>c__DisplayClass0_0
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_1'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 i
		.field public int32 x
		.field public class Program/'<>c__DisplayClass0_0' 'CS$<>8__locals1'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2130
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_1'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x213a
			// Code size 35 (0x23)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0006: ldfld class [mscorlib]System.Collections.Generic.List`1<string> Program/'<>c__DisplayClass0_0'::strings
			IL_000b: ldarg.0
			IL_000c: ldfld int32 Program/'<>c__DisplayClass0_1'::i
			IL_0011: ldarg.0
			IL_0012: ldfld int32 Program/'<>c__DisplayClass0_1'::x
			IL_0017: sub
			IL_0018: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<string>::get_Item(int32)
			IL_001d: call void [mscorlib]System.Console::WriteLine(string)
			IL_0022: ret
		} // end of method '<>c__DisplayClass0_1'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_1
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 183 (0xb7)
		.maxstack 4
		.entrypoint
		.locals init (
			[0] class Program/'<>c__DisplayClass0_0',
			[1] class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>,
			[2] class [mscorlib]System.Collections.Generic.IEnumerator`1<int32>,
			[3] class Program/'<>c__DisplayClass0_1'
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: newobj instance void class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::.ctor()
		IL_000b: stloc.1
		IL_000c: ldloc.0
		IL_000d: newobj instance void class [mscorlib]System.Collections.Generic.List`1<string>::.ctor()
		IL_0012: dup
		IL_0013: ldstr ""one""
		IL_0018: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
		IL_001d: dup
		IL_001e: ldstr ""two""
		IL_0023: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
		IL_0028: dup
		IL_0029: ldstr ""three""
		IL_002e: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
		IL_0033: stfld class [mscorlib]System.Collections.Generic.List`1<string> Program/'<>c__DisplayClass0_0'::strings
		IL_0038: ldc.i4.0
		IL_0039: ldc.i4.3
		IL_003a: call class [mscorlib]System.Collections.Generic.IEnumerable`1<int32> [System.Core]System.Linq.Enumerable::Range(int32, int32)
		IL_003f: callvirt instance class [mscorlib]System.Collections.Generic.IEnumerator`1<!0> class [mscorlib]System.Collections.Generic.IEnumerable`1<int32>::GetEnumerator()
		IL_0044: stloc.2
		.try
		{
			IL_0045: br.s IL_007e
			// loop start (head: IL_007e)
				IL_0047: newobj instance void Program/'<>c__DisplayClass0_1'::.ctor()
				IL_004c: stloc.3
				IL_004d: ldloc.3
				IL_004e: ldloc.0
				IL_004f: stfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
				IL_0054: ldloc.3
				IL_0055: ldloc.2
				IL_0056: callvirt instance !0 class [mscorlib]System.Collections.Generic.IEnumerator`1<int32>::get_Current()
				IL_005b: stfld int32 Program/'<>c__DisplayClass0_1'::i
				IL_0060: ldloc.1
				IL_0061: ldloc.3
				IL_0062: ldloc.3
				IL_0063: ldfld int32 Program/'<>c__DisplayClass0_1'::i
				IL_0068: stfld int32 Program/'<>c__DisplayClass0_1'::x
				IL_006d: ldloc.3
				IL_006e: ldftn instance void Program/'<>c__DisplayClass0_1'::'<Main>b__0'()
				IL_0074: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
				IL_0079: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::Add(!0)
				IL_007e: ldloc.2
				IL_007f: callvirt instance bool [mscorlib]System.Collections.IEnumerator::MoveNext()
				IL_0084: brtrue.s IL_0047
			// end loop
			IL_0086: leave.s IL_0092
		} // end .try
		finally
		{
			IL_0088: ldloc.2
			IL_0089: brfalse.s IL_0091
			IL_008b: ldloc.2
			IL_008c: callvirt instance void [mscorlib]System.IDisposable::Dispose()
			IL_0091: endfinally
		} // end handler
		IL_0092: ldloc.1
		IL_0093: ldc.i4.0
		IL_0094: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
		IL_0099: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_009e: ldloc.1
		IL_009f: ldc.i4.1
		IL_00a0: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
		IL_00a5: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_00aa: ldloc.1
		IL_00ab: ldc.i4.2
		IL_00ac: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
		IL_00b1: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_00b6: ret
	} // end of method Program::Main
} // end of class Program");
        }
 
        [CompilerTrait(CompilerFeature.AsyncStreams)]
        [Fact]
        public void AwaitForeachCorrectDisplayClassesAreCreated()
        {
            var source =
                @"using System;
using System.Collections.Generic;
using System.Linq;
 
public class C
{
    public Enumerator GetAsyncEnumerator(System.Threading.CancellationToken token = default)
    {
        throw null;
    }
 
    public sealed class Enumerator
    {
        public int Current { get; }
 
        public System.Threading.Tasks.Task<bool> MoveNextAsync() => null;
    }
}
 
public class Program
{
	public static async void M(C enumerable)
	{
		var actions = new List<Action>();
		var strings = new List<string>() { ""one"", ""two"", ""three"" };
 
		await foreach (var i in enumerable)
            actions.Add(i is int x ? (Action)(() => Console.WriteLine(strings[i - x])) : () => {});
 
		actions[0]();
		actions[1]();
		actions[2]();
	}
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute());
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed serializable beforefieldinit '<>c'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public static initonly class Program/'<>c' '<>9'
		.field public static class [mscorlib]System.Action '<>9__0_1'
		// Methods
		.method private hidebysig specialname rtspecialname static 
			void .cctor () cil managed 
		{
			// Method begins at RVA 0x209e
			// Code size 11 (0xb)
			.maxstack 8
			IL_0000: newobj instance void Program/'<>c'::.ctor()
			IL_0005: stsfld class Program/'<>c' Program/'<>c'::'<>9'
			IL_000a: ret
		} // end of method '<>c'::.cctor
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2053
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c'::.ctor
		.method assembly hidebysig 
			instance void '<M>b__0_1' () cil managed 
		{
			// Method begins at RVA 0x20aa
			// Code size 1 (0x1)
			.maxstack 8
			IL_0000: ret
		} // end of method '<>c'::'<M>b__0_1'
	} // end of class <>c
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public class [mscorlib]System.Collections.Generic.List`1<string> strings
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2053
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
	} // end of class <>c__DisplayClass0_0
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_1'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 i
		.field public int32 x
		.field public class Program/'<>c__DisplayClass0_0' 'CS$<>8__locals1'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2053
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_1'::.ctor
		.method assembly hidebysig 
			instance void '<M>b__0' () cil managed 
		{
			// Method begins at RVA 0x20ac
			// Code size 35 (0x23)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0006: ldfld class [mscorlib]System.Collections.Generic.List`1<string> Program/'<>c__DisplayClass0_0'::strings
			IL_000b: ldarg.0
			IL_000c: ldfld int32 Program/'<>c__DisplayClass0_1'::i
			IL_0011: ldarg.0
			IL_0012: ldfld int32 Program/'<>c__DisplayClass0_1'::x
			IL_0017: sub
			IL_0018: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<string>::get_Item(int32)
			IL_001d: call void [mscorlib]System.Console::WriteLine(string)
			IL_0022: ret
		} // end of method '<>c__DisplayClass0_1'::'<M>b__0'
	} // end of class <>c__DisplayClass0_1
	.class nested private auto ansi sealed beforefieldinit '<M>d__0'
		extends [mscorlib]System.ValueType
		implements [mscorlib]System.Runtime.CompilerServices.IAsyncStateMachine
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 '<>1__state'
		.field public valuetype [mscorlib]System.Runtime.CompilerServices.AsyncVoidMethodBuilder '<>t__builder'
		.field public class C enumerable
		.field private class Program/'<>c__DisplayClass0_0' '<>8__1'
		.field private class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action> '<actions>5__2'
		.field private class C/Enumerator '<>7__wrap2'
		.field private valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter`1<bool> '<>u__1'
		// Methods
		.method private final hidebysig newslot virtual 
			instance void MoveNext () cil managed 
		{
			.override method instance void [mscorlib]System.Runtime.CompilerServices.IAsyncStateMachine::MoveNext()
			// Method begins at RVA 0x20d0
			// Code size 416 (0x1a0)
			.maxstack 4
			.locals init (
				[0] int32,
				[1] valuetype [mscorlib]System.Threading.CancellationToken,
				[2] class Program/'<>c__DisplayClass0_1',
				[3] valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter`1<bool>,
				[4] class [mscorlib]System.Exception
			)
			IL_0000: ldarg.0
			IL_0001: ldfld int32 Program/'<M>d__0'::'<>1__state'
			IL_0006: stloc.0
			.try
			{
				IL_0007: ldloc.0
				IL_0008: brfalse IL_00f3
				IL_000d: ldarg.0
				IL_000e: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
				IL_0013: stfld class Program/'<>c__DisplayClass0_0' Program/'<M>d__0'::'<>8__1'
				IL_0018: ldarg.0
				IL_0019: newobj instance void class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::.ctor()
				IL_001e: stfld class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action> Program/'<M>d__0'::'<actions>5__2'
				IL_0023: ldarg.0
				IL_0024: ldfld class Program/'<>c__DisplayClass0_0' Program/'<M>d__0'::'<>8__1'
				IL_0029: newobj instance void class [mscorlib]System.Collections.Generic.List`1<string>::.ctor()
				IL_002e: dup
				IL_002f: ldstr ""one""
				IL_0034: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
				IL_0039: dup
				IL_003a: ldstr ""two""
				IL_003f: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
				IL_0044: dup
				IL_0045: ldstr ""three""
				IL_004a: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
				IL_004f: stfld class [mscorlib]System.Collections.Generic.List`1<string> Program/'<>c__DisplayClass0_0'::strings
				IL_0054: ldarg.0
				IL_0055: ldarg.0
				IL_0056: ldfld class C Program/'<M>d__0'::enumerable
				IL_005b: ldloca.s 1
				IL_005d: initobj [mscorlib]System.Threading.CancellationToken
				IL_0063: ldloc.1
				IL_0064: callvirt instance class C/Enumerator C::GetAsyncEnumerator(valuetype [mscorlib]System.Threading.CancellationToken)
				IL_0069: stfld class C/Enumerator Program/'<M>d__0'::'<>7__wrap2'
				IL_006e: br.s IL_00b6
				IL_0070: newobj instance void Program/'<>c__DisplayClass0_1'::.ctor()
				IL_0075: stloc.2
				IL_0076: ldloc.2
				IL_0077: ldarg.0
				IL_0078: ldfld class Program/'<>c__DisplayClass0_0' Program/'<M>d__0'::'<>8__1'
				IL_007d: stfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
				IL_0082: ldloc.2
				IL_0083: ldarg.0
				IL_0084: ldfld class C/Enumerator Program/'<M>d__0'::'<>7__wrap2'
				IL_0089: callvirt instance int32 C/Enumerator::get_Current()
				IL_008e: stfld int32 Program/'<>c__DisplayClass0_1'::i
				IL_0093: ldarg.0
				IL_0094: ldfld class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action> Program/'<M>d__0'::'<actions>5__2'
				IL_0099: ldloc.2
				IL_009a: ldloc.2
				IL_009b: ldfld int32 Program/'<>c__DisplayClass0_1'::i
				IL_00a0: stfld int32 Program/'<>c__DisplayClass0_1'::x
				IL_00a5: ldloc.2
				IL_00a6: ldftn instance void Program/'<>c__DisplayClass0_1'::'<M>b__0'()
				IL_00ac: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
				IL_00b1: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::Add(!0)
				IL_00b6: ldarg.0
				IL_00b7: ldfld class C/Enumerator Program/'<M>d__0'::'<>7__wrap2'
				IL_00bc: callvirt instance class [mscorlib]System.Threading.Tasks.Task`1<bool> C/Enumerator::MoveNextAsync()
				IL_00c1: callvirt instance valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter`1<!0> class [mscorlib]System.Threading.Tasks.Task`1<bool>::GetAwaiter()
				IL_00c6: stloc.3
				IL_00c7: ldloca.s 3
				IL_00c9: call instance bool valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter`1<bool>::get_IsCompleted()
				IL_00ce: brtrue.s IL_010f
				IL_00d0: ldarg.0
				IL_00d1: ldc.i4.0
				IL_00d2: dup
				IL_00d3: stloc.0
				IL_00d4: stfld int32 Program/'<M>d__0'::'<>1__state'
				IL_00d9: ldarg.0
				IL_00da: ldloc.3
				IL_00db: stfld valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter`1<bool> Program/'<M>d__0'::'<>u__1'
				IL_00e0: ldarg.0
				IL_00e1: ldflda valuetype [mscorlib]System.Runtime.CompilerServices.AsyncVoidMethodBuilder Program/'<M>d__0'::'<>t__builder'
				IL_00e6: ldloca.s 3
				IL_00e8: ldarg.0
				IL_00e9: call instance void [mscorlib]System.Runtime.CompilerServices.AsyncVoidMethodBuilder::AwaitUnsafeOnCompleted<valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter`1<bool>, valuetype Program/'<M>d__0'>(!!0&, !!1&)
				IL_00ee: leave IL_019f
				IL_00f3: ldarg.0
				IL_00f4: ldfld valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter`1<bool> Program/'<M>d__0'::'<>u__1'
				IL_00f9: stloc.3
				IL_00fa: ldarg.0
				IL_00fb: ldflda valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter`1<bool> Program/'<M>d__0'::'<>u__1'
				IL_0100: initobj valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter`1<bool>
				IL_0106: ldarg.0
				IL_0107: ldc.i4.m1
				IL_0108: dup
				IL_0109: stloc.0
				IL_010a: stfld int32 Program/'<M>d__0'::'<>1__state'
				IL_010f: ldloca.s 3
				IL_0111: call instance !0 valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter`1<bool>::GetResult()
				IL_0116: brtrue IL_0070
				IL_011b: ldarg.0
				IL_011c: ldnull
				IL_011d: stfld class C/Enumerator Program/'<M>d__0'::'<>7__wrap2'
				IL_0122: ldarg.0
				IL_0123: ldfld class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action> Program/'<M>d__0'::'<actions>5__2'
				IL_0128: ldc.i4.0
				IL_0129: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
				IL_012e: callvirt instance void [mscorlib]System.Action::Invoke()
				IL_0133: ldarg.0
				IL_0134: ldfld class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action> Program/'<M>d__0'::'<actions>5__2'
				IL_0139: ldc.i4.1
				IL_013a: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
				IL_013f: callvirt instance void [mscorlib]System.Action::Invoke()
				IL_0144: ldarg.0
				IL_0145: ldfld class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action> Program/'<M>d__0'::'<actions>5__2'
				IL_014a: ldc.i4.2
				IL_014b: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
				IL_0150: callvirt instance void [mscorlib]System.Action::Invoke()
				IL_0155: leave.s IL_017e
			} // end .try
			catch [mscorlib]System.Exception
			{
				IL_0157: stloc.s 4
				IL_0159: ldarg.0
				IL_015a: ldc.i4.s -2
				IL_015c: stfld int32 Program/'<M>d__0'::'<>1__state'
				IL_0161: ldarg.0
				IL_0162: ldnull
				IL_0163: stfld class Program/'<>c__DisplayClass0_0' Program/'<M>d__0'::'<>8__1'
				IL_0168: ldarg.0
				IL_0169: ldnull
				IL_016a: stfld class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action> Program/'<M>d__0'::'<actions>5__2'
				IL_016f: ldarg.0
				IL_0170: ldflda valuetype [mscorlib]System.Runtime.CompilerServices.AsyncVoidMethodBuilder Program/'<M>d__0'::'<>t__builder'
				IL_0175: ldloc.s 4
				IL_0177: call instance void [mscorlib]System.Runtime.CompilerServices.AsyncVoidMethodBuilder::SetException(class [mscorlib]System.Exception)
				IL_017c: leave.s IL_019f
			} // end handler
			IL_017e: ldarg.0
			IL_017f: ldc.i4.s -2
			IL_0181: stfld int32 Program/'<M>d__0'::'<>1__state'
			IL_0186: ldarg.0
			IL_0187: ldnull
			IL_0188: stfld class Program/'<>c__DisplayClass0_0' Program/'<M>d__0'::'<>8__1'
			IL_018d: ldarg.0
			IL_018e: ldnull
			IL_018f: stfld class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action> Program/'<M>d__0'::'<actions>5__2'
			IL_0194: ldarg.0
			IL_0195: ldflda valuetype [mscorlib]System.Runtime.CompilerServices.AsyncVoidMethodBuilder Program/'<M>d__0'::'<>t__builder'
			IL_019a: call instance void [mscorlib]System.Runtime.CompilerServices.AsyncVoidMethodBuilder::SetResult()
			IL_019f: ret
		} // end of method '<M>d__0'::MoveNext
		.method private final hidebysig newslot virtual 
			instance void SetStateMachine (
				class [mscorlib]System.Runtime.CompilerServices.IAsyncStateMachine stateMachine
			) cil managed 
		{
			.custom instance void [mscorlib]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (
				01 00 00 00
			)
			.override method instance void [mscorlib]System.Runtime.CompilerServices.IAsyncStateMachine::SetStateMachine(class [mscorlib]System.Runtime.CompilerServices.IAsyncStateMachine)
			// Method begins at RVA 0x2298
			// Code size 13 (0xd)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldflda valuetype [mscorlib]System.Runtime.CompilerServices.AsyncVoidMethodBuilder Program/'<M>d__0'::'<>t__builder'
			IL_0006: ldarg.1
			IL_0007: call instance void [mscorlib]System.Runtime.CompilerServices.AsyncVoidMethodBuilder::SetStateMachine(class [mscorlib]System.Runtime.CompilerServices.IAsyncStateMachine)
			IL_000c: ret
		} // end of method '<M>d__0'::SetStateMachine
	} // end of class <M>d__0
	// Methods
	.method public hidebysig static 
		void M (
			class C enumerable
		) cil managed 
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.AsyncStateMachineAttribute::.ctor(class [mscorlib]System.Type) = (
			01 00 0f 50 72 6f 67 72 61 6d 2b 3c 4d 3e 64 5f
			5f 30 00 00
		)
		// Method begins at RVA 0x205c
		// Code size 43 (0x2b)
		.maxstack 2
		.locals init (
			[0] valuetype Program/'<M>d__0'
		)
		IL_0000: ldloca.s 0
		IL_0002: call valuetype [mscorlib]System.Runtime.CompilerServices.AsyncVoidMethodBuilder [mscorlib]System.Runtime.CompilerServices.AsyncVoidMethodBuilder::Create()
		IL_0007: stfld valuetype [mscorlib]System.Runtime.CompilerServices.AsyncVoidMethodBuilder Program/'<M>d__0'::'<>t__builder'
		IL_000c: ldloca.s 0
		IL_000e: ldarg.0
		IL_000f: stfld class C Program/'<M>d__0'::enumerable
		IL_0014: ldloca.s 0
		IL_0016: ldc.i4.m1
		IL_0017: stfld int32 Program/'<M>d__0'::'<>1__state'
		IL_001c: ldloca.s 0
		IL_001e: ldflda valuetype [mscorlib]System.Runtime.CompilerServices.AsyncVoidMethodBuilder Program/'<M>d__0'::'<>t__builder'
		IL_0023: ldloca.s 0
		IL_0025: call instance void [mscorlib]System.Runtime.CompilerServices.AsyncVoidMethodBuilder::Start<valuetype Program/'<M>d__0'>(!!0&)
		IL_002a: ret
	} // end of method Program::M
	.method public hidebysig specialname rtspecialname 
		instance void .ctor () cil managed 
	{
		// Method begins at RVA 0x2053
		// Code size 7 (0x7)
		.maxstack 8
		IL_0000: ldarg.0
		IL_0001: call instance void [mscorlib]System.Object::.ctor()
		IL_0006: ret
	} // end of method Program::.ctor
} // end of class Program");
        }
 
        [Fact]
        public void IfWithBlockCorrectDisplayClassesAreCreated()
        {
            var source =
                @"using System;
using System.Collections.Generic;
 
public static class Program
{
	public static void Main()
	{
		var actions = new List<Action>();
		var strings = new List<string>() { ""one""};
 
		if (0 is int i)
		{
			var x = i;
			actions.Add(() => { Console.WriteLine(strings[i + x]); });
		}
 
		actions[0]();
	}
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: "one");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public class [mscorlib]System.Collections.Generic.List`1<string> strings
		.field public int32 i
		.field public int32 x
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x20b0
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x20b8
			// Code size 30 (0x1e)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld class [mscorlib]System.Collections.Generic.List`1<string> Program/'<>c__DisplayClass0_0'::strings
			IL_0006: ldarg.0
			IL_0007: ldfld int32 Program/'<>c__DisplayClass0_0'::i
			IL_000c: ldarg.0
			IL_000d: ldfld int32 Program/'<>c__DisplayClass0_0'::x
			IL_0012: add
			IL_0013: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<string>::get_Item(int32)
			IL_0018: call void [mscorlib]System.Console::WriteLine(string)
			IL_001d: ret
		} // end of method '<>c__DisplayClass0_0'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_0
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 84 (0x54)
		.maxstack 4
		.entrypoint
		.locals init (
			[0] class Program/'<>c__DisplayClass0_0',
			[1] class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: newobj instance void class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::.ctor()
		IL_000b: stloc.1
		IL_000c: ldloc.0
		IL_000d: newobj instance void class [mscorlib]System.Collections.Generic.List`1<string>::.ctor()
		IL_0012: dup
		IL_0013: ldstr ""one""
		IL_0018: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
		IL_001d: stfld class [mscorlib]System.Collections.Generic.List`1<string> Program/'<>c__DisplayClass0_0'::strings
		IL_0022: ldloc.0
		IL_0023: ldc.i4.0
		IL_0024: stfld int32 Program/'<>c__DisplayClass0_0'::i
		IL_0029: ldloc.0
		IL_002a: ldloc.0
		IL_002b: ldfld int32 Program/'<>c__DisplayClass0_0'::i
		IL_0030: stfld int32 Program/'<>c__DisplayClass0_0'::x
		IL_0035: ldloc.1
		IL_0036: ldloc.0
		IL_0037: ldftn instance void Program/'<>c__DisplayClass0_0'::'<Main>b__0'()
		IL_003d: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
		IL_0042: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::Add(!0)
		IL_0047: ldloc.1
		IL_0048: ldc.i4.0
		IL_0049: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
		IL_004e: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_0053: ret
	} // end of method Program::Main
} // end of class Program");
        }
 
        [Fact]
        public void IfWithoutBlockCorrectDisplayClassesAreCreated()
        {
            var source =
                @"using System;
using System.Collections.Generic;
 
public static class Program
{
	public static void Main()
	{
		var actions = new List<Action>();
		var strings = new List<string>() { ""one""};
 
		if (0 is int i)
			actions.Add(i is int x ? (Action)(() => Console.WriteLine(strings[i + x])) : () => {});
 
		actions[0]();
	}
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: "one");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed serializable beforefieldinit '<>c'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public static initonly class Program/'<>c' '<>9'
		.field public static class [mscorlib]System.Action '<>9__0_1'
		// Methods
		.method private hidebysig specialname rtspecialname static 
			void .cctor () cil managed 
		{
			// Method begins at RVA 0x20b0
			// Code size 11 (0xb)
			.maxstack 8
			IL_0000: newobj instance void Program/'<>c'::.ctor()
			IL_0005: stsfld class Program/'<>c' Program/'<>c'::'<>9'
			IL_000a: ret
		} // end of method '<>c'::.cctor
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x20bc
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0_1' () cil managed 
		{
			// Method begins at RVA 0x20c4
			// Code size 1 (0x1)
			.maxstack 8
			IL_0000: ret
		} // end of method '<>c'::'<Main>b__0_1'
	} // end of class <>c
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public class [mscorlib]System.Collections.Generic.List`1<string> strings
		.field public int32 i
		.field public int32 x
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x20bc
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x20c6
			// Code size 30 (0x1e)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld class [mscorlib]System.Collections.Generic.List`1<string> Program/'<>c__DisplayClass0_0'::strings
			IL_0006: ldarg.0
			IL_0007: ldfld int32 Program/'<>c__DisplayClass0_0'::i
			IL_000c: ldarg.0
			IL_000d: ldfld int32 Program/'<>c__DisplayClass0_0'::x
			IL_0012: add
			IL_0013: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<string>::get_Item(int32)
			IL_0018: call void [mscorlib]System.Console::WriteLine(string)
			IL_001d: ret
		} // end of method '<>c__DisplayClass0_0'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_0
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 84 (0x54)
		.maxstack 4
		.entrypoint
		.locals init (
			[0] class Program/'<>c__DisplayClass0_0',
			[1] class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: newobj instance void class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::.ctor()
		IL_000b: stloc.1
		IL_000c: ldloc.0
		IL_000d: newobj instance void class [mscorlib]System.Collections.Generic.List`1<string>::.ctor()
		IL_0012: dup
		IL_0013: ldstr ""one""
		IL_0018: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
		IL_001d: stfld class [mscorlib]System.Collections.Generic.List`1<string> Program/'<>c__DisplayClass0_0'::strings
		IL_0022: ldloc.0
		IL_0023: ldc.i4.0
		IL_0024: stfld int32 Program/'<>c__DisplayClass0_0'::i
		IL_0029: ldloc.1
		IL_002a: ldloc.0
		IL_002b: ldloc.0
		IL_002c: ldfld int32 Program/'<>c__DisplayClass0_0'::i
		IL_0031: stfld int32 Program/'<>c__DisplayClass0_0'::x
		IL_0036: ldloc.0
		IL_0037: ldftn instance void Program/'<>c__DisplayClass0_0'::'<Main>b__0'()
		IL_003d: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
		IL_0042: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::Add(!0)
		IL_0047: ldloc.1
		IL_0048: ldc.i4.0
		IL_0049: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
		IL_004e: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_0053: ret
	} // end of method Program::Main
} // end of class Program
");
        }
 
        [Fact]
        public void ElseWithoutBlockCorrectDisplayClassesAreCreated()
        {
            var source =
                @"using System;
using System.Collections.Generic;
 
public static class Program
{
	public static void Main()
	{
		var actions = new List<Action>();
		var strings = new List<string>() { ""one""};
 
        if(true)
    		if (!(0 is int i) || strings[0] != ""one"")
                throw new Exception();
            else
			    actions.Add(i is int x ? (Action)(() => Console.WriteLine(strings[i + x])) : () => {});
 
		actions[0]();
	}
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: "one");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed serializable beforefieldinit '<>c'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public static initonly class Program/'<>c' '<>9'
		.field public static class [mscorlib]System.Action '<>9__0_1'
		// Methods
		.method private hidebysig specialname rtspecialname static 
			void .cctor () cil managed 
		{
			// Method begins at RVA 0x20ce
			// Code size 11 (0xb)
			.maxstack 8
			IL_0000: newobj instance void Program/'<>c'::.ctor()
			IL_0005: stsfld class Program/'<>c' Program/'<>c'::'<>9'
			IL_000a: ret
		} // end of method '<>c'::.cctor
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x20da
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0_1' () cil managed 
		{
			// Method begins at RVA 0x20e2
			// Code size 1 (0x1)
			.maxstack 8
			IL_0000: ret
		} // end of method '<>c'::'<Main>b__0_1'
	} // end of class <>c
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public class [mscorlib]System.Collections.Generic.List`1<string> strings
		.field public int32 i
		.field public int32 x
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x20da
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x20e4
			// Code size 30 (0x1e)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld class [mscorlib]System.Collections.Generic.List`1<string> Program/'<>c__DisplayClass0_0'::strings
			IL_0006: ldarg.0
			IL_0007: ldfld int32 Program/'<>c__DisplayClass0_0'::i
			IL_000c: ldarg.0
			IL_000d: ldfld int32 Program/'<>c__DisplayClass0_0'::x
			IL_0012: add
			IL_0013: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<string>::get_Item(int32)
			IL_0018: call void [mscorlib]System.Console::WriteLine(string)
			IL_001d: ret
		} // end of method '<>c__DisplayClass0_0'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_0
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 114 (0x72)
		.maxstack 4
		.entrypoint
		.locals init (
			[0] class Program/'<>c__DisplayClass0_0',
			[1] class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: newobj instance void class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::.ctor()
		IL_000b: stloc.1
		IL_000c: ldloc.0
		IL_000d: newobj instance void class [mscorlib]System.Collections.Generic.List`1<string>::.ctor()
		IL_0012: dup
		IL_0013: ldstr ""one""
		IL_0018: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
		IL_001d: stfld class [mscorlib]System.Collections.Generic.List`1<string> Program/'<>c__DisplayClass0_0'::strings
		IL_0022: ldloc.0
		IL_0023: ldc.i4.0
		IL_0024: stfld int32 Program/'<>c__DisplayClass0_0'::i
		IL_0029: ldloc.0
		IL_002a: ldfld class [mscorlib]System.Collections.Generic.List`1<string> Program/'<>c__DisplayClass0_0'::strings
		IL_002f: ldc.i4.0
		IL_0030: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<string>::get_Item(int32)
		IL_0035: ldstr ""one""
		IL_003a: call bool [mscorlib]System.String::op_Inequality(string, string)
		IL_003f: brfalse.s IL_0047
		IL_0041: newobj instance void [mscorlib]System.Exception::.ctor()
		IL_0046: throw
		IL_0047: ldloc.1
		IL_0048: ldloc.0
		IL_0049: ldloc.0
		IL_004a: ldfld int32 Program/'<>c__DisplayClass0_0'::i
		IL_004f: stfld int32 Program/'<>c__DisplayClass0_0'::x
		IL_0054: ldloc.0
		IL_0055: ldftn instance void Program/'<>c__DisplayClass0_0'::'<Main>b__0'()
		IL_005b: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
		IL_0060: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::Add(!0)
		IL_0065: ldloc.1
		IL_0066: ldc.i4.0
		IL_0067: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
		IL_006c: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_0071: ret
	} // end of method Program::Main
} // end of class Program");
        }
 
        [Fact]
        public void UsingWithBlockCorrectDisplayClassesAreCreated()
        {
            var source =
                @"using System;
using System.Collections.Generic;
 
public static class Program
{
	public static void Main()
	{
		var actions = new List<Action>();
		var strings = new List<string>() { ""one"" };
 
		using (var disposable = new Disposable())
		{
			var i = 0;
			actions.Add(() => { Console.WriteLine(disposable.ToString()); Console.WriteLine(strings[i]); });
		}
 
		actions[0]();
	}
 
	public class Disposable : IDisposable
	{
		public void Dispose(){}
	}
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"Program+Disposable
one");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested public auto ansi beforefieldinit Disposable
		extends [mscorlib]System.Object
		implements [mscorlib]System.IDisposable
	{
		// Methods
		.method public final hidebysig newslot virtual 
			instance void Dispose () cil managed 
		{
			// Method begins at RVA 0x20d8
			// Code size 1 (0x1)
			.maxstack 8
			IL_0000: ret
		} // end of method Disposable::Dispose
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x20da
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method Disposable::.ctor
	} // end of class Disposable
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public class [mscorlib]System.Collections.Generic.List`1<string> strings
		.field public class Program/Disposable disposable
		.field public int32 i
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x20da
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x20e2
			// Code size 39 (0x27)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld class Program/Disposable Program/'<>c__DisplayClass0_0'::disposable
			IL_0006: callvirt instance string [mscorlib]System.Object::ToString()
			IL_000b: call void [mscorlib]System.Console::WriteLine(string)
			IL_0010: ldarg.0
			IL_0011: ldfld class [mscorlib]System.Collections.Generic.List`1<string> Program/'<>c__DisplayClass0_0'::strings
			IL_0016: ldarg.0
			IL_0017: ldfld int32 Program/'<>c__DisplayClass0_0'::i
			IL_001c: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<string>::get_Item(int32)
			IL_0021: call void [mscorlib]System.Console::WriteLine(string)
			IL_0026: ret
		} // end of method '<>c__DisplayClass0_0'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_0
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 105 (0x69)
		.maxstack 4
		.entrypoint
		.locals init (
			[0] class Program/'<>c__DisplayClass0_0',
			[1] class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: newobj instance void class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::.ctor()
		IL_000b: stloc.1
		IL_000c: ldloc.0
		IL_000d: newobj instance void class [mscorlib]System.Collections.Generic.List`1<string>::.ctor()
		IL_0012: dup
		IL_0013: ldstr ""one""
		IL_0018: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
		IL_001d: stfld class [mscorlib]System.Collections.Generic.List`1<string> Program/'<>c__DisplayClass0_0'::strings
		IL_0022: ldloc.0
		IL_0023: newobj instance void Program/Disposable::.ctor()
		IL_0028: stfld class Program/Disposable Program/'<>c__DisplayClass0_0'::disposable
		.try
		{
			IL_002d: ldloc.0
			IL_002e: ldc.i4.0
			IL_002f: stfld int32 Program/'<>c__DisplayClass0_0'::i
			IL_0034: ldloc.1
			IL_0035: ldloc.0
			IL_0036: ldftn instance void Program/'<>c__DisplayClass0_0'::'<Main>b__0'()
			IL_003c: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
			IL_0041: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::Add(!0)
			IL_0046: leave.s IL_005c
		} // end .try
		finally
		{
			IL_0048: ldloc.0
			IL_0049: ldfld class Program/Disposable Program/'<>c__DisplayClass0_0'::disposable
			IL_004e: brfalse.s IL_005b
			IL_0050: ldloc.0
			IL_0051: ldfld class Program/Disposable Program/'<>c__DisplayClass0_0'::disposable
			IL_0056: callvirt instance void [mscorlib]System.IDisposable::Dispose()
			IL_005b: endfinally
		} // end handler
		IL_005c: ldloc.1
		IL_005d: ldc.i4.0
		IL_005e: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
		IL_0063: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_0068: ret
	} // end of method Program::Main
} // end of class Program");
        }
 
        [Fact]
        public void UsingWithoutBlockCorrectDisplayClassesAreCreated()
        {
            var source =
                @"using System;
using System.Collections.Generic;
 
public static class Program
{
	public static void Main()
	{
		var actions = new List<Action>();
		var strings = new List<string>() { ""one"" };
 
		using (var disposable = new Disposable())
			actions.Add(0 is int i ? (Action)(() => { Console.WriteLine(disposable.ToString()); Console.WriteLine(strings[i]); }) : () => {});
 
		actions[0]();
	}
 
 
	public class Disposable : IDisposable
	{
		public void Dispose(){}
	}
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"Program+Disposable
one");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested public auto ansi beforefieldinit Disposable
		extends [mscorlib]System.Object
		implements [mscorlib]System.IDisposable
	{
		// Methods
		.method public final hidebysig newslot virtual 
			instance void Dispose () cil managed 
		{
			// Method begins at RVA 0x20d8
			// Code size 1 (0x1)
			.maxstack 8
			IL_0000: ret
		} // end of method Disposable::Dispose
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x20da
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method Disposable::.ctor
	} // end of class Disposable
	.class nested private auto ansi sealed serializable beforefieldinit '<>c'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public static initonly class Program/'<>c' '<>9'
		.field public static class [mscorlib]System.Action '<>9__0_1'
		// Methods
		.method private hidebysig specialname rtspecialname static 
			void .cctor () cil managed 
		{
			// Method begins at RVA 0x20e2
			// Code size 11 (0xb)
			.maxstack 8
			IL_0000: newobj instance void Program/'<>c'::.ctor()
			IL_0005: stsfld class Program/'<>c' Program/'<>c'::'<>9'
			IL_000a: ret
		} // end of method '<>c'::.cctor
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x20da
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0_1' () cil managed 
		{
			// Method begins at RVA 0x20d8
			// Code size 1 (0x1)
			.maxstack 8
			IL_0000: ret
		} // end of method '<>c'::'<Main>b__0_1'
	} // end of class <>c
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public class [mscorlib]System.Collections.Generic.List`1<string> strings
		.field public class Program/Disposable disposable
		.field public int32 i
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x20da
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x20ee
			// Code size 39 (0x27)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld class Program/Disposable Program/'<>c__DisplayClass0_0'::disposable
			IL_0006: callvirt instance string [mscorlib]System.Object::ToString()
			IL_000b: call void [mscorlib]System.Console::WriteLine(string)
			IL_0010: ldarg.0
			IL_0011: ldfld class [mscorlib]System.Collections.Generic.List`1<string> Program/'<>c__DisplayClass0_0'::strings
			IL_0016: ldarg.0
			IL_0017: ldfld int32 Program/'<>c__DisplayClass0_0'::i
			IL_001c: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<string>::get_Item(int32)
			IL_0021: call void [mscorlib]System.Console::WriteLine(string)
			IL_0026: ret
		} // end of method '<>c__DisplayClass0_0'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_0
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 105 (0x69)
		.maxstack 4
		.entrypoint
		.locals init (
			[0] class Program/'<>c__DisplayClass0_0',
			[1] class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: newobj instance void class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::.ctor()
		IL_000b: stloc.1
		IL_000c: ldloc.0
		IL_000d: newobj instance void class [mscorlib]System.Collections.Generic.List`1<string>::.ctor()
		IL_0012: dup
		IL_0013: ldstr ""one""
		IL_0018: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
		IL_001d: stfld class [mscorlib]System.Collections.Generic.List`1<string> Program/'<>c__DisplayClass0_0'::strings
		IL_0022: ldloc.0
		IL_0023: newobj instance void Program/Disposable::.ctor()
		IL_0028: stfld class Program/Disposable Program/'<>c__DisplayClass0_0'::disposable
		.try
		{
			IL_002d: ldloc.1
			IL_002e: ldloc.0
			IL_002f: ldc.i4.0
			IL_0030: stfld int32 Program/'<>c__DisplayClass0_0'::i
			IL_0035: ldloc.0
			IL_0036: ldftn instance void Program/'<>c__DisplayClass0_0'::'<Main>b__0'()
			IL_003c: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
			IL_0041: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::Add(!0)
			IL_0046: leave.s IL_005c
		} // end .try
		finally
		{
			IL_0048: ldloc.0
			IL_0049: ldfld class Program/Disposable Program/'<>c__DisplayClass0_0'::disposable
			IL_004e: brfalse.s IL_005b
			IL_0050: ldloc.0
			IL_0051: ldfld class Program/Disposable Program/'<>c__DisplayClass0_0'::disposable
			IL_0056: callvirt instance void [mscorlib]System.IDisposable::Dispose()
			IL_005b: endfinally
		} // end handler
		IL_005c: ldloc.1
		IL_005d: ldc.i4.0
		IL_005e: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
		IL_0063: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_0068: ret
	} // end of method Program::Main
} // end of class Program");
        }
 
        [Fact]
        public void IfInUsingInForeachInForCorrectDisplayClassesAreCreated()
        {
            var source =
    @"using System;
using System.Collections.Generic;
using System.Linq;
 
public static class Program
{
	public static void Main()
	{
		var actions = new List<Action>();
		var strings = new List<string>() { ""one"", ""two"", ""three"" };
 
		
	    foreach(var i in Enumerable.Range(0,1))
            for (var j = 0; j < strings.Count; j++)
				using (var disposable = new Disposable())
					if(j is int x)
						actions.Add(0 is int y ? (Action)(() =>
						{
							Console.WriteLine(disposable.ToString());
							Console.WriteLine(strings[j - x - 1 + i + y]);
						}) : () => { });
 
		actions[0]();
		actions[1]();
		actions[2]();
	}
 
	public class Disposable : IDisposable
	{
		public void Dispose() { }
	}
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"Program+Disposable
three
Program+Disposable
two
Program+Disposable
one");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested public auto ansi beforefieldinit Disposable
		extends [mscorlib]System.Object
		implements [mscorlib]System.IDisposable
	{
		// Methods
		.method public final hidebysig newslot virtual 
			instance void Dispose () cil managed 
		{
			// Method begins at RVA 0x21b0
			// Code size 1 (0x1)
			.maxstack 8
			IL_0000: ret
		} // end of method Disposable::Dispose
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x21b2
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method Disposable::.ctor
	} // end of class Disposable
	.class nested private auto ansi sealed serializable beforefieldinit '<>c'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public static initonly class Program/'<>c' '<>9'
		.field public static class [mscorlib]System.Action '<>9__0_1'
		// Methods
		.method private hidebysig specialname rtspecialname static 
			void .cctor () cil managed 
		{
			// Method begins at RVA 0x21ba
			// Code size 11 (0xb)
			.maxstack 8
			IL_0000: newobj instance void Program/'<>c'::.ctor()
			IL_0005: stsfld class Program/'<>c' Program/'<>c'::'<>9'
			IL_000a: ret
		} // end of method '<>c'::.cctor
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x21b2
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0_1' () cil managed 
		{
			// Method begins at RVA 0x21b0
			// Code size 1 (0x1)
			.maxstack 8
			IL_0000: ret
		} // end of method '<>c'::'<Main>b__0_1'
	} // end of class <>c
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public class [mscorlib]System.Collections.Generic.List`1<string> strings
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x21b2
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
	} // end of class <>c__DisplayClass0_0
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_1'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 i
		.field public int32 j
		.field public class Program/'<>c__DisplayClass0_0' 'CS$<>8__locals1'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x21b2
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_1'::.ctor
	} // end of class <>c__DisplayClass0_1
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_2'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public class Program/Disposable disposable
		.field public int32 x
		.field public int32 y
		.field public class Program/'<>c__DisplayClass0_1' 'CS$<>8__locals2'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x21b2
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_2'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x21c8
			// Code size 82 (0x52)
			.maxstack 3
			IL_0000: ldarg.0
			IL_0001: ldfld class Program/Disposable Program/'<>c__DisplayClass0_2'::disposable
			IL_0006: callvirt instance string [mscorlib]System.Object::ToString()
			IL_000b: call void [mscorlib]System.Console::WriteLine(string)
			IL_0010: ldarg.0
			IL_0011: ldfld class Program/'<>c__DisplayClass0_1' Program/'<>c__DisplayClass0_2'::'CS$<>8__locals2'
			IL_0016: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_001b: ldfld class [mscorlib]System.Collections.Generic.List`1<string> Program/'<>c__DisplayClass0_0'::strings
			IL_0020: ldarg.0
			IL_0021: ldfld class Program/'<>c__DisplayClass0_1' Program/'<>c__DisplayClass0_2'::'CS$<>8__locals2'
			IL_0026: ldfld int32 Program/'<>c__DisplayClass0_1'::j
			IL_002b: ldarg.0
			IL_002c: ldfld int32 Program/'<>c__DisplayClass0_2'::x
			IL_0031: sub
			IL_0032: ldc.i4.1
			IL_0033: sub
			IL_0034: ldarg.0
			IL_0035: ldfld class Program/'<>c__DisplayClass0_1' Program/'<>c__DisplayClass0_2'::'CS$<>8__locals2'
			IL_003a: ldfld int32 Program/'<>c__DisplayClass0_1'::i
			IL_003f: add
			IL_0040: ldarg.0
			IL_0041: ldfld int32 Program/'<>c__DisplayClass0_2'::y
			IL_0046: add
			IL_0047: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<string>::get_Item(int32)
			IL_004c: call void [mscorlib]System.Console::WriteLine(string)
			IL_0051: ret
		} // end of method '<>c__DisplayClass0_2'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_2
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 310 (0x136)
		.maxstack 4
		.entrypoint
		.locals init (
			[0] class Program/'<>c__DisplayClass0_0',
			[1] class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>,
			[2] class [mscorlib]System.Collections.Generic.IEnumerator`1<int32>,
			[3] class Program/'<>c__DisplayClass0_1',
			[4] class Program/'<>c__DisplayClass0_2',
			[5] int32
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: newobj instance void class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::.ctor()
		IL_000b: stloc.1
		IL_000c: ldloc.0
		IL_000d: newobj instance void class [mscorlib]System.Collections.Generic.List`1<string>::.ctor()
		IL_0012: dup
		IL_0013: ldstr ""one""
		IL_0018: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
		IL_001d: dup
		IL_001e: ldstr ""two""
		IL_0023: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
		IL_0028: dup
		IL_0029: ldstr ""three""
		IL_002e: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
		IL_0033: stfld class [mscorlib]System.Collections.Generic.List`1<string> Program/'<>c__DisplayClass0_0'::strings
		IL_0038: ldc.i4.0
		IL_0039: ldc.i4.1
		IL_003a: call class [mscorlib]System.Collections.Generic.IEnumerable`1<int32> [System.Core]System.Linq.Enumerable::Range(int32, int32)
		IL_003f: callvirt instance class [mscorlib]System.Collections.Generic.IEnumerator`1<!0> class [mscorlib]System.Collections.Generic.IEnumerable`1<int32>::GetEnumerator()
		IL_0044: stloc.2
		.try
		{
			IL_0045: br IL_00fa
			// loop start (head: IL_00fa)
				IL_004a: newobj instance void Program/'<>c__DisplayClass0_1'::.ctor()
				IL_004f: stloc.3
				IL_0050: ldloc.3
				IL_0051: ldloc.0
				IL_0052: stfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
				IL_0057: ldloc.3
				IL_0058: ldloc.2
				IL_0059: callvirt instance !0 class [mscorlib]System.Collections.Generic.IEnumerator`1<int32>::get_Current()
				IL_005e: stfld int32 Program/'<>c__DisplayClass0_1'::i
				IL_0063: ldloc.3
				IL_0064: ldc.i4.0
				IL_0065: stfld int32 Program/'<>c__DisplayClass0_1'::j
				IL_006a: br.s IL_00df
				// loop start (head: IL_00df)
					IL_006c: newobj instance void Program/'<>c__DisplayClass0_2'::.ctor()
					IL_0071: stloc.s 4
					IL_0073: ldloc.s 4
					IL_0075: ldloc.3
					IL_0076: stfld class Program/'<>c__DisplayClass0_1' Program/'<>c__DisplayClass0_2'::'CS$<>8__locals2'
					IL_007b: ldloc.s 4
					IL_007d: newobj instance void Program/Disposable::.ctor()
					IL_0082: stfld class Program/Disposable Program/'<>c__DisplayClass0_2'::disposable
					.try
					{
						IL_0087: ldloc.s 4
						IL_0089: ldloc.s 4
						IL_008b: ldfld class Program/'<>c__DisplayClass0_1' Program/'<>c__DisplayClass0_2'::'CS$<>8__locals2'
						IL_0090: ldfld int32 Program/'<>c__DisplayClass0_1'::j
						IL_0095: stfld int32 Program/'<>c__DisplayClass0_2'::x
						IL_009a: ldloc.1
						IL_009b: ldloc.s 4
						IL_009d: ldc.i4.0
						IL_009e: stfld int32 Program/'<>c__DisplayClass0_2'::y
						IL_00a3: ldloc.s 4
						IL_00a5: ldftn instance void Program/'<>c__DisplayClass0_2'::'<Main>b__0'()
						IL_00ab: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
						IL_00b0: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::Add(!0)
						IL_00b5: leave.s IL_00cd
					} // end .try
					finally
					{
						IL_00b7: ldloc.s 4
						IL_00b9: ldfld class Program/Disposable Program/'<>c__DisplayClass0_2'::disposable
						IL_00be: brfalse.s IL_00cc
						IL_00c0: ldloc.s 4
						IL_00c2: ldfld class Program/Disposable Program/'<>c__DisplayClass0_2'::disposable
						IL_00c7: callvirt instance void [mscorlib]System.IDisposable::Dispose()
						IL_00cc: endfinally
					} // end handler
					IL_00cd: ldloc.3
					IL_00ce: ldfld int32 Program/'<>c__DisplayClass0_1'::j
					IL_00d3: stloc.s 5
					IL_00d5: ldloc.3
					IL_00d6: ldloc.s 5
					IL_00d8: ldc.i4.1
					IL_00d9: add
					IL_00da: stfld int32 Program/'<>c__DisplayClass0_1'::j
					IL_00df: ldloc.3
					IL_00e0: ldfld int32 Program/'<>c__DisplayClass0_1'::j
					IL_00e5: ldloc.3
					IL_00e6: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
					IL_00eb: ldfld class [mscorlib]System.Collections.Generic.List`1<string> Program/'<>c__DisplayClass0_0'::strings
					IL_00f0: callvirt instance int32 class [mscorlib]System.Collections.Generic.List`1<string>::get_Count()
					IL_00f5: blt IL_006c
				// end loop
				IL_00fa: ldloc.2
				IL_00fb: callvirt instance bool [mscorlib]System.Collections.IEnumerator::MoveNext()
				IL_0100: brtrue IL_004a
			// end loop
			IL_0105: leave.s IL_0111
		} // end .try
		finally
		{
			IL_0107: ldloc.2
			IL_0108: brfalse.s IL_0110
			IL_010a: ldloc.2
			IL_010b: callvirt instance void [mscorlib]System.IDisposable::Dispose()
			IL_0110: endfinally
		} // end handler
		IL_0111: ldloc.1
		IL_0112: ldc.i4.0
		IL_0113: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
		IL_0118: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_011d: ldloc.1
		IL_011e: ldc.i4.1
		IL_011f: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
		IL_0124: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_0129: ldloc.1
		IL_012a: ldc.i4.2
		IL_012b: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
		IL_0130: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_0135: ret
	} // end of method Program::Main
} // end of class Program");
        }
 
        [Fact]
        public void WhileCorrectDisplayClassesAreCreated()
        {
            var source =
                @"using System;
using System.Collections.Generic;
 
public static class Program
{
	public static void Main()
	{
		var actions = new List<Action>();
		var strings = new List<string>() { ""one"", ""two"", ""three"" };
 
		int i = 0;
		while(i is int j && i++ < 3)
			actions.Add(0 is int x ? (Action)(() => Console.WriteLine(strings[j + x])) : () => { });
 
		actions[0]();
		actions[1]();
		actions[2]();
	}
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"one
two
three");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed serializable beforefieldinit '<>c'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public static initonly class Program/'<>c' '<>9'
		.field public static class [mscorlib]System.Action '<>9__0_1'
		// Methods
		.method private hidebysig specialname rtspecialname static 
			void .cctor () cil managed 
		{
			// Method begins at RVA 0x20f2
			// Code size 11 (0xb)
			.maxstack 8
			IL_0000: newobj instance void Program/'<>c'::.ctor()
			IL_0005: stsfld class Program/'<>c' Program/'<>c'::'<>9'
			IL_000a: ret
		} // end of method '<>c'::.cctor
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x20fe
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0_1' () cil managed 
		{
			// Method begins at RVA 0x2106
			// Code size 1 (0x1)
			.maxstack 8
			IL_0000: ret
		} // end of method '<>c'::'<Main>b__0_1'
	} // end of class <>c
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public class [mscorlib]System.Collections.Generic.List`1<string> strings
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x20fe
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
	} // end of class <>c__DisplayClass0_0
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_1'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 j
		.field public int32 x
		.field public class Program/'<>c__DisplayClass0_0' 'CS$<>8__locals1'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x20fe
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_1'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x2108
			// Code size 35 (0x23)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0006: ldfld class [mscorlib]System.Collections.Generic.List`1<string> Program/'<>c__DisplayClass0_0'::strings
			IL_000b: ldarg.0
			IL_000c: ldfld int32 Program/'<>c__DisplayClass0_1'::j
			IL_0011: ldarg.0
			IL_0012: ldfld int32 Program/'<>c__DisplayClass0_1'::x
			IL_0017: add
			IL_0018: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<string>::get_Item(int32)
			IL_001d: call void [mscorlib]System.Console::WriteLine(string)
			IL_0022: ret
		} // end of method '<>c__DisplayClass0_1'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_1
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 150 (0x96)
		.maxstack 4
		.entrypoint
		.locals init (
			[0] class Program/'<>c__DisplayClass0_0',
			[1] class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>,
			[2] int32,
			[3] class Program/'<>c__DisplayClass0_1'
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: newobj instance void class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::.ctor()
		IL_000b: stloc.1
		IL_000c: ldloc.0
		IL_000d: newobj instance void class [mscorlib]System.Collections.Generic.List`1<string>::.ctor()
		IL_0012: dup
		IL_0013: ldstr ""one""
		IL_0018: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
		IL_001d: dup
		IL_001e: ldstr ""two""
		IL_0023: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
		IL_0028: dup
		IL_0029: ldstr ""three""
		IL_002e: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
		IL_0033: stfld class [mscorlib]System.Collections.Generic.List`1<string> Program/'<>c__DisplayClass0_0'::strings
		IL_0038: ldc.i4.0
		IL_0039: stloc.2
		// loop start (head: IL_003a)
			IL_003a: newobj instance void Program/'<>c__DisplayClass0_1'::.ctor()
			IL_003f: stloc.3
			IL_0040: ldloc.3
			IL_0041: ldloc.0
			IL_0042: stfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0047: ldloc.3
			IL_0048: ldloc.2
			IL_0049: stfld int32 Program/'<>c__DisplayClass0_1'::j
			IL_004e: ldloc.2
			IL_004f: dup
			IL_0050: ldc.i4.1
			IL_0051: add
			IL_0052: stloc.2
			IL_0053: ldc.i4.3
			IL_0054: bge.s IL_0071
			IL_0056: ldloc.1
			IL_0057: ldloc.3
			IL_0058: ldc.i4.0
			IL_0059: stfld int32 Program/'<>c__DisplayClass0_1'::x
			IL_005e: ldloc.3
			IL_005f: ldftn instance void Program/'<>c__DisplayClass0_1'::'<Main>b__0'()
			IL_0065: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
			IL_006a: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::Add(!0)
			IL_006f: br.s IL_003a
		// end loop
		IL_0071: ldloc.1
		IL_0072: ldc.i4.0
		IL_0073: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
		IL_0078: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_007d: ldloc.1
		IL_007e: ldc.i4.1
		IL_007f: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
		IL_0084: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_0089: ldloc.1
		IL_008a: ldc.i4.2
		IL_008b: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
		IL_0090: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_0095: ret
	} // end of method Program::Main
} // end of class Program");
        }
 
        [Fact]
        public void ForWithVariableDeclaredInInvocationExpressionInIteratorCorrectDisplayClassesAreCreated()
        {
            var source =
                @"using System;
using System.Collections.Generic;
 
public static class Program
{
	public static void Main()
	{
        var actions = new List<Action>();
        var strings = new List<string>() { ""one"", ""two"", ""three"" };
 
		for (int i = 0; ++i < 3; actions.Add(i is int j ? (Action)(() => { Console.WriteLine(strings[i - j - 1]); }) : () => { })) ;
 
		actions[0]();
		actions[1]();
    }
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"two
one");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed serializable beforefieldinit '<>c'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public static initonly class Program/'<>c' '<>9'
		.field public static class [mscorlib]System.Action '<>9__0_1'
		// Methods
		.method private hidebysig specialname rtspecialname static 
			void .cctor () cil managed 
		{
			// Method begins at RVA 0x20fa
			// Code size 11 (0xb)
			.maxstack 8
			IL_0000: newobj instance void Program/'<>c'::.ctor()
			IL_0005: stsfld class Program/'<>c' Program/'<>c'::'<>9'
			IL_000a: ret
		} // end of method '<>c'::.cctor
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2106
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0_1' () cil managed 
		{
			// Method begins at RVA 0x210e
			// Code size 1 (0x1)
			.maxstack 8
			IL_0000: ret
		} // end of method '<>c'::'<Main>b__0_1'
	} // end of class <>c
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public class [mscorlib]System.Collections.Generic.List`1<string> strings
		.field public int32 i
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2106
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
	} // end of class <>c__DisplayClass0_0
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_1'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 j
		.field public class Program/'<>c__DisplayClass0_0' 'CS$<>8__locals1'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2106
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_1'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x2110
			// Code size 42 (0x2a)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0006: ldfld class [mscorlib]System.Collections.Generic.List`1<string> Program/'<>c__DisplayClass0_0'::strings
			IL_000b: ldarg.0
			IL_000c: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0011: ldfld int32 Program/'<>c__DisplayClass0_0'::i
			IL_0016: ldarg.0
			IL_0017: ldfld int32 Program/'<>c__DisplayClass0_1'::j
			IL_001c: sub
			IL_001d: ldc.i4.1
			IL_001e: sub
			IL_001f: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<string>::get_Item(int32)
			IL_0024: call void [mscorlib]System.Console::WriteLine(string)
			IL_0029: ret
		} // end of method '<>c__DisplayClass0_1'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_1
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 158 (0x9e)
		.maxstack 4
		.entrypoint
		.locals init (
			[0] class Program/'<>c__DisplayClass0_0',
			[1] class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>,
			[2] class Program/'<>c__DisplayClass0_1',
			[3] int32
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: newobj instance void class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::.ctor()
		IL_000b: stloc.1
		IL_000c: ldloc.0
		IL_000d: newobj instance void class [mscorlib]System.Collections.Generic.List`1<string>::.ctor()
		IL_0012: dup
		IL_0013: ldstr ""one""
		IL_0018: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
		IL_001d: dup
		IL_001e: ldstr ""two""
		IL_0023: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
		IL_0028: dup
		IL_0029: ldstr ""three""
		IL_002e: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
		IL_0033: stfld class [mscorlib]System.Collections.Generic.List`1<string> Program/'<>c__DisplayClass0_0'::strings
		IL_0038: ldloc.0
		IL_0039: ldc.i4.0
		IL_003a: stfld int32 Program/'<>c__DisplayClass0_0'::i
		IL_003f: br.s IL_0071
		// loop start (head: IL_0071)
			IL_0041: newobj instance void Program/'<>c__DisplayClass0_1'::.ctor()
			IL_0046: stloc.2
			IL_0047: ldloc.2
			IL_0048: ldloc.0
			IL_0049: stfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_004e: ldloc.1
			IL_004f: ldloc.2
			IL_0050: ldloc.2
			IL_0051: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0056: ldfld int32 Program/'<>c__DisplayClass0_0'::i
			IL_005b: stfld int32 Program/'<>c__DisplayClass0_1'::j
			IL_0060: ldloc.2
			IL_0061: ldftn instance void Program/'<>c__DisplayClass0_1'::'<Main>b__0'()
			IL_0067: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
			IL_006c: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::Add(!0)
			IL_0071: ldloc.0
			IL_0072: ldfld int32 Program/'<>c__DisplayClass0_0'::i
			IL_0077: ldc.i4.1
			IL_0078: add
			IL_0079: stloc.3
			IL_007a: ldloc.0
			IL_007b: ldloc.3
			IL_007c: stfld int32 Program/'<>c__DisplayClass0_0'::i
			IL_0081: ldloc.3
			IL_0082: ldc.i4.3
			IL_0083: blt.s IL_0041
		// end loop
		IL_0085: ldloc.1
		IL_0086: ldc.i4.0
		IL_0087: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
		IL_008c: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_0091: ldloc.1
		IL_0092: ldc.i4.1
		IL_0093: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
		IL_0098: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_009d: ret
	} // end of method Program::Main
} // end of class Program");
        }
 
        [Fact]
        public void ForWithVariableDeclaredInSimpleAssignmentExpressionInIteratorCorrectDisplayClassesAreCreated()
        {
            var source =
                @"using System;
using System.Collections.Generic;
 
public static class Program
{
	public static void Main()
	{
        var strings = new List<string>() { ""one"", ""two"", ""three"" };
 
        Action action = null;
		for (int i = 0; ++i < 2; action = i is int j ? (Action)(() => { Console.WriteLine(strings[i - j - 1]); }) : () => { }) ;
        action();
    }
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"one");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed serializable beforefieldinit '<>c'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public static initonly class Program/'<>c' '<>9'
		.field public static class [mscorlib]System.Action '<>9__0_1'
		// Methods
		.method private hidebysig specialname rtspecialname static 
			void .cctor () cil managed 
		{
			// Method begins at RVA 0x20df
			// Code size 11 (0xb)
			.maxstack 8
			IL_0000: newobj instance void Program/'<>c'::.ctor()
			IL_0005: stsfld class Program/'<>c' Program/'<>c'::'<>9'
			IL_000a: ret
		} // end of method '<>c'::.cctor
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x20eb
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0_1' () cil managed 
		{
			// Method begins at RVA 0x20f3
			// Code size 1 (0x1)
			.maxstack 8
			IL_0000: ret
		} // end of method '<>c'::'<Main>b__0_1'
	} // end of class <>c
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public class [mscorlib]System.Collections.Generic.List`1<string> strings
		.field public int32 i
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x20eb
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
	} // end of class <>c__DisplayClass0_0
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_1'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 j
		.field public class Program/'<>c__DisplayClass0_0' 'CS$<>8__locals1'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x20eb
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_1'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x20f5
			// Code size 42 (0x2a)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0006: ldfld class [mscorlib]System.Collections.Generic.List`1<string> Program/'<>c__DisplayClass0_0'::strings
			IL_000b: ldarg.0
			IL_000c: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0011: ldfld int32 Program/'<>c__DisplayClass0_0'::i
			IL_0016: ldarg.0
			IL_0017: ldfld int32 Program/'<>c__DisplayClass0_1'::j
			IL_001c: sub
			IL_001d: ldc.i4.1
			IL_001e: sub
			IL_001f: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<string>::get_Item(int32)
			IL_0024: call void [mscorlib]System.Console::WriteLine(string)
			IL_0029: ret
		} // end of method '<>c__DisplayClass0_1'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_1
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 131 (0x83)
		.maxstack 4
		.entrypoint
		.locals init (
			[0] class Program/'<>c__DisplayClass0_0',
			[1] class [mscorlib]System.Action,
			[2] class Program/'<>c__DisplayClass0_1',
			[3] int32
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: ldloc.0
		IL_0007: newobj instance void class [mscorlib]System.Collections.Generic.List`1<string>::.ctor()
		IL_000c: dup
		IL_000d: ldstr ""one""
		IL_0012: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
		IL_0017: dup
		IL_0018: ldstr ""two""
		IL_001d: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
		IL_0022: dup
		IL_0023: ldstr ""three""
		IL_0028: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
		IL_002d: stfld class [mscorlib]System.Collections.Generic.List`1<string> Program/'<>c__DisplayClass0_0'::strings
		IL_0032: ldnull
		IL_0033: stloc.1
		IL_0034: ldloc.0
		IL_0035: ldc.i4.0
		IL_0036: stfld int32 Program/'<>c__DisplayClass0_0'::i
		IL_003b: br.s IL_0068
		// loop start (head: IL_0068)
			IL_003d: newobj instance void Program/'<>c__DisplayClass0_1'::.ctor()
			IL_0042: stloc.2
			IL_0043: ldloc.2
			IL_0044: ldloc.0
			IL_0045: stfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_004a: ldloc.2
			IL_004b: ldloc.2
			IL_004c: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0051: ldfld int32 Program/'<>c__DisplayClass0_0'::i
			IL_0056: stfld int32 Program/'<>c__DisplayClass0_1'::j
			IL_005b: ldloc.2
			IL_005c: ldftn instance void Program/'<>c__DisplayClass0_1'::'<Main>b__0'()
			IL_0062: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
			IL_0067: stloc.1
			IL_0068: ldloc.0
			IL_0069: ldfld int32 Program/'<>c__DisplayClass0_0'::i
			IL_006e: ldc.i4.1
			IL_006f: add
			IL_0070: stloc.3
			IL_0071: ldloc.0
			IL_0072: ldloc.3
			IL_0073: stfld int32 Program/'<>c__DisplayClass0_0'::i
			IL_0078: ldloc.3
			IL_0079: ldc.i4.2
			IL_007a: blt.s IL_003d
		// end loop
		IL_007c: ldloc.1
		IL_007d: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_0082: ret
	} // end of method Program::Main
} // end of class Program");
        }
 
        [Fact]
        public void ForWithVariableDeclaredInConditionCorrectDisplayClassesAreCreated()
        {
            var source =
                @"using System;
using System.Collections.Generic;
 
public static class Program
{
	public static void Main()
	{
		var strings = new List<string>() { ""one"" };
 
 
            Action action = null;
            for (int i = 0; i is int j && null == (action = () => { Console.WriteLine(strings[i + j]); });) break; ;
            action();
        }
    }";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"one");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public class [mscorlib]System.Collections.Generic.List`1<string> strings
		.field public int32 i
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x20b5
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
	} // end of class <>c__DisplayClass0_0
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_1'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 j
		.field public class Program/'<>c__DisplayClass0_0' 'CS$<>8__locals1'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x20b5
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_1'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x20bd
			// Code size 40 (0x28)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0006: ldfld class [mscorlib]System.Collections.Generic.List`1<string> Program/'<>c__DisplayClass0_0'::strings
			IL_000b: ldarg.0
			IL_000c: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0011: ldfld int32 Program/'<>c__DisplayClass0_0'::i
			IL_0016: ldarg.0
			IL_0017: ldfld int32 Program/'<>c__DisplayClass0_1'::j
			IL_001c: add
			IL_001d: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<string>::get_Item(int32)
			IL_0022: call void [mscorlib]System.Console::WriteLine(string)
			IL_0027: ret
		} // end of method '<>c__DisplayClass0_1'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_1
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 89 (0x59)
		.maxstack 4
		.entrypoint
		.locals init (
			[0] class Program/'<>c__DisplayClass0_0',
			[1] class [mscorlib]System.Action,
			[2] class Program/'<>c__DisplayClass0_1'
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: ldloc.0
		IL_0007: newobj instance void class [mscorlib]System.Collections.Generic.List`1<string>::.ctor()
		IL_000c: dup
		IL_000d: ldstr ""one""
		IL_0012: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
		IL_0017: stfld class [mscorlib]System.Collections.Generic.List`1<string> Program/'<>c__DisplayClass0_0'::strings
		IL_001c: ldnull
		IL_001d: stloc.1
		IL_001e: ldloc.0
		IL_001f: ldc.i4.0
		IL_0020: stfld int32 Program/'<>c__DisplayClass0_0'::i
		IL_0025: newobj instance void Program/'<>c__DisplayClass0_1'::.ctor()
		IL_002a: stloc.2
		IL_002b: ldloc.2
		IL_002c: ldloc.0
		IL_002d: stfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
		IL_0032: ldloc.2
		IL_0033: ldloc.2
		IL_0034: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
		IL_0039: ldfld int32 Program/'<>c__DisplayClass0_0'::i
		IL_003e: stfld int32 Program/'<>c__DisplayClass0_1'::j
		IL_0043: ldloc.2
		IL_0044: ldftn instance void Program/'<>c__DisplayClass0_1'::'<Main>b__0'()
		IL_004a: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
		IL_004f: dup
		IL_0050: stloc.1
		IL_0051: pop
		IL_0052: ldloc.1
		IL_0053: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_0058: ret
	} // end of method Program::Main
} // end of class Program");
        }
 
        [Fact]
        public void ForWithVariableDeclaredInConditionAndNoneInInitializerCorrectDisplayClassesAreCreated()
        {
            var source =
                @"using System;
using System.Collections.Generic;
 
public static class Program
{
	public static void Main()
	{
		var strings = new List<string>() { ""one"" };
 
 
            Action action = null;
            int i = 0;
            for (; i is int j && null == (action = () => { Console.WriteLine(strings[i + j]); });) break; ;
            action();
        }
    }";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"one");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public class [mscorlib]System.Collections.Generic.List`1<string> strings
		.field public int32 i
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x20b5
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
	} // end of class <>c__DisplayClass0_0
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_1'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 j
		.field public class Program/'<>c__DisplayClass0_0' 'CS$<>8__locals1'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x20b5
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_1'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x20bd
			// Code size 40 (0x28)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0006: ldfld class [mscorlib]System.Collections.Generic.List`1<string> Program/'<>c__DisplayClass0_0'::strings
			IL_000b: ldarg.0
			IL_000c: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0011: ldfld int32 Program/'<>c__DisplayClass0_0'::i
			IL_0016: ldarg.0
			IL_0017: ldfld int32 Program/'<>c__DisplayClass0_1'::j
			IL_001c: add
			IL_001d: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<string>::get_Item(int32)
			IL_0022: call void [mscorlib]System.Console::WriteLine(string)
			IL_0027: ret
		} // end of method '<>c__DisplayClass0_1'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_1
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 89 (0x59)
		.maxstack 4
		.entrypoint
		.locals init (
			[0] class Program/'<>c__DisplayClass0_0',
			[1] class [mscorlib]System.Action,
			[2] class Program/'<>c__DisplayClass0_1'
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: ldloc.0
		IL_0007: newobj instance void class [mscorlib]System.Collections.Generic.List`1<string>::.ctor()
		IL_000c: dup
		IL_000d: ldstr ""one""
		IL_0012: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
		IL_0017: stfld class [mscorlib]System.Collections.Generic.List`1<string> Program/'<>c__DisplayClass0_0'::strings
		IL_001c: ldnull
		IL_001d: stloc.1
		IL_001e: ldloc.0
		IL_001f: ldc.i4.0
		IL_0020: stfld int32 Program/'<>c__DisplayClass0_0'::i
		IL_0025: newobj instance void Program/'<>c__DisplayClass0_1'::.ctor()
		IL_002a: stloc.2
		IL_002b: ldloc.2
		IL_002c: ldloc.0
		IL_002d: stfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
		IL_0032: ldloc.2
		IL_0033: ldloc.2
		IL_0034: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
		IL_0039: ldfld int32 Program/'<>c__DisplayClass0_0'::i
		IL_003e: stfld int32 Program/'<>c__DisplayClass0_1'::j
		IL_0043: ldloc.2
		IL_0044: ldftn instance void Program/'<>c__DisplayClass0_1'::'<Main>b__0'()
		IL_004a: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
		IL_004f: dup
		IL_0050: stloc.1
		IL_0051: pop
		IL_0052: ldloc.1
		IL_0053: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_0058: ret
	} // end of method Program::Main
} // end of class Program
");
        }
 
        [Fact]
        public void DoWhileCorrectDisplayClassesAreCreated()
        {
            var source =
                @"using System;
using System.Collections.Generic;
 
public static class Program
{
	public static void Main()
	{
		var actions = new List<Action>();
		var strings = new List<string>() { ""one"", ""two"", ""three"" };
 
 
            int i = 0;
            do
                actions.Add(i is int x ? (Action)(() => Console.WriteLine(strings[i - x - 1])) : () => { });
            while (++i < 3);
 
 
            actions[0]();
            actions[1]();
            actions[2]();
        }
    }";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"three
two
one");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed serializable beforefieldinit '<>c'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public static initonly class Program/'<>c' '<>9'
		.field public static class [mscorlib]System.Action '<>9__0_1'
		// Methods
		.method private hidebysig specialname rtspecialname static 
			void .cctor () cil managed 
		{
			// Method begins at RVA 0x2104
			// Code size 11 (0xb)
			.maxstack 8
			IL_0000: newobj instance void Program/'<>c'::.ctor()
			IL_0005: stsfld class Program/'<>c' Program/'<>c'::'<>9'
			IL_000a: ret
		} // end of method '<>c'::.cctor
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2110
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0_1' () cil managed 
		{
			// Method begins at RVA 0x2118
			// Code size 1 (0x1)
			.maxstack 8
			IL_0000: ret
		} // end of method '<>c'::'<Main>b__0_1'
	} // end of class <>c
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public class [mscorlib]System.Collections.Generic.List`1<string> strings
		.field public int32 i
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2110
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
	} // end of class <>c__DisplayClass0_0
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_1'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 x
		.field public class Program/'<>c__DisplayClass0_0' 'CS$<>8__locals1'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2110
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_1'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x211a
			// Code size 42 (0x2a)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0006: ldfld class [mscorlib]System.Collections.Generic.List`1<string> Program/'<>c__DisplayClass0_0'::strings
			IL_000b: ldarg.0
			IL_000c: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0011: ldfld int32 Program/'<>c__DisplayClass0_0'::i
			IL_0016: ldarg.0
			IL_0017: ldfld int32 Program/'<>c__DisplayClass0_1'::x
			IL_001c: sub
			IL_001d: ldc.i4.1
			IL_001e: sub
			IL_001f: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<string>::get_Item(int32)
			IL_0024: call void [mscorlib]System.Console::WriteLine(string)
			IL_0029: ret
		} // end of method '<>c__DisplayClass0_1'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_1
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 168 (0xa8)
		.maxstack 4
		.entrypoint
		.locals init (
			[0] class Program/'<>c__DisplayClass0_0',
			[1] class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>,
			[2] class Program/'<>c__DisplayClass0_1',
			[3] int32
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: newobj instance void class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::.ctor()
		IL_000b: stloc.1
		IL_000c: ldloc.0
		IL_000d: newobj instance void class [mscorlib]System.Collections.Generic.List`1<string>::.ctor()
		IL_0012: dup
		IL_0013: ldstr ""one""
		IL_0018: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
		IL_001d: dup
		IL_001e: ldstr ""two""
		IL_0023: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
		IL_0028: dup
		IL_0029: ldstr ""three""
		IL_002e: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
		IL_0033: stfld class [mscorlib]System.Collections.Generic.List`1<string> Program/'<>c__DisplayClass0_0'::strings
		IL_0038: ldloc.0
		IL_0039: ldc.i4.0
		IL_003a: stfld int32 Program/'<>c__DisplayClass0_0'::i
		// loop start (head: IL_003f)
			IL_003f: newobj instance void Program/'<>c__DisplayClass0_1'::.ctor()
			IL_0044: stloc.2
			IL_0045: ldloc.2
			IL_0046: ldloc.0
			IL_0047: stfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_004c: ldloc.1
			IL_004d: ldloc.2
			IL_004e: ldloc.2
			IL_004f: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0054: ldfld int32 Program/'<>c__DisplayClass0_0'::i
			IL_0059: stfld int32 Program/'<>c__DisplayClass0_1'::x
			IL_005e: ldloc.2
			IL_005f: ldftn instance void Program/'<>c__DisplayClass0_1'::'<Main>b__0'()
			IL_0065: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
			IL_006a: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::Add(!0)
			IL_006f: ldloc.0
			IL_0070: ldfld int32 Program/'<>c__DisplayClass0_0'::i
			IL_0075: ldc.i4.1
			IL_0076: add
			IL_0077: stloc.3
			IL_0078: ldloc.0
			IL_0079: ldloc.3
			IL_007a: stfld int32 Program/'<>c__DisplayClass0_0'::i
			IL_007f: ldloc.3
			IL_0080: ldc.i4.3
			IL_0081: blt.s IL_003f
		// end loop
		IL_0083: ldloc.1
		IL_0084: ldc.i4.0
		IL_0085: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
		IL_008a: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_008f: ldloc.1
		IL_0090: ldc.i4.1
		IL_0091: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
		IL_0096: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_009b: ldloc.1
		IL_009c: ldc.i4.2
		IL_009d: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
		IL_00a2: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_00a7: ret
	} // end of method Program::Main
} // end of class Program");
        }
 
        [Fact]
        public void ScopeContainsBackwardsGoToMergeDisplayClasses()
        {
            var source =
               @"using System;
 
public static class Program
{
	public static void Main()
	{
		int a = 0;
		{
		    target: ;
			int b = 1;
			Action action = () => Console.WriteLine(a + b);
			action();
            return;
            goto target;
		}
        
	}
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"1");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 a
		.field public int32 b
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2082
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x208a
			// Code size 19 (0x13)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld int32 Program/'<>c__DisplayClass0_0'::a
			IL_0006: ldarg.0
			IL_0007: ldfld int32 Program/'<>c__DisplayClass0_0'::b
			IL_000c: add
			IL_000d: call void [mscorlib]System.Console::WriteLine(int32)
			IL_0012: ret
		} // end of method '<>c__DisplayClass0_0'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_0
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 38 (0x26)
		.maxstack 2
		.entrypoint
		.locals init (
			[0] class Program/'<>c__DisplayClass0_0'
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: ldloc.0
		IL_0007: ldc.i4.0
		IL_0008: stfld int32 Program/'<>c__DisplayClass0_0'::a
		IL_000d: ldloc.0
		IL_000e: ldc.i4.1
		IL_000f: stfld int32 Program/'<>c__DisplayClass0_0'::b
		IL_0014: ldloc.0
		IL_0015: ldftn instance void Program/'<>c__DisplayClass0_0'::'<Main>b__0'()
		IL_001b: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
		IL_0020: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_0025: ret
	} // end of method Program::Main
} // end of class Program");
        }
 
        [Fact]
        public void ScopeContainsForwardsGoToMergeDisplayClasses()
        {
            var source =
                @"using System;
 
public static class Program
{
	public static void Main()
	{
		int a = 0;
		{
		    goto target;
			int b = 1;
			Action action = () => Console.WriteLine(a + b);
			action();
		    target: ;
		}
	}
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 a
		.field public int32 b
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x206a
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x2072
			// Code size 19 (0x13)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld int32 Program/'<>c__DisplayClass0_0'::a
			IL_0006: ldarg.0
			IL_0007: ldfld int32 Program/'<>c__DisplayClass0_0'::b
			IL_000c: add
			IL_000d: call void [mscorlib]System.Console::WriteLine(int32)
			IL_0012: ret
		} // end of method '<>c__DisplayClass0_0'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_0
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 14 (0xe)
		.maxstack 2
		.entrypoint
		.locals init (
			[0] class Program/'<>c__DisplayClass0_0'
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: ldloc.0
		IL_0007: ldc.i4.0
		IL_0008: stfld int32 Program/'<>c__DisplayClass0_0'::a
		IL_000d: ret
	} // end of method Program::Main
} // end of class Program");
        }
 
        [Fact]
        public void ScopeContainsBackwardsGoToCaseMergeDisplayClasses()
        {
            var source =
                @"using System;
 
public static class Program
{
	public static void Main()
	{
		int a = 0;
        switch(a)
        {
            case 1:
            default:
			    int b = 1;
			    Action action = () => Console.WriteLine(a + b);
			    action();
                break;
            case 0:
                goto case 1;
 
        }
	}
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"1");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 a
		.field public int32 b
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2090
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x2098
			// Code size 19 (0x13)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld int32 Program/'<>c__DisplayClass0_0'::a
			IL_0006: ldarg.0
			IL_0007: ldfld int32 Program/'<>c__DisplayClass0_0'::b
			IL_000c: add
			IL_000d: call void [mscorlib]System.Console::WriteLine(int32)
			IL_0012: ret
		} // end of method '<>c__DisplayClass0_0'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_0
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 52 (0x34)
		.maxstack 2
		.entrypoint
		.locals init (
			[0] class Program/'<>c__DisplayClass0_0',
			[1] int32
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: ldloc.0
		IL_0007: ldc.i4.0
		IL_0008: stfld int32 Program/'<>c__DisplayClass0_0'::a
		IL_000d: ldloc.0
		IL_000e: ldfld int32 Program/'<>c__DisplayClass0_0'::a
		IL_0013: stloc.1
		IL_0014: ldloc.1
		IL_0015: brfalse.s IL_001b
		IL_0017: ldloc.1
		IL_0018: ldc.i4.1
		IL_0019: pop
		IL_001a: pop
		IL_001b: ldloc.0
		IL_001c: ldc.i4.1
		IL_001d: stfld int32 Program/'<>c__DisplayClass0_0'::b
		IL_0022: ldloc.0
		IL_0023: ldftn instance void Program/'<>c__DisplayClass0_0'::'<Main>b__0'()
		IL_0029: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
		IL_002e: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_0033: ret
	} // end of method Program::Main
} // end of class Program");
        }
 
        [Fact]
        public void ScopeContainsForwardsGoToCaseMergeDisplayClasses()
        {
            var source =
                @"using System;
 
public static class Program
{
	public static void Main()
	{
		int a = 0;
        switch(a)
        {
            case 0:
                goto case 1;
            case 1:
            default:
			    int b = 1;
			    Action action = () => Console.WriteLine(a + b);
			    action();
                break;
        }
	}
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"1");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 a
		.field public int32 b
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2090
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x2098
			// Code size 19 (0x13)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld int32 Program/'<>c__DisplayClass0_0'::a
			IL_0006: ldarg.0
			IL_0007: ldfld int32 Program/'<>c__DisplayClass0_0'::b
			IL_000c: add
			IL_000d: call void [mscorlib]System.Console::WriteLine(int32)
			IL_0012: ret
		} // end of method '<>c__DisplayClass0_0'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_0
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 52 (0x34)
		.maxstack 2
		.entrypoint
		.locals init (
			[0] class Program/'<>c__DisplayClass0_0',
			[1] int32
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: ldloc.0
		IL_0007: ldc.i4.0
		IL_0008: stfld int32 Program/'<>c__DisplayClass0_0'::a
		IL_000d: ldloc.0
		IL_000e: ldfld int32 Program/'<>c__DisplayClass0_0'::a
		IL_0013: stloc.1
		IL_0014: ldloc.1
		IL_0015: brfalse.s IL_001b
		IL_0017: ldloc.1
		IL_0018: ldc.i4.1
		IL_0019: pop
		IL_001a: pop
		IL_001b: ldloc.0
		IL_001c: ldc.i4.1
		IL_001d: stfld int32 Program/'<>c__DisplayClass0_0'::b
		IL_0022: ldloc.0
		IL_0023: ldftn instance void Program/'<>c__DisplayClass0_0'::'<Main>b__0'()
		IL_0029: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
		IL_002e: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_0033: ret
	} // end of method Program::Main
} // end of class Program");
        }
 
        [Fact]
        public void ScopeContainsBackwardsGoToDefaultMergeDisplayClasses()
        {
            var source =
                @"using System;
 
public static class Program
{
	public static void Main()
	{
		int a = 0;
        switch(a)
        {
            default:
			    int b = 1;
			    Action action = () => Console.WriteLine(a + b);
			    action();
                break;
            case 0:
                goto default;
        }
	}
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"1");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 a
		.field public int32 b
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2089
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x2091
			// Code size 19 (0x13)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld int32 Program/'<>c__DisplayClass0_0'::a
			IL_0006: ldarg.0
			IL_0007: ldfld int32 Program/'<>c__DisplayClass0_0'::b
			IL_000c: add
			IL_000d: call void [mscorlib]System.Console::WriteLine(int32)
			IL_0012: ret
		} // end of method '<>c__DisplayClass0_0'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_0
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 45 (0x2d)
		.maxstack 2
		.entrypoint
		.locals init (
			[0] class Program/'<>c__DisplayClass0_0'
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: ldloc.0
		IL_0007: ldc.i4.0
		IL_0008: stfld int32 Program/'<>c__DisplayClass0_0'::a
		IL_000d: ldloc.0
		IL_000e: ldfld int32 Program/'<>c__DisplayClass0_0'::a
		IL_0013: pop
		IL_0014: ldloc.0
		IL_0015: ldc.i4.1
		IL_0016: stfld int32 Program/'<>c__DisplayClass0_0'::b
		IL_001b: ldloc.0
		IL_001c: ldftn instance void Program/'<>c__DisplayClass0_0'::'<Main>b__0'()
		IL_0022: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
		IL_0027: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_002c: ret
	} // end of method Program::Main
} // end of class Program");
        }
 
        [Fact]
        public void ScopeContainsForwardsGoToDefaultMergeDisplayClasses()
        {
            var source =
                @"using System;
 
public static class Program
{
	public static void Main()
	{
		int a = 0;
        switch(a)
        {
            case 0:
			    int b = 1;
			    Action action = () => Console.WriteLine(a + b);
			    action();
                goto default;
            default:
                break;
        }
	}
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"1");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 a
		.field public int32 b
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x208a
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x2092
			// Code size 19 (0x13)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld int32 Program/'<>c__DisplayClass0_0'::a
			IL_0006: ldarg.0
			IL_0007: ldfld int32 Program/'<>c__DisplayClass0_0'::b
			IL_000c: add
			IL_000d: call void [mscorlib]System.Console::WriteLine(int32)
			IL_0012: ret
		} // end of method '<>c__DisplayClass0_0'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_0
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 46 (0x2e)
		.maxstack 2
		.entrypoint
		.locals init (
			[0] class Program/'<>c__DisplayClass0_0'
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: ldloc.0
		IL_0007: ldc.i4.0
		IL_0008: stfld int32 Program/'<>c__DisplayClass0_0'::a
		IL_000d: ldloc.0
		IL_000e: ldfld int32 Program/'<>c__DisplayClass0_0'::a
		IL_0013: brtrue.s IL_002d
		IL_0015: ldloc.0
		IL_0016: ldc.i4.1
		IL_0017: stfld int32 Program/'<>c__DisplayClass0_0'::b
		IL_001c: ldloc.0
		IL_001d: ldftn instance void Program/'<>c__DisplayClass0_0'::'<Main>b__0'()
		IL_0023: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
		IL_0028: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_002d: ret
	} // end of method Program::Main
} // end of class Program");
        }
 
        [Fact]
        public void ScopeContainsScopeContainingBackwardsGoToMergeDisplayClasses()
        {
            var source =
                @"using System;
 
public static class Program
{
	public static void Main()
	{
		int a = 0;
		{
            target: ;
			int b = 1;
			Action action = () => Console.WriteLine(a + b);
			action();
 
            return;
 
            {
		        goto target;
            }
		}
 
 
	}
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"1");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 a
		.field public int32 b
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2082
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x208a
			// Code size 19 (0x13)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld int32 Program/'<>c__DisplayClass0_0'::a
			IL_0006: ldarg.0
			IL_0007: ldfld int32 Program/'<>c__DisplayClass0_0'::b
			IL_000c: add
			IL_000d: call void [mscorlib]System.Console::WriteLine(int32)
			IL_0012: ret
		} // end of method '<>c__DisplayClass0_0'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_0
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 38 (0x26)
		.maxstack 2
		.entrypoint
		.locals init (
			[0] class Program/'<>c__DisplayClass0_0'
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: ldloc.0
		IL_0007: ldc.i4.0
		IL_0008: stfld int32 Program/'<>c__DisplayClass0_0'::a
		IL_000d: ldloc.0
		IL_000e: ldc.i4.1
		IL_000f: stfld int32 Program/'<>c__DisplayClass0_0'::b
		IL_0014: ldloc.0
		IL_0015: ldftn instance void Program/'<>c__DisplayClass0_0'::'<Main>b__0'()
		IL_001b: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
		IL_0020: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_0025: ret
	} // end of method Program::Main
} // end of class Program");
        }
 
        [Fact]
        public void BackwardsGoToToPointInBetweenScopeAndParentPreventsMerging01()
        {
            var source =
                @"using System;
 
public static class Program
{
	public static void Main()
	{
		int a = 0;
        target: ;
		{
			int b = 1;
			Action action = () => Console.WriteLine(a + b);
			action();
		}
 
        return;
		    
		goto target;
	}
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"1");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 a
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x208d
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
	} // end of class <>c__DisplayClass0_0
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_1'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 b
		.field public class Program/'<>c__DisplayClass0_0' 'CS$<>8__locals1'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x208d
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_1'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x2095
			// Code size 24 (0x18)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0006: ldfld int32 Program/'<>c__DisplayClass0_0'::a
			IL_000b: ldarg.0
			IL_000c: ldfld int32 Program/'<>c__DisplayClass0_1'::b
			IL_0011: add
			IL_0012: call void [mscorlib]System.Console::WriteLine(int32)
			IL_0017: ret
		} // end of method '<>c__DisplayClass0_1'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_1
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 49 (0x31)
		.maxstack 3
		.entrypoint
		.locals init (
			[0] class Program/'<>c__DisplayClass0_0'
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: ldloc.0
		IL_0007: ldc.i4.0
		IL_0008: stfld int32 Program/'<>c__DisplayClass0_0'::a
		IL_000d: newobj instance void Program/'<>c__DisplayClass0_1'::.ctor()
		IL_0012: dup
		IL_0013: ldloc.0
		IL_0014: stfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
		IL_0019: dup
		IL_001a: ldc.i4.1
		IL_001b: stfld int32 Program/'<>c__DisplayClass0_1'::b
		IL_0020: ldftn instance void Program/'<>c__DisplayClass0_1'::'<Main>b__0'()
		IL_0026: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
		IL_002b: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_0030: ret
	} // end of method Program::Main
} // end of class Program");
        }
 
        [Fact]
        public void BackwardsGoToToPointInBetweenScopeAndParentPreventsMerging02()
        {
            var source =
                @"using System;
 
public static class Program
{
	public static void Main()
	{
		int a = 0;
        target: ;
		{
			int b = 1;
			Action action = () => Console.WriteLine(a + b);
			action();
		}
 
        return;
		{  
		    goto target;
        }
	}
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"1");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 a
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x208d
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
	} // end of class <>c__DisplayClass0_0
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_1'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 b
		.field public class Program/'<>c__DisplayClass0_0' 'CS$<>8__locals1'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x208d
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_1'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x2095
			// Code size 24 (0x18)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0006: ldfld int32 Program/'<>c__DisplayClass0_0'::a
			IL_000b: ldarg.0
			IL_000c: ldfld int32 Program/'<>c__DisplayClass0_1'::b
			IL_0011: add
			IL_0012: call void [mscorlib]System.Console::WriteLine(int32)
			IL_0017: ret
		} // end of method '<>c__DisplayClass0_1'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_1
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 49 (0x31)
		.maxstack 3
		.entrypoint
		.locals init (
			[0] class Program/'<>c__DisplayClass0_0'
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: ldloc.0
		IL_0007: ldc.i4.0
		IL_0008: stfld int32 Program/'<>c__DisplayClass0_0'::a
		IL_000d: newobj instance void Program/'<>c__DisplayClass0_1'::.ctor()
		IL_0012: dup
		IL_0013: ldloc.0
		IL_0014: stfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
		IL_0019: dup
		IL_001a: ldc.i4.1
		IL_001b: stfld int32 Program/'<>c__DisplayClass0_1'::b
		IL_0020: ldftn instance void Program/'<>c__DisplayClass0_1'::'<Main>b__0'()
		IL_0026: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
		IL_002b: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_0030: ret
	} // end of method Program::Main
} // end of class Program");
        }
 
        [Fact]
        public void BackwardsGoToToPointInBetweenScopeAndParentPreventsMerging03()
        {
            var source =
                @"using System;
 
public static class Program
{
	public static void Main()
	{
		int a = 0;
        target: ;
		{
			int b = 1;
			Action action = () => Console.WriteLine(a + b);
			action();
 
            return;
 
		    goto target;
		}
	}
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"1");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 a
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x208d
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
	} // end of class <>c__DisplayClass0_0
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_1'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 b
		.field public class Program/'<>c__DisplayClass0_0' 'CS$<>8__locals1'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x208d
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_1'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x2095
			// Code size 24 (0x18)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0006: ldfld int32 Program/'<>c__DisplayClass0_0'::a
			IL_000b: ldarg.0
			IL_000c: ldfld int32 Program/'<>c__DisplayClass0_1'::b
			IL_0011: add
			IL_0012: call void [mscorlib]System.Console::WriteLine(int32)
			IL_0017: ret
		} // end of method '<>c__DisplayClass0_1'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_1
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 49 (0x31)
		.maxstack 3
		.entrypoint
		.locals init (
			[0] class Program/'<>c__DisplayClass0_0'
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: ldloc.0
		IL_0007: ldc.i4.0
		IL_0008: stfld int32 Program/'<>c__DisplayClass0_0'::a
		IL_000d: newobj instance void Program/'<>c__DisplayClass0_1'::.ctor()
		IL_0012: dup
		IL_0013: ldloc.0
		IL_0014: stfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
		IL_0019: dup
		IL_001a: ldc.i4.1
		IL_001b: stfld int32 Program/'<>c__DisplayClass0_1'::b
		IL_0020: ldftn instance void Program/'<>c__DisplayClass0_1'::'<Main>b__0'()
		IL_0026: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
		IL_002b: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_0030: ret
	} // end of method Program::Main
} // end of class Program");
        }
 
        [Fact]
        public void BackwardsGoToToPointInBetweenScopeAndParentPreventsMerging04()
        {
            var source =
                @"using System;
 
public static class Program
{
	public static void Main()
	{
		int a = 0;
        target: ;
		{
			int b = 1;
			Action action = () => Console.WriteLine(a + b);
			action();
 
            return;
 
		    {  
		        goto target;
            }
		}
	}
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"1");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 a
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x208d
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
	} // end of class <>c__DisplayClass0_0
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_1'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 b
		.field public class Program/'<>c__DisplayClass0_0' 'CS$<>8__locals1'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x208d
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_1'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x2095
			// Code size 24 (0x18)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0006: ldfld int32 Program/'<>c__DisplayClass0_0'::a
			IL_000b: ldarg.0
			IL_000c: ldfld int32 Program/'<>c__DisplayClass0_1'::b
			IL_0011: add
			IL_0012: call void [mscorlib]System.Console::WriteLine(int32)
			IL_0017: ret
		} // end of method '<>c__DisplayClass0_1'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_1
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 49 (0x31)
		.maxstack 3
		.entrypoint
		.locals init (
			[0] class Program/'<>c__DisplayClass0_0'
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: ldloc.0
		IL_0007: ldc.i4.0
		IL_0008: stfld int32 Program/'<>c__DisplayClass0_0'::a
		IL_000d: newobj instance void Program/'<>c__DisplayClass0_1'::.ctor()
		IL_0012: dup
		IL_0013: ldloc.0
		IL_0014: stfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
		IL_0019: dup
		IL_001a: ldc.i4.1
		IL_001b: stfld int32 Program/'<>c__DisplayClass0_1'::b
		IL_0020: ldftn instance void Program/'<>c__DisplayClass0_1'::'<Main>b__0'()
		IL_0026: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
		IL_002b: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_0030: ret
	} // end of method Program::Main
} // end of class Program");
        }
 
        [Fact]
        public void BackwardsGoToCaseToPointInBetweenScopeAndParentPreventsMerging()
        {
            var source =
                @"using System;
 
public static class Program
{
	public static void Main()
	{
		int a = 0;
        switch(a)
        {
            case 1:
            default:
                {
			        int b = 1;
			        Action action = () => Console.WriteLine(a + b);
			        action();
                    break;
                }
            case 0:
                goto case 1;
        }
	}
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"1");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 a
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x209b
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
	} // end of class <>c__DisplayClass0_0
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_1'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 b
		.field public class Program/'<>c__DisplayClass0_0' 'CS$<>8__locals1'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x209b
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_1'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x20a3
			// Code size 24 (0x18)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0006: ldfld int32 Program/'<>c__DisplayClass0_0'::a
			IL_000b: ldarg.0
			IL_000c: ldfld int32 Program/'<>c__DisplayClass0_1'::b
			IL_0011: add
			IL_0012: call void [mscorlib]System.Console::WriteLine(int32)
			IL_0017: ret
		} // end of method '<>c__DisplayClass0_1'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_1
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 63 (0x3f)
		.maxstack 3
		.entrypoint
		.locals init (
			[0] class Program/'<>c__DisplayClass0_0',
			[1] int32
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: ldloc.0
		IL_0007: ldc.i4.0
		IL_0008: stfld int32 Program/'<>c__DisplayClass0_0'::a
		IL_000d: ldloc.0
		IL_000e: ldfld int32 Program/'<>c__DisplayClass0_0'::a
		IL_0013: stloc.1
		IL_0014: ldloc.1
		IL_0015: brfalse.s IL_001b
		IL_0017: ldloc.1
		IL_0018: ldc.i4.1
		IL_0019: pop
		IL_001a: pop
		IL_001b: newobj instance void Program/'<>c__DisplayClass0_1'::.ctor()
		IL_0020: dup
		IL_0021: ldloc.0
		IL_0022: stfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
		IL_0027: dup
		IL_0028: ldc.i4.1
		IL_0029: stfld int32 Program/'<>c__DisplayClass0_1'::b
		IL_002e: ldftn instance void Program/'<>c__DisplayClass0_1'::'<Main>b__0'()
		IL_0034: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
		IL_0039: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_003e: ret
	} // end of method Program::Main
} // end of class Program");
        }
 
        [Fact]
        public void BackwardsGoToDefaultToPointInBetweenScopeAndParentPreventsMerging()
        {
            var source =
                @"using System;
 
public static class Program
{
	public static void Main()
	{
		int a = 0;
        switch(a)
        {
            default:
                {
			        int b = 1;
			        Action action = () => Console.WriteLine(a + b);
			        action();
                    break;
                }
            case 0:
                goto default;
 
        }
	}
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"1");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 a
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2094
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
	} // end of class <>c__DisplayClass0_0
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_1'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 b
		.field public class Program/'<>c__DisplayClass0_0' 'CS$<>8__locals1'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2094
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_1'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x209c
			// Code size 24 (0x18)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0006: ldfld int32 Program/'<>c__DisplayClass0_0'::a
			IL_000b: ldarg.0
			IL_000c: ldfld int32 Program/'<>c__DisplayClass0_1'::b
			IL_0011: add
			IL_0012: call void [mscorlib]System.Console::WriteLine(int32)
			IL_0017: ret
		} // end of method '<>c__DisplayClass0_1'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_1
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 56 (0x38)
		.maxstack 3
		.entrypoint
		.locals init (
			[0] class Program/'<>c__DisplayClass0_0'
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: ldloc.0
		IL_0007: ldc.i4.0
		IL_0008: stfld int32 Program/'<>c__DisplayClass0_0'::a
		IL_000d: ldloc.0
		IL_000e: ldfld int32 Program/'<>c__DisplayClass0_0'::a
		IL_0013: pop
		IL_0014: newobj instance void Program/'<>c__DisplayClass0_1'::.ctor()
		IL_0019: dup
		IL_001a: ldloc.0
		IL_001b: stfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
		IL_0020: dup
		IL_0021: ldc.i4.1
		IL_0022: stfld int32 Program/'<>c__DisplayClass0_1'::b
		IL_0027: ldftn instance void Program/'<>c__DisplayClass0_1'::'<Main>b__0'()
		IL_002d: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
		IL_0032: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_0037: ret
	} // end of method Program::Main
} // end of class Program");
        }
 
        [Fact]
        public void OptimizationDoesNotIncreaseClosuresReferencingVariable01()
        {
            var source =
                @"using System;
 
public static class Program
{
	public static void Main()
	{
		int a = 0;
		{
			int b = 1;
			Action action = () => Console.WriteLine(a + b);
			action();
		}
 
		Action _ = () => Console.WriteLine(a);
	}
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"1");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 a
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x208d
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x2095
			// Code size 12 (0xc)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld int32 Program/'<>c__DisplayClass0_0'::a
			IL_0006: call void [mscorlib]System.Console::WriteLine(int32)
			IL_000b: ret
		} // end of method '<>c__DisplayClass0_0'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_0
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_1'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 b
		.field public class Program/'<>c__DisplayClass0_0' 'CS$<>8__locals1'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x208d
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_1'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__1' () cil managed 
		{
			// Method begins at RVA 0x20a2
			// Code size 24 (0x18)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0006: ldfld int32 Program/'<>c__DisplayClass0_0'::a
			IL_000b: ldarg.0
			IL_000c: ldfld int32 Program/'<>c__DisplayClass0_1'::b
			IL_0011: add
			IL_0012: call void [mscorlib]System.Console::WriteLine(int32)
			IL_0017: ret
		} // end of method '<>c__DisplayClass0_1'::'<Main>b__1'
	} // end of class <>c__DisplayClass0_1
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 49 (0x31)
		.maxstack 3
		.entrypoint
		.locals init (
			[0] class Program/'<>c__DisplayClass0_0'
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: ldloc.0
		IL_0007: ldc.i4.0
		IL_0008: stfld int32 Program/'<>c__DisplayClass0_0'::a
		IL_000d: newobj instance void Program/'<>c__DisplayClass0_1'::.ctor()
		IL_0012: dup
		IL_0013: ldloc.0
		IL_0014: stfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
		IL_0019: dup
		IL_001a: ldc.i4.1
		IL_001b: stfld int32 Program/'<>c__DisplayClass0_1'::b
		IL_0020: ldftn instance void Program/'<>c__DisplayClass0_1'::'<Main>b__1'()
		IL_0026: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
		IL_002b: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_0030: ret
	} // end of method Program::Main
} // end of class Program");
        }
 
        [Fact]
        public void OptimizationDoesNotIncreaseClosuresReferencingVariable02()
        {
            var source =
                @"using System;
 
public static class Program
{
	public static void Main()
	{
		int a = 0;
		{
			int b = 1;
			{
				Action action = () => Console.WriteLine(a + b);
				action();
			}
 
			{
				Action _ = () => Console.WriteLine(a + b);
			}
		}
	}
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"1");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 a
		.field public int32 b
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2077
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x207f
			// Code size 19 (0x13)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld int32 Program/'<>c__DisplayClass0_0'::a
			IL_0006: ldarg.0
			IL_0007: ldfld int32 Program/'<>c__DisplayClass0_0'::b
			IL_000c: add
			IL_000d: call void [mscorlib]System.Console::WriteLine(int32)
			IL_0012: ret
		} // end of method '<>c__DisplayClass0_0'::'<Main>b__0'
		.method assembly hidebysig 
			instance void '<Main>b__1' () cil managed 
		{
			// Method begins at RVA 0x207f
			// Code size 19 (0x13)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld int32 Program/'<>c__DisplayClass0_0'::a
			IL_0006: ldarg.0
			IL_0007: ldfld int32 Program/'<>c__DisplayClass0_0'::b
			IL_000c: add
			IL_000d: call void [mscorlib]System.Console::WriteLine(int32)
			IL_0012: ret
		} // end of method '<>c__DisplayClass0_0'::'<Main>b__1'
	} // end of class <>c__DisplayClass0_0
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 38 (0x26)
		.maxstack 8
		.entrypoint
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: dup
		IL_0006: ldc.i4.0
		IL_0007: stfld int32 Program/'<>c__DisplayClass0_0'::a
		IL_000c: dup
		IL_000d: ldc.i4.1
		IL_000e: stfld int32 Program/'<>c__DisplayClass0_0'::b
		IL_0013: dup
		IL_0014: ldftn instance void Program/'<>c__DisplayClass0_0'::'<Main>b__0'()
		IL_001a: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
		IL_001f: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_0024: pop
		IL_0025: ret
	} // end of method Program::Main
} // end of class Program");
        }
 
        [Fact]
        public void OptimizationDoesNotIncreaseClosuresReferencingVariable03()
        {
            var source =
                @"using System;
 
public static class Program
{
	public static void Main()
	{
		int a = 0;
		{
			int b = 1;
			Action action = () => Console.WriteLine(a + b);
			action();
			Action _ = () => Console.WriteLine(b);
		}
	}
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"1");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 a
		.field public int32 b
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2077
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x207f
			// Code size 19 (0x13)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld int32 Program/'<>c__DisplayClass0_0'::a
			IL_0006: ldarg.0
			IL_0007: ldfld int32 Program/'<>c__DisplayClass0_0'::b
			IL_000c: add
			IL_000d: call void [mscorlib]System.Console::WriteLine(int32)
			IL_0012: ret
		} // end of method '<>c__DisplayClass0_0'::'<Main>b__0'
		.method assembly hidebysig 
			instance void '<Main>b__1' () cil managed 
		{
			// Method begins at RVA 0x2093
			// Code size 12 (0xc)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld int32 Program/'<>c__DisplayClass0_0'::b
			IL_0006: call void [mscorlib]System.Console::WriteLine(int32)
			IL_000b: ret
		} // end of method '<>c__DisplayClass0_0'::'<Main>b__1'
	} // end of class <>c__DisplayClass0_0
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 38 (0x26)
		.maxstack 8
		.entrypoint
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: dup
		IL_0006: ldc.i4.0
		IL_0007: stfld int32 Program/'<>c__DisplayClass0_0'::a
		IL_000c: dup
		IL_000d: ldc.i4.1
		IL_000e: stfld int32 Program/'<>c__DisplayClass0_0'::b
		IL_0013: dup
		IL_0014: ldftn instance void Program/'<>c__DisplayClass0_0'::'<Main>b__0'()
		IL_001a: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
		IL_001f: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_0024: pop
		IL_0025: ret
	} // end of method Program::Main
} // end of class Program");
        }
 
        [Fact]
        public void OptimizationDoesNotIncreaseClosuresReferencingVariable04()
        {
            var source =
                @"using System;
 
public static class Program
{
	public static void Main()
	{
		int a = 0;
		{
			int b = 1;
			Action action = () => Console.WriteLine(a + b);
			action();
			Action _ = () => Console.WriteLine(a);
		}
	}
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"1");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 a
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2094
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__1' () cil managed 
		{
			// Method begins at RVA 0x209c
			// Code size 12 (0xc)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld int32 Program/'<>c__DisplayClass0_0'::a
			IL_0006: call void [mscorlib]System.Console::WriteLine(int32)
			IL_000b: ret
		} // end of method '<>c__DisplayClass0_0'::'<Main>b__1'
	} // end of class <>c__DisplayClass0_0
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_1'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 b
		.field public class Program/'<>c__DisplayClass0_0' 'CS$<>8__locals1'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2094
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_1'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x20a9
			// Code size 24 (0x18)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0006: ldfld int32 Program/'<>c__DisplayClass0_0'::a
			IL_000b: ldarg.0
			IL_000c: ldfld int32 Program/'<>c__DisplayClass0_1'::b
			IL_0011: add
			IL_0012: call void [mscorlib]System.Console::WriteLine(int32)
			IL_0017: ret
		} // end of method '<>c__DisplayClass0_1'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_1
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 56 (0x38)
		.maxstack 3
		.entrypoint
		.locals init (
			[0] class Program/'<>c__DisplayClass0_0'
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: ldloc.0
		IL_0007: ldc.i4.0
		IL_0008: stfld int32 Program/'<>c__DisplayClass0_0'::a
		IL_000d: newobj instance void Program/'<>c__DisplayClass0_1'::.ctor()
		IL_0012: dup
		IL_0013: ldloc.0
		IL_0014: stfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
		IL_0019: dup
		IL_001a: ldc.i4.1
		IL_001b: stfld int32 Program/'<>c__DisplayClass0_1'::b
		IL_0020: dup
		IL_0021: ldftn instance void Program/'<>c__DisplayClass0_1'::'<Main>b__0'()
		IL_0027: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
		IL_002c: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_0031: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
		IL_0036: pop
		IL_0037: ret
	} // end of method Program::Main
} // end of class Program");
        }
 
        [Fact]
        public void OptimizationDoesNotIncreaseClosuresReferencingVariable05()
        {
            var source =
                @"using System;
 
public static class Program
{
	public static void Main()
	{
		int a = 0;
		{
			int b = 1;
			{
				int c = 2;
				{
					int d = 3;
 
					Action action = () => Console.WriteLine(b + d);
					action();
					Action _ = () => Console.WriteLine(a + c);
				}
			}
		}
	}
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"4");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 a
		.field public int32 b
		.field public int32 c
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x20a2
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__1' () cil managed 
		{
			// Method begins at RVA 0x20aa
			// Code size 19 (0x13)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld int32 Program/'<>c__DisplayClass0_0'::a
			IL_0006: ldarg.0
			IL_0007: ldfld int32 Program/'<>c__DisplayClass0_0'::c
			IL_000c: add
			IL_000d: call void [mscorlib]System.Console::WriteLine(int32)
			IL_0012: ret
		} // end of method '<>c__DisplayClass0_0'::'<Main>b__1'
	} // end of class <>c__DisplayClass0_0
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_1'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 d
		.field public class Program/'<>c__DisplayClass0_0' 'CS$<>8__locals1'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x20a2
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_1'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x20be
			// Code size 24 (0x18)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0006: ldfld int32 Program/'<>c__DisplayClass0_0'::b
			IL_000b: ldarg.0
			IL_000c: ldfld int32 Program/'<>c__DisplayClass0_1'::d
			IL_0011: add
			IL_0012: call void [mscorlib]System.Console::WriteLine(int32)
			IL_0017: ret
		} // end of method '<>c__DisplayClass0_1'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_1
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 70 (0x46)
		.maxstack 3
		.entrypoint
		.locals init (
			[0] class Program/'<>c__DisplayClass0_0'
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: ldloc.0
		IL_0007: ldc.i4.0
		IL_0008: stfld int32 Program/'<>c__DisplayClass0_0'::a
		IL_000d: ldloc.0
		IL_000e: ldc.i4.1
		IL_000f: stfld int32 Program/'<>c__DisplayClass0_0'::b
		IL_0014: ldloc.0
		IL_0015: ldc.i4.2
		IL_0016: stfld int32 Program/'<>c__DisplayClass0_0'::c
		IL_001b: newobj instance void Program/'<>c__DisplayClass0_1'::.ctor()
		IL_0020: dup
		IL_0021: ldloc.0
		IL_0022: stfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
		IL_0027: dup
		IL_0028: ldc.i4.3
		IL_0029: stfld int32 Program/'<>c__DisplayClass0_1'::d
		IL_002e: dup
		IL_002f: ldftn instance void Program/'<>c__DisplayClass0_1'::'<Main>b__0'()
		IL_0035: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
		IL_003a: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_003f: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
		IL_0044: pop
		IL_0045: ret
	} // end of method Program::Main
} // end of class Program");
        }
 
        [Fact]
        public void OptimizationDoesNotIncreaseClosuresReferencingVariable06()
        {
            var source =
                @"using System;
 
public static class Program
{
	public static void Main()
	{
		int a = 0;
		{
			int b = 1;
			{
				int c = 2;
 
				Action action = () => Console.WriteLine(a + c);
				action();
				Action x = () => Console.WriteLine(a + b + c);
			}
            Action y = () => Console.WriteLine(b);
		}
	}
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"2");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 a
		.field public int32 b
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2096
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x209e
			// Code size 12 (0xc)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld int32 Program/'<>c__DisplayClass0_0'::b
			IL_0006: call void [mscorlib]System.Console::WriteLine(int32)
			IL_000b: ret
		} // end of method '<>c__DisplayClass0_0'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_0
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_1'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 c
		.field public class Program/'<>c__DisplayClass0_0' 'CS$<>8__locals1'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2096
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_1'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__1' () cil managed 
		{
			// Method begins at RVA 0x20ab
			// Code size 24 (0x18)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0006: ldfld int32 Program/'<>c__DisplayClass0_0'::a
			IL_000b: ldarg.0
			IL_000c: ldfld int32 Program/'<>c__DisplayClass0_1'::c
			IL_0011: add
			IL_0012: call void [mscorlib]System.Console::WriteLine(int32)
			IL_0017: ret
		} // end of method '<>c__DisplayClass0_1'::'<Main>b__1'
		.method assembly hidebysig 
			instance void '<Main>b__2' () cil managed 
		{
			// Method begins at RVA 0x20c4
			// Code size 36 (0x24)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0006: ldfld int32 Program/'<>c__DisplayClass0_0'::a
			IL_000b: ldarg.0
			IL_000c: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0011: ldfld int32 Program/'<>c__DisplayClass0_0'::b
			IL_0016: add
			IL_0017: ldarg.0
			IL_0018: ldfld int32 Program/'<>c__DisplayClass0_1'::c
			IL_001d: add
			IL_001e: call void [mscorlib]System.Console::WriteLine(int32)
			IL_0023: ret
		} // end of method '<>c__DisplayClass0_1'::'<Main>b__2'
	} // end of class <>c__DisplayClass0_1
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 58 (0x3a)
		.maxstack 3
		.entrypoint
		.locals init (
			[0] class Program/'<>c__DisplayClass0_0'
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: ldloc.0
		IL_0007: ldc.i4.0
		IL_0008: stfld int32 Program/'<>c__DisplayClass0_0'::a
		IL_000d: ldloc.0
		IL_000e: ldc.i4.1
		IL_000f: stfld int32 Program/'<>c__DisplayClass0_0'::b
		IL_0014: newobj instance void Program/'<>c__DisplayClass0_1'::.ctor()
		IL_0019: dup
		IL_001a: ldloc.0
		IL_001b: stfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
		IL_0020: dup
		IL_0021: ldc.i4.2
		IL_0022: stfld int32 Program/'<>c__DisplayClass0_1'::c
		IL_0027: dup
		IL_0028: ldftn instance void Program/'<>c__DisplayClass0_1'::'<Main>b__1'()
		IL_002e: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
		IL_0033: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_0038: pop
		IL_0039: ret
	} // end of method Program::Main
} // end of class Program");
        }
 
        [Fact]
        public void OptimizationDoesNotIncreaseClosuresReferencingVariable07()
        {
            var source =
                @"using System;
 
public static class Program
{
	public static void Main()
	{
		int a = 0;
		{
			int b = 1;
			{
				int c = 2;
 
				Action action = () => Console.WriteLine(b + c);
				action();
			}
            Action y = () => Console.WriteLine(a + b);
		}
	}
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"3");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 a
		.field public int32 b
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2094
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x209c
			// Code size 19 (0x13)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld int32 Program/'<>c__DisplayClass0_0'::a
			IL_0006: ldarg.0
			IL_0007: ldfld int32 Program/'<>c__DisplayClass0_0'::b
			IL_000c: add
			IL_000d: call void [mscorlib]System.Console::WriteLine(int32)
			IL_0012: ret
		} // end of method '<>c__DisplayClass0_0'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_0
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_1'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 c
		.field public class Program/'<>c__DisplayClass0_0' 'CS$<>8__locals1'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2094
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_1'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__1' () cil managed 
		{
			// Method begins at RVA 0x20b0
			// Code size 24 (0x18)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0006: ldfld int32 Program/'<>c__DisplayClass0_0'::b
			IL_000b: ldarg.0
			IL_000c: ldfld int32 Program/'<>c__DisplayClass0_1'::c
			IL_0011: add
			IL_0012: call void [mscorlib]System.Console::WriteLine(int32)
			IL_0017: ret
		} // end of method '<>c__DisplayClass0_1'::'<Main>b__1'
	} // end of class <>c__DisplayClass0_1
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 56 (0x38)
		.maxstack 3
		.entrypoint
		.locals init (
			[0] class Program/'<>c__DisplayClass0_0'
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: ldloc.0
		IL_0007: ldc.i4.0
		IL_0008: stfld int32 Program/'<>c__DisplayClass0_0'::a
		IL_000d: ldloc.0
		IL_000e: ldc.i4.1
		IL_000f: stfld int32 Program/'<>c__DisplayClass0_0'::b
		IL_0014: newobj instance void Program/'<>c__DisplayClass0_1'::.ctor()
		IL_0019: dup
		IL_001a: ldloc.0
		IL_001b: stfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
		IL_0020: dup
		IL_0021: ldc.i4.2
		IL_0022: stfld int32 Program/'<>c__DisplayClass0_1'::c
		IL_0027: ldftn instance void Program/'<>c__DisplayClass0_1'::'<Main>b__1'()
		IL_002d: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
		IL_0032: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_0037: ret
	} // end of method Program::Main
} // end of class Program");
        }
 
        [Fact]
        public void OptimizationDoesNotIncreaseClosuresReferencingVariable08()
        {
            var source =
                @"using System;
 
public static class Program
{
	public static void Main()
	{
		int a = 0;
		{
			int b = 1;
			{
				int c = 2;
 
				Action action = () => Console.WriteLine(b + c);
				action();
			}
            Action y = () => Console.WriteLine(a);
		}
	}
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"3");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi abstract sealed beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 a
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2082
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x208a
			// Code size 12 (0xc)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld int32 Program/'<>c__DisplayClass0_0'::a
			IL_0006: call void [mscorlib]System.Console::WriteLine(int32)
			IL_000b: ret
		} // end of method '<>c__DisplayClass0_0'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_0
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_1'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 b
		.field public int32 c
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2082
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_1'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__1' () cil managed 
		{
			// Method begins at RVA 0x2097
			// Code size 19 (0x13)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld int32 Program/'<>c__DisplayClass0_1'::b
			IL_0006: ldarg.0
			IL_0007: ldfld int32 Program/'<>c__DisplayClass0_1'::c
			IL_000c: add
			IL_000d: call void [mscorlib]System.Console::WriteLine(int32)
			IL_0012: ret
		} // end of method '<>c__DisplayClass0_1'::'<Main>b__1'
	} // end of class <>c__DisplayClass0_1
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 49 (0x31)
		.maxstack 8
		.entrypoint
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: dup
		IL_0006: ldc.i4.0
		IL_0007: stfld int32 Program/'<>c__DisplayClass0_0'::a
		IL_000c: newobj instance void Program/'<>c__DisplayClass0_1'::.ctor()
		IL_0011: dup
		IL_0012: ldc.i4.1
		IL_0013: stfld int32 Program/'<>c__DisplayClass0_1'::b
		IL_0018: dup
		IL_0019: ldc.i4.2
		IL_001a: stfld int32 Program/'<>c__DisplayClass0_1'::c
		IL_001f: ldftn instance void Program/'<>c__DisplayClass0_1'::'<Main>b__1'()
		IL_0025: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
		IL_002a: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_002f: pop
		IL_0030: ret
	} // end of method Program::Main
} // end of class Program");
        }
 
        [Fact]
        public void DoNotMergeEnvironmentsInsideLocalFunctionToOutside()
        {
            var source =
                @"using System;
using System.Collections.Generic;
 
public class Program
{
	public static void Main()
	{
		var actions = new List<Action>();
		int a = 1;
 
		void M()
		{
			int b = 0;
 
			actions.Add(() => b += a);
 
			actions.Add(() => Console.WriteLine(b));
		}
 
		M();
		M();
		actions[0]();
		actions[2]();
		actions[1]();
		actions[3]();
	}
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"1
1");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action> actions
		.field public int32 a
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x20c3
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
		.method assembly hidebysig 
			instance void '<Main>g__M|0' () cil managed 
		{
			// Method begins at RVA 0x20cc
			// Code size 67 (0x43)
			.maxstack 3
			.locals init (
				[0] class Program/'<>c__DisplayClass0_1'
			)
			IL_0000: newobj instance void Program/'<>c__DisplayClass0_1'::.ctor()
			IL_0005: stloc.0
			IL_0006: ldloc.0
			IL_0007: ldarg.0
			IL_0008: stfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_000d: ldloc.0
			IL_000e: ldc.i4.0
			IL_000f: stfld int32 Program/'<>c__DisplayClass0_1'::b
			IL_0014: ldarg.0
			IL_0015: ldfld class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action> Program/'<>c__DisplayClass0_0'::actions
			IL_001a: ldloc.0
			IL_001b: ldftn instance void Program/'<>c__DisplayClass0_1'::'<Main>b__1'()
			IL_0021: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
			IL_0026: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::Add(!0)
			IL_002b: ldarg.0
			IL_002c: ldfld class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action> Program/'<>c__DisplayClass0_0'::actions
			IL_0031: ldloc.0
			IL_0032: ldftn instance void Program/'<>c__DisplayClass0_1'::'<Main>b__2'()
			IL_0038: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
			IL_003d: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::Add(!0)
			IL_0042: ret
		} // end of method '<>c__DisplayClass0_0'::'<Main>g__M|0'
	} // end of class <>c__DisplayClass0_0
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_1'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 b
		.field public class Program/'<>c__DisplayClass0_0' 'CS$<>8__locals1'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x20c3
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_1'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__1' () cil managed 
		{
			// Method begins at RVA 0x211b
			// Code size 25 (0x19)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldarg.0
			IL_0002: ldfld int32 Program/'<>c__DisplayClass0_1'::b
			IL_0007: ldarg.0
			IL_0008: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_000d: ldfld int32 Program/'<>c__DisplayClass0_0'::a
			IL_0012: add
			IL_0013: stfld int32 Program/'<>c__DisplayClass0_1'::b
			IL_0018: ret
		} // end of method '<>c__DisplayClass0_1'::'<Main>b__1'
		.method assembly hidebysig 
			instance void '<Main>b__2' () cil managed 
		{
			// Method begins at RVA 0x2135
			// Code size 12 (0xc)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld int32 Program/'<>c__DisplayClass0_1'::b
			IL_0006: call void [mscorlib]System.Console::WriteLine(int32)
			IL_000b: ret
		} // end of method '<>c__DisplayClass0_1'::'<Main>b__2'
	} // end of class <>c__DisplayClass0_1
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 103 (0x67)
		.maxstack 3
		.entrypoint
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: dup
		IL_0006: newobj instance void class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::.ctor()
		IL_000b: stfld class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action> Program/'<>c__DisplayClass0_0'::actions
		IL_0010: dup
		IL_0011: ldc.i4.1
		IL_0012: stfld int32 Program/'<>c__DisplayClass0_0'::a
		IL_0017: dup
		IL_0018: callvirt instance void Program/'<>c__DisplayClass0_0'::'<Main>g__M|0'()
		IL_001d: dup
		IL_001e: callvirt instance void Program/'<>c__DisplayClass0_0'::'<Main>g__M|0'()
		IL_0023: dup
		IL_0024: ldfld class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action> Program/'<>c__DisplayClass0_0'::actions
		IL_0029: ldc.i4.0
		IL_002a: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
		IL_002f: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_0034: dup
		IL_0035: ldfld class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action> Program/'<>c__DisplayClass0_0'::actions
		IL_003a: ldc.i4.2
		IL_003b: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
		IL_0040: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_0045: dup
		IL_0046: ldfld class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action> Program/'<>c__DisplayClass0_0'::actions
		IL_004b: ldc.i4.1
		IL_004c: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
		IL_0051: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_0056: ldfld class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action> Program/'<>c__DisplayClass0_0'::actions
		IL_005b: ldc.i4.3
		IL_005c: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
		IL_0061: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_0066: ret
	} // end of method Program::Main
	.method public hidebysig specialname rtspecialname 
		instance void .ctor () cil managed 
	{
		// Method begins at RVA 0x20c3
		// Code size 7 (0x7)
		.maxstack 8
		IL_0000: ldarg.0
		IL_0001: call instance void [mscorlib]System.Object::.ctor()
		IL_0006: ret
	} // end of method Program::.ctor
} // end of class Program");
        }
 
        [Fact]
        public void DoNotMergeEnvironmentsInsideLambdaToOutside()
        {
            var source =
                @"using System;
using System.Collections.Generic;
 
public class Program
{
	public static void Main()
	{
        var actions = new List<Action>();
        int a  = 1;
        
        Action M = () =>
        {
            int b = 0;
            
            actions.Add(() => b += a);
            
            actions.Add(() => Console.WriteLine(b));
        };
        
        M();
        M();
        actions[0]();
        actions[2]();
        actions[1]();
        actions[3]();
	}
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"1
1");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action> actions
		.field public int32 a
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x20ce
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__0' () cil managed 
		{
			// Method begins at RVA 0x20d8
			// Code size 67 (0x43)
			.maxstack 3
			.locals init (
				[0] class Program/'<>c__DisplayClass0_1'
			)
			IL_0000: newobj instance void Program/'<>c__DisplayClass0_1'::.ctor()
			IL_0005: stloc.0
			IL_0006: ldloc.0
			IL_0007: ldarg.0
			IL_0008: stfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_000d: ldloc.0
			IL_000e: ldc.i4.0
			IL_000f: stfld int32 Program/'<>c__DisplayClass0_1'::b
			IL_0014: ldarg.0
			IL_0015: ldfld class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action> Program/'<>c__DisplayClass0_0'::actions
			IL_001a: ldloc.0
			IL_001b: ldftn instance void Program/'<>c__DisplayClass0_1'::'<Main>b__1'()
			IL_0021: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
			IL_0026: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::Add(!0)
			IL_002b: ldarg.0
			IL_002c: ldfld class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action> Program/'<>c__DisplayClass0_0'::actions
			IL_0031: ldloc.0
			IL_0032: ldftn instance void Program/'<>c__DisplayClass0_1'::'<Main>b__2'()
			IL_0038: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
			IL_003d: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::Add(!0)
			IL_0042: ret
		} // end of method '<>c__DisplayClass0_0'::'<Main>b__0'
	} // end of class <>c__DisplayClass0_0
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_1'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 b
		.field public class Program/'<>c__DisplayClass0_0' 'CS$<>8__locals1'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x20ce
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_1'::.ctor
		.method assembly hidebysig 
			instance void '<Main>b__1' () cil managed 
		{
			// Method begins at RVA 0x2127
			// Code size 25 (0x19)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldarg.0
			IL_0002: ldfld int32 Program/'<>c__DisplayClass0_1'::b
			IL_0007: ldarg.0
			IL_0008: ldfld class Program/'<>c__DisplayClass0_0' Program/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_000d: ldfld int32 Program/'<>c__DisplayClass0_0'::a
			IL_0012: add
			IL_0013: stfld int32 Program/'<>c__DisplayClass0_1'::b
			IL_0018: ret
		} // end of method '<>c__DisplayClass0_1'::'<Main>b__1'
		.method assembly hidebysig 
			instance void '<Main>b__2' () cil managed 
		{
			// Method begins at RVA 0x2141
			// Code size 12 (0xc)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld int32 Program/'<>c__DisplayClass0_1'::b
			IL_0006: call void [mscorlib]System.Console::WriteLine(int32)
			IL_000b: ret
		} // end of method '<>c__DisplayClass0_1'::'<Main>b__2'
	} // end of class <>c__DisplayClass0_1
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 114 (0x72)
		.maxstack 3
		.entrypoint
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: dup
		IL_0006: newobj instance void class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::.ctor()
		IL_000b: stfld class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action> Program/'<>c__DisplayClass0_0'::actions
		IL_0010: dup
		IL_0011: ldc.i4.1
		IL_0012: stfld int32 Program/'<>c__DisplayClass0_0'::a
		IL_0017: dup
		IL_0018: ldftn instance void Program/'<>c__DisplayClass0_0'::'<Main>b__0'()
		IL_001e: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
		IL_0023: dup
		IL_0024: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_0029: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_002e: dup
		IL_002f: ldfld class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action> Program/'<>c__DisplayClass0_0'::actions
		IL_0034: ldc.i4.0
		IL_0035: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
		IL_003a: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_003f: dup
		IL_0040: ldfld class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action> Program/'<>c__DisplayClass0_0'::actions
		IL_0045: ldc.i4.2
		IL_0046: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
		IL_004b: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_0050: dup
		IL_0051: ldfld class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action> Program/'<>c__DisplayClass0_0'::actions
		IL_0056: ldc.i4.1
		IL_0057: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
		IL_005c: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_0061: ldfld class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action> Program/'<>c__DisplayClass0_0'::actions
		IL_0066: ldc.i4.3
		IL_0067: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Action>::get_Item(int32)
		IL_006c: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_0071: ret
	} // end of method Program::Main
	.method public hidebysig specialname rtspecialname 
		instance void .ctor () cil managed 
	{
		// Method begins at RVA 0x20ce
		// Code size 7 (0x7)
		.maxstack 8
		IL_0000: ldarg.0
		IL_0001: call instance void [mscorlib]System.Object::.ctor()
		IL_0006: ret
	} // end of method Program::.ctor
} // end of class Program");
        }
 
        [Fact]
        public void LocalMethod01()
        {
            var source =
                @"using System;
public class Program 
{
    public static void Main()
    {
        M()();
    }
	public static Action M() 
	{
		int a = 1; 
		{
			int b = 2;
 
			void M1() 
			{
				Console.WriteLine(a + b);
			}
 
			{
				int c = 3;
 
				void M2() 
				{
					M1();
					Console.WriteLine(c);
				}
				return M2;
			}
		}
	}
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"3
3");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass1_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 a
		.field public int32 b
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x209b
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass1_0'::.ctor
		.method assembly hidebysig 
			instance void '<M>g__M1|0' () cil managed 
		{
			// Method begins at RVA 0x20a3
			// Code size 19 (0x13)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld int32 Program/'<>c__DisplayClass1_0'::a
			IL_0006: ldarg.0
			IL_0007: ldfld int32 Program/'<>c__DisplayClass1_0'::b
			IL_000c: add
			IL_000d: call void [mscorlib]System.Console::WriteLine(int32)
			IL_0012: ret
		} // end of method '<>c__DisplayClass1_0'::'<M>g__M1|0'
	} // end of class <>c__DisplayClass1_0
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass1_1'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 c
		.field public class Program/'<>c__DisplayClass1_0' 'CS$<>8__locals1'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x209b
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass1_1'::.ctor
		.method assembly hidebysig 
			instance void '<M>g__M2|1' () cil managed 
		{
			// Method begins at RVA 0x20b7
			// Code size 23 (0x17)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld class Program/'<>c__DisplayClass1_0' Program/'<>c__DisplayClass1_1'::'CS$<>8__locals1'
			IL_0006: callvirt instance void Program/'<>c__DisplayClass1_0'::'<M>g__M1|0'()
			IL_000b: ldarg.0
			IL_000c: ldfld int32 Program/'<>c__DisplayClass1_1'::c
			IL_0011: call void [mscorlib]System.Console::WriteLine(int32)
			IL_0016: ret
		} // end of method '<>c__DisplayClass1_1'::'<M>g__M2|1'
	} // end of class <>c__DisplayClass1_1
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 11 (0xb)
		.maxstack 8
		.entrypoint
		IL_0000: call class [mscorlib]System.Action Program::M()
		IL_0005: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_000a: ret
	} // end of method Program::Main
	.method public hidebysig static 
		class [mscorlib]System.Action M () cil managed 
	{
		// Method begins at RVA 0x205c
		// Code size 51 (0x33)
		.maxstack 3
		.locals init (
			[0] class Program/'<>c__DisplayClass1_0'
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass1_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: ldloc.0
		IL_0007: ldc.i4.1
		IL_0008: stfld int32 Program/'<>c__DisplayClass1_0'::a
		IL_000d: ldloc.0
		IL_000e: ldc.i4.2
		IL_000f: stfld int32 Program/'<>c__DisplayClass1_0'::b
		IL_0014: newobj instance void Program/'<>c__DisplayClass1_1'::.ctor()
		IL_0019: dup
		IL_001a: ldloc.0
		IL_001b: stfld class Program/'<>c__DisplayClass1_0' Program/'<>c__DisplayClass1_1'::'CS$<>8__locals1'
		IL_0020: dup
		IL_0021: ldc.i4.3
		IL_0022: stfld int32 Program/'<>c__DisplayClass1_1'::c
		IL_0027: ldftn instance void Program/'<>c__DisplayClass1_1'::'<M>g__M2|1'()
		IL_002d: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
		IL_0032: ret
	} // end of method Program::M
	.method public hidebysig specialname rtspecialname 
		instance void .ctor () cil managed 
	{
		// Method begins at RVA 0x209b
		// Code size 7 (0x7)
		.maxstack 8
		IL_0000: ldarg.0
		IL_0001: call instance void [mscorlib]System.Object::.ctor()
		IL_0006: ret
	} // end of method Program::.ctor
} // end of class Program");
        }
 
        [Fact]
        public void LocalMethod02()
        {
            var source =
                @"using System;
public class Program 
{
    public static void Main()
    {
        M()();
    }
	public static Action M() 
	{
		int a = 1; 
		{
target:
			int b = 2;
 
			void M1() 
			{
				Console.WriteLine(a + b);
			}
 
			{
				int c = 3;
 
				void M2() 
				{
					M1();
					Console.WriteLine(c);
				}
				return M2;
                goto target;
			}
		}
	}
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"3
3");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass1_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 a
		.field public int32 b
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x209b
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass1_0'::.ctor
		.method assembly hidebysig 
			instance void '<M>g__M1|0' () cil managed 
		{
			// Method begins at RVA 0x20a3
			// Code size 19 (0x13)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld int32 Program/'<>c__DisplayClass1_0'::a
			IL_0006: ldarg.0
			IL_0007: ldfld int32 Program/'<>c__DisplayClass1_0'::b
			IL_000c: add
			IL_000d: call void [mscorlib]System.Console::WriteLine(int32)
			IL_0012: ret
		} // end of method '<>c__DisplayClass1_0'::'<M>g__M1|0'
	} // end of class <>c__DisplayClass1_0
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass1_1'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 c
		.field public class Program/'<>c__DisplayClass1_0' 'CS$<>8__locals1'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x209b
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass1_1'::.ctor
		.method assembly hidebysig 
			instance void '<M>g__M2|1' () cil managed 
		{
			// Method begins at RVA 0x20b7
			// Code size 23 (0x17)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld class Program/'<>c__DisplayClass1_0' Program/'<>c__DisplayClass1_1'::'CS$<>8__locals1'
			IL_0006: callvirt instance void Program/'<>c__DisplayClass1_0'::'<M>g__M1|0'()
			IL_000b: ldarg.0
			IL_000c: ldfld int32 Program/'<>c__DisplayClass1_1'::c
			IL_0011: call void [mscorlib]System.Console::WriteLine(int32)
			IL_0016: ret
		} // end of method '<>c__DisplayClass1_1'::'<M>g__M2|1'
	} // end of class <>c__DisplayClass1_1
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 11 (0xb)
		.maxstack 8
		.entrypoint
		IL_0000: call class [mscorlib]System.Action Program::M()
		IL_0005: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_000a: ret
	} // end of method Program::Main
	.method public hidebysig static 
		class [mscorlib]System.Action M () cil managed 
	{
		// Method begins at RVA 0x205c
		// Code size 51 (0x33)
		.maxstack 3
		.locals init (
			[0] class Program/'<>c__DisplayClass1_0'
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass1_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: ldloc.0
		IL_0007: ldc.i4.1
		IL_0008: stfld int32 Program/'<>c__DisplayClass1_0'::a
		IL_000d: ldloc.0
		IL_000e: ldc.i4.2
		IL_000f: stfld int32 Program/'<>c__DisplayClass1_0'::b
		IL_0014: newobj instance void Program/'<>c__DisplayClass1_1'::.ctor()
		IL_0019: dup
		IL_001a: ldloc.0
		IL_001b: stfld class Program/'<>c__DisplayClass1_0' Program/'<>c__DisplayClass1_1'::'CS$<>8__locals1'
		IL_0020: dup
		IL_0021: ldc.i4.3
		IL_0022: stfld int32 Program/'<>c__DisplayClass1_1'::c
		IL_0027: ldftn instance void Program/'<>c__DisplayClass1_1'::'<M>g__M2|1'()
		IL_002d: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
		IL_0032: ret
	} // end of method Program::M
	.method public hidebysig specialname rtspecialname 
		instance void .ctor () cil managed 
	{
		// Method begins at RVA 0x209b
		// Code size 7 (0x7)
		.maxstack 8
		IL_0000: ldarg.0
		IL_0001: call instance void [mscorlib]System.Object::.ctor()
		IL_0006: ret
	} // end of method Program::.ctor
} // end of class Program");
        }
 
        [Fact]
        public void LocalMethod03()
        {
            var source =
                @"using System;
public class Program 
{
    public static void Main()
    {
        M()();
    }
	public static Action M() 
	{
		int a = 1; 
target:
		{
			int b = 2;
 
			void M1() 
			{
				Console.WriteLine(a + b);
			}
 
			{
				int c = 3;
 
				void M2() 
				{
					M1();
					Console.WriteLine(c);
				}
				return M2;
                goto target;
			}
		}
	}
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), expectedOutput: @"3
3");
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass1_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 a
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x20a8
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass1_0'::.ctor
	} // end of class <>c__DisplayClass1_0
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass1_1'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 b
		.field public class Program/'<>c__DisplayClass1_0' 'CS$<>8__locals1'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x20a8
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass1_1'::.ctor
		.method assembly hidebysig 
			instance void '<M>g__M1|0' () cil managed 
		{
			// Method begins at RVA 0x20b0
			// Code size 24 (0x18)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld class Program/'<>c__DisplayClass1_0' Program/'<>c__DisplayClass1_1'::'CS$<>8__locals1'
			IL_0006: ldfld int32 Program/'<>c__DisplayClass1_0'::a
			IL_000b: ldarg.0
			IL_000c: ldfld int32 Program/'<>c__DisplayClass1_1'::b
			IL_0011: add
			IL_0012: call void [mscorlib]System.Console::WriteLine(int32)
			IL_0017: ret
		} // end of method '<>c__DisplayClass1_1'::'<M>g__M1|0'
	} // end of class <>c__DisplayClass1_1
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass1_2'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 c
		.field public class Program/'<>c__DisplayClass1_1' 'CS$<>8__locals2'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x20a8
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass1_2'::.ctor
		.method assembly hidebysig 
			instance void '<M>g__M2|1' () cil managed 
		{
			// Method begins at RVA 0x20c9
			// Code size 23 (0x17)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld class Program/'<>c__DisplayClass1_1' Program/'<>c__DisplayClass1_2'::'CS$<>8__locals2'
			IL_0006: callvirt instance void Program/'<>c__DisplayClass1_1'::'<M>g__M1|0'()
			IL_000b: ldarg.0
			IL_000c: ldfld int32 Program/'<>c__DisplayClass1_2'::c
			IL_0011: call void [mscorlib]System.Console::WriteLine(int32)
			IL_0016: ret
		} // end of method '<>c__DisplayClass1_2'::'<M>g__M2|1'
	} // end of class <>c__DisplayClass1_2
	// Methods
	.method public hidebysig static 
		void Main () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 11 (0xb)
		.maxstack 8
		.entrypoint
		IL_0000: call class [mscorlib]System.Action Program::M()
		IL_0005: callvirt instance void [mscorlib]System.Action::Invoke()
		IL_000a: ret
	} // end of method Program::Main
	.method public hidebysig static 
		class [mscorlib]System.Action M () cil managed 
	{
		// Method begins at RVA 0x205c
		// Code size 64 (0x40)
		.maxstack 3
		.locals init (
			[0] class Program/'<>c__DisplayClass1_0',
			[1] class Program/'<>c__DisplayClass1_1'
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass1_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: ldloc.0
		IL_0007: ldc.i4.1
		IL_0008: stfld int32 Program/'<>c__DisplayClass1_0'::a
		IL_000d: newobj instance void Program/'<>c__DisplayClass1_1'::.ctor()
		IL_0012: stloc.1
		IL_0013: ldloc.1
		IL_0014: ldloc.0
		IL_0015: stfld class Program/'<>c__DisplayClass1_0' Program/'<>c__DisplayClass1_1'::'CS$<>8__locals1'
		IL_001a: ldloc.1
		IL_001b: ldc.i4.2
		IL_001c: stfld int32 Program/'<>c__DisplayClass1_1'::b
		IL_0021: newobj instance void Program/'<>c__DisplayClass1_2'::.ctor()
		IL_0026: dup
		IL_0027: ldloc.1
		IL_0028: stfld class Program/'<>c__DisplayClass1_1' Program/'<>c__DisplayClass1_2'::'CS$<>8__locals2'
		IL_002d: dup
		IL_002e: ldc.i4.3
		IL_002f: stfld int32 Program/'<>c__DisplayClass1_2'::c
		IL_0034: ldftn instance void Program/'<>c__DisplayClass1_2'::'<M>g__M2|1'()
		IL_003a: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
		IL_003f: ret
	} // end of method Program::M
	.method public hidebysig specialname rtspecialname 
		instance void .ctor () cil managed 
	{
		// Method begins at RVA 0x20a8
		// Code size 7 (0x7)
		.maxstack 8
		IL_0000: ldarg.0
		IL_0001: call instance void [mscorlib]System.Object::.ctor()
		IL_0006: ret
	} // end of method Program::.ctor
} // end of class Program");
        }
 
        [Fact]
        public void LocalMethod04()
        {
            var source =
                @"using System;
public class Program 
{
	public void M() 
	{
        int x = 0;
        {
            int y = 0;
            void M() => y++;
        
            {
                  Action a = () => x++;
            }
        }
	}
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute());
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 x
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2072
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
		.method assembly hidebysig 
			instance void '<M>b__1' () cil managed 
		{
			// Method begins at RVA 0x209c
			// Code size 17 (0x11)
			.maxstack 3
			.locals init (
				[0] int32
			)
			IL_0000: ldarg.0
			IL_0001: ldfld int32 Program/'<>c__DisplayClass0_0'::x
			IL_0006: stloc.0
			IL_0007: ldarg.0
			IL_0008: ldloc.0
			IL_0009: ldc.i4.1
			IL_000a: add
			IL_000b: stfld int32 Program/'<>c__DisplayClass0_0'::x
			IL_0010: ret
		} // end of method '<>c__DisplayClass0_0'::'<M>b__1'
	} // end of class <>c__DisplayClass0_0
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_1'
		extends [mscorlib]System.ValueType
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 y
	} // end of class <>c__DisplayClass0_1
	// Methods
	.method public hidebysig 
		instance void M () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 22 (0x16)
		.maxstack 3
		.locals init (
			[0] valuetype Program/'<>c__DisplayClass0_1'
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: dup
		IL_0006: ldc.i4.0
		IL_0007: stfld int32 Program/'<>c__DisplayClass0_0'::x
		IL_000c: ldloca.s 0
		IL_000e: ldc.i4.0
		IL_000f: stfld int32 Program/'<>c__DisplayClass0_1'::y
		IL_0014: pop
		IL_0015: ret
	} // end of method Program::M
	.method public hidebysig specialname rtspecialname 
		instance void .ctor () cil managed 
	{
		// Method begins at RVA 0x2072
		// Code size 7 (0x7)
		.maxstack 8
		IL_0000: ldarg.0
		IL_0001: call instance void [mscorlib]System.Object::.ctor()
		IL_0006: ret
	} // end of method Program::.ctor
	.method assembly hidebysig static 
		void '<M>g__M|0_0' (
			valuetype Program/'<>c__DisplayClass0_1'& ''
		) cil managed 
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Method begins at RVA 0x207c
		// Code size 17 (0x11)
		.maxstack 3
		.locals init (
			[0] int32
		)
		IL_0000: ldarg.0
		IL_0001: ldfld int32 Program/'<>c__DisplayClass0_1'::y
		IL_0006: stloc.0
		IL_0007: ldarg.0
		IL_0008: ldloc.0
		IL_0009: ldc.i4.1
		IL_000a: add
		IL_000b: stfld int32 Program/'<>c__DisplayClass0_1'::y
		IL_0010: ret
	} // end of method Program::'<M>g__M|0_0'
} // end of class Program");
        }
 
        [Fact]
        public void LocalMethod05()
        {
            var source =
                @"using System;
public class Program 
{
	public Func<int> M() 
	{
        int x = 0;
        {
            int y = 0;
            int M() => y++;
        
            {
                 Func<int> a = () => x++;
                {
                    int M1() => M() + a();
                    return M1;
                }
            }
        }
    }
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute());
 
            VerifyTypeIL(compilation, "Program", @"
.class public auto ansi beforefieldinit Program
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 x
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x20a0
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
		.method assembly hidebysig 
			instance int32 '<M>b__1' () cil managed 
		{
			// Method begins at RVA 0x20a8
			// Code size 18 (0x12)
			.maxstack 3
			.locals init (
				[0] int32
			)
			IL_0000: ldarg.0
			IL_0001: ldfld int32 Program/'<>c__DisplayClass0_0'::x
			IL_0006: stloc.0
			IL_0007: ldarg.0
			IL_0008: ldloc.0
			IL_0009: ldc.i4.1
			IL_000a: add
			IL_000b: stfld int32 Program/'<>c__DisplayClass0_0'::x
			IL_0010: ldloc.0
			IL_0011: ret
		} // end of method '<>c__DisplayClass0_0'::'<M>b__1'
	} // end of class <>c__DisplayClass0_0
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_1'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 y
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x20a0
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_1'::.ctor
		.method assembly hidebysig 
			instance int32 '<M>g__M|0' () cil managed 
		{
			// Method begins at RVA 0x20c8
			// Code size 18 (0x12)
			.maxstack 3
			.locals init (
				[0] int32
			)
			IL_0000: ldarg.0
			IL_0001: ldfld int32 Program/'<>c__DisplayClass0_1'::y
			IL_0006: stloc.0
			IL_0007: ldarg.0
			IL_0008: ldloc.0
			IL_0009: ldc.i4.1
			IL_000a: add
			IL_000b: stfld int32 Program/'<>c__DisplayClass0_1'::y
			IL_0010: ldloc.0
			IL_0011: ret
		} // end of method '<>c__DisplayClass0_1'::'<M>g__M|0'
	} // end of class <>c__DisplayClass0_1
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_2'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public class [mscorlib]System.Func`1<int32> a
		.field public class Program/'<>c__DisplayClass0_1' 'CS$<>8__locals1'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x20a0
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_2'::.ctor
		.method assembly hidebysig 
			instance int32 '<M>g__M1|2' () cil managed 
		{
			// Method begins at RVA 0x20e6
			// Code size 24 (0x18)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld class Program/'<>c__DisplayClass0_1' Program/'<>c__DisplayClass0_2'::'CS$<>8__locals1'
			IL_0006: callvirt instance int32 Program/'<>c__DisplayClass0_1'::'<M>g__M|0'()
			IL_000b: ldarg.0
			IL_000c: ldfld class [mscorlib]System.Func`1<int32> Program/'<>c__DisplayClass0_2'::a
			IL_0011: callvirt instance !0 class [mscorlib]System.Func`1<int32>::Invoke()
			IL_0016: add
			IL_0017: ret
		} // end of method '<>c__DisplayClass0_2'::'<M>g__M1|2'
	} // end of class <>c__DisplayClass0_2
	// Methods
	.method public hidebysig 
		instance class [mscorlib]System.Func`1<int32> M () cil managed 
	{
		// Method begins at RVA 0x2050
		// Code size 68 (0x44)
		.maxstack 4
		.locals init (
			[0] class Program/'<>c__DisplayClass0_0',
			[1] class Program/'<>c__DisplayClass0_1'
		)
		IL_0000: newobj instance void Program/'<>c__DisplayClass0_0'::.ctor()
		IL_0005: stloc.0
		IL_0006: ldloc.0
		IL_0007: ldc.i4.0
		IL_0008: stfld int32 Program/'<>c__DisplayClass0_0'::x
		IL_000d: newobj instance void Program/'<>c__DisplayClass0_1'::.ctor()
		IL_0012: stloc.1
		IL_0013: ldloc.1
		IL_0014: ldc.i4.0
		IL_0015: stfld int32 Program/'<>c__DisplayClass0_1'::y
		IL_001a: newobj instance void Program/'<>c__DisplayClass0_2'::.ctor()
		IL_001f: dup
		IL_0020: ldloc.1
		IL_0021: stfld class Program/'<>c__DisplayClass0_1' Program/'<>c__DisplayClass0_2'::'CS$<>8__locals1'
		IL_0026: dup
		IL_0027: ldloc.0
		IL_0028: ldftn instance int32 Program/'<>c__DisplayClass0_0'::'<M>b__1'()
		IL_002e: newobj instance void class [mscorlib]System.Func`1<int32>::.ctor(object, native int)
		IL_0033: stfld class [mscorlib]System.Func`1<int32> Program/'<>c__DisplayClass0_2'::a
		IL_0038: ldftn instance int32 Program/'<>c__DisplayClass0_2'::'<M>g__M1|2'()
		IL_003e: newobj instance void class [mscorlib]System.Func`1<int32>::.ctor(object, native int)
		IL_0043: ret
	} // end of method Program::M
	.method public hidebysig specialname rtspecialname 
		instance void .ctor () cil managed 
	{
		// Method begins at RVA 0x20a0
		// Code size 7 (0x7)
		.maxstack 8
		IL_0000: ldarg.0
		IL_0001: call instance void [mscorlib]System.Object::.ctor()
		IL_0006: ret
	} // end of method Program::.ctor
} // end of class Program");
        }
 
        [Fact]
        public void YieldReturnCorrectDisplayClasseAreCreated()
        {
            var source =
                @"using System;
using System.Collections.Generic;
 
public class C {
    public IEnumerable<int> M() {
        int a  = 1;
        yield return 1;
        while(true)
        {
            yield return 2;
        	int b = 2;
        	yield return 3;
            {
                yield return 4;
        		int c = 3;
                target:
        		yield return 5;
                {
                    yield return 6;
                    int d = 4;
                    goto target;
                    yield return 7;
                    Action e = () => Console.WriteLine(a + b + c + d);
                }
            }
        }
    }
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute());
 
            VerifyTypeIL(compilation, "C", @"
.class public auto ansi beforefieldinit C
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 a
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2059
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
	} // end of class <>c__DisplayClass0_0
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_1'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 b
		.field public int32 c
		.field public class C/'<>c__DisplayClass0_0' 'CS$<>8__locals1'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2059
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_1'::.ctor
	} // end of class <>c__DisplayClass0_1
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_2'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 d
		.field public class C/'<>c__DisplayClass0_1' 'CS$<>8__locals2'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x2059
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_2'::.ctor
		.method assembly hidebysig 
			instance void '<M>b__0' () cil managed 
		{
			// Method begins at RVA 0x2061
			// Code size 53 (0x35)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld class C/'<>c__DisplayClass0_1' C/'<>c__DisplayClass0_2'::'CS$<>8__locals2'
			IL_0006: ldfld class C/'<>c__DisplayClass0_0' C/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_000b: ldfld int32 C/'<>c__DisplayClass0_0'::a
			IL_0010: ldarg.0
			IL_0011: ldfld class C/'<>c__DisplayClass0_1' C/'<>c__DisplayClass0_2'::'CS$<>8__locals2'
			IL_0016: ldfld int32 C/'<>c__DisplayClass0_1'::b
			IL_001b: add
			IL_001c: ldarg.0
			IL_001d: ldfld class C/'<>c__DisplayClass0_1' C/'<>c__DisplayClass0_2'::'CS$<>8__locals2'
			IL_0022: ldfld int32 C/'<>c__DisplayClass0_1'::c
			IL_0027: add
			IL_0028: ldarg.0
			IL_0029: ldfld int32 C/'<>c__DisplayClass0_2'::d
			IL_002e: add
			IL_002f: call void [mscorlib]System.Console::WriteLine(int32)
			IL_0034: ret
		} // end of method '<>c__DisplayClass0_2'::'<M>b__0'
	} // end of class <>c__DisplayClass0_2
	.class nested private auto ansi sealed beforefieldinit '<M>d__0'
		extends [mscorlib]System.Object
		implements class [mscorlib]System.Collections.Generic.IEnumerable`1<int32>,
		           [mscorlib]System.Collections.IEnumerable,
		           class [mscorlib]System.Collections.Generic.IEnumerator`1<int32>,
		           [mscorlib]System.IDisposable,
		           [mscorlib]System.Collections.IEnumerator
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field private int32 '<>1__state'
		.field private int32 '<>2__current'
		.field private int32 '<>l__initialThreadId'
		.field private class C/'<>c__DisplayClass0_0' '<>8__1'
		.field private class C/'<>c__DisplayClass0_1' '<>8__2'
		.field private class C/'<>c__DisplayClass0_2' '<>8__3'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor (
				int32 '<>1__state'
			) cil managed 
		{
			.custom instance void [mscorlib]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (
				01 00 00 00
			)
			// Method begins at RVA 0x2097
			// Code size 25 (0x19)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ldarg.0
			IL_0007: ldarg.1
			IL_0008: stfld int32 C/'<M>d__0'::'<>1__state'
			IL_000d: ldarg.0
			IL_000e: call int32 [mscorlib]System.Environment::get_CurrentManagedThreadId()
			IL_0013: stfld int32 C/'<M>d__0'::'<>l__initialThreadId'
			IL_0018: ret
		} // end of method '<M>d__0'::.ctor
		.method private final hidebysig newslot virtual 
			instance void System.IDisposable.Dispose () cil managed 
		{
			.custom instance void [mscorlib]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (
				01 00 00 00
			)
			.override method instance void [mscorlib]System.IDisposable::Dispose()
			// Method begins at RVA 0x20b1
			// Code size 22 (0x16)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldnull
			IL_0002: stfld class C/'<>c__DisplayClass0_0' C/'<M>d__0'::'<>8__1'
			IL_0007: ldarg.0
			IL_0008: ldnull
			IL_0009: stfld class C/'<>c__DisplayClass0_1' C/'<M>d__0'::'<>8__2'
			IL_000e: ldarg.0
			IL_000f: ldnull
			IL_0010: stfld class C/'<>c__DisplayClass0_2' C/'<M>d__0'::'<>8__3'
			IL_0015: ret
		} // end of method '<M>d__0'::System.IDisposable.Dispose
		.method private final hidebysig newslot virtual 
			instance bool MoveNext () cil managed 
		{
			.override method instance bool [mscorlib]System.Collections.IEnumerator::MoveNext()
			// Method begins at RVA 0x20c8
			// Code size 342 (0x156)
			.maxstack 2
			.locals init (
				[0] int32
			)
			IL_0000: ldarg.0
			IL_0001: ldfld int32 C/'<M>d__0'::'<>1__state'
			IL_0006: stloc.0
			IL_0007: ldloc.0
			IL_0008: switch (IL_002f, IL_005d, IL_0090, IL_00b3, IL_00ca, IL_00ed, IL_0120, IL_0135)
			IL_002d: ldc.i4.0
			IL_002e: ret
			IL_002f: ldarg.0
			IL_0030: ldc.i4.m1
			IL_0031: stfld int32 C/'<M>d__0'::'<>1__state'
			IL_0036: ldarg.0
			IL_0037: newobj instance void C/'<>c__DisplayClass0_0'::.ctor()
			IL_003c: stfld class C/'<>c__DisplayClass0_0' C/'<M>d__0'::'<>8__1'
			IL_0041: ldarg.0
			IL_0042: ldfld class C/'<>c__DisplayClass0_0' C/'<M>d__0'::'<>8__1'
			IL_0047: ldc.i4.1
			IL_0048: stfld int32 C/'<>c__DisplayClass0_0'::a
			IL_004d: ldarg.0
			IL_004e: ldc.i4.1
			IL_004f: stfld int32 C/'<M>d__0'::'<>2__current'
			IL_0054: ldarg.0
			IL_0055: ldc.i4.1
			IL_0056: stfld int32 C/'<M>d__0'::'<>1__state'
			IL_005b: ldc.i4.1
			IL_005c: ret
			IL_005d: ldarg.0
			IL_005e: ldc.i4.m1
			IL_005f: stfld int32 C/'<M>d__0'::'<>1__state'
			IL_0064: ldarg.0
			IL_0065: newobj instance void C/'<>c__DisplayClass0_1'::.ctor()
			IL_006a: stfld class C/'<>c__DisplayClass0_1' C/'<M>d__0'::'<>8__2'
			IL_006f: ldarg.0
			IL_0070: ldfld class C/'<>c__DisplayClass0_1' C/'<M>d__0'::'<>8__2'
			IL_0075: ldarg.0
			IL_0076: ldfld class C/'<>c__DisplayClass0_0' C/'<M>d__0'::'<>8__1'
			IL_007b: stfld class C/'<>c__DisplayClass0_0' C/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_0080: ldarg.0
			IL_0081: ldc.i4.2
			IL_0082: stfld int32 C/'<M>d__0'::'<>2__current'
			IL_0087: ldarg.0
			IL_0088: ldc.i4.2
			IL_0089: stfld int32 C/'<M>d__0'::'<>1__state'
			IL_008e: ldc.i4.1
			IL_008f: ret
			IL_0090: ldarg.0
			IL_0091: ldc.i4.m1
			IL_0092: stfld int32 C/'<M>d__0'::'<>1__state'
			IL_0097: ldarg.0
			IL_0098: ldfld class C/'<>c__DisplayClass0_1' C/'<M>d__0'::'<>8__2'
			IL_009d: ldc.i4.2
			IL_009e: stfld int32 C/'<>c__DisplayClass0_1'::b
			IL_00a3: ldarg.0
			IL_00a4: ldc.i4.3
			IL_00a5: stfld int32 C/'<M>d__0'::'<>2__current'
			IL_00aa: ldarg.0
			IL_00ab: ldc.i4.3
			IL_00ac: stfld int32 C/'<M>d__0'::'<>1__state'
			IL_00b1: ldc.i4.1
			IL_00b2: ret
			IL_00b3: ldarg.0
			IL_00b4: ldc.i4.m1
			IL_00b5: stfld int32 C/'<M>d__0'::'<>1__state'
			IL_00ba: ldarg.0
			IL_00bb: ldc.i4.4
			IL_00bc: stfld int32 C/'<M>d__0'::'<>2__current'
			IL_00c1: ldarg.0
			IL_00c2: ldc.i4.4
			IL_00c3: stfld int32 C/'<M>d__0'::'<>1__state'
			IL_00c8: ldc.i4.1
			IL_00c9: ret
			IL_00ca: ldarg.0
			IL_00cb: ldc.i4.m1
			IL_00cc: stfld int32 C/'<M>d__0'::'<>1__state'
			IL_00d1: ldarg.0
			IL_00d2: ldfld class C/'<>c__DisplayClass0_1' C/'<M>d__0'::'<>8__2'
			IL_00d7: ldc.i4.3
			IL_00d8: stfld int32 C/'<>c__DisplayClass0_1'::c
			IL_00dd: ldarg.0
			IL_00de: ldc.i4.5
			IL_00df: stfld int32 C/'<M>d__0'::'<>2__current'
			IL_00e4: ldarg.0
			IL_00e5: ldc.i4.5
			IL_00e6: stfld int32 C/'<M>d__0'::'<>1__state'
			IL_00eb: ldc.i4.1
			IL_00ec: ret
			IL_00ed: ldarg.0
			IL_00ee: ldc.i4.m1
			IL_00ef: stfld int32 C/'<M>d__0'::'<>1__state'
			IL_00f4: ldarg.0
			IL_00f5: newobj instance void C/'<>c__DisplayClass0_2'::.ctor()
			IL_00fa: stfld class C/'<>c__DisplayClass0_2' C/'<M>d__0'::'<>8__3'
			IL_00ff: ldarg.0
			IL_0100: ldfld class C/'<>c__DisplayClass0_2' C/'<M>d__0'::'<>8__3'
			IL_0105: ldarg.0
			IL_0106: ldfld class C/'<>c__DisplayClass0_1' C/'<M>d__0'::'<>8__2'
			IL_010b: stfld class C/'<>c__DisplayClass0_1' C/'<>c__DisplayClass0_2'::'CS$<>8__locals2'
			IL_0110: ldarg.0
			IL_0111: ldc.i4.6
			IL_0112: stfld int32 C/'<M>d__0'::'<>2__current'
			IL_0117: ldarg.0
			IL_0118: ldc.i4.6
			IL_0119: stfld int32 C/'<M>d__0'::'<>1__state'
			IL_011e: ldc.i4.1
			IL_011f: ret
			IL_0120: ldarg.0
			IL_0121: ldc.i4.m1
			IL_0122: stfld int32 C/'<M>d__0'::'<>1__state'
			IL_0127: ldarg.0
			IL_0128: ldfld class C/'<>c__DisplayClass0_2' C/'<M>d__0'::'<>8__3'
			IL_012d: ldc.i4.4
			IL_012e: stfld int32 C/'<>c__DisplayClass0_2'::d
			IL_0133: br.s IL_00dd
			IL_0135: ldarg.0
			IL_0136: ldc.i4.m1
			IL_0137: stfld int32 C/'<M>d__0'::'<>1__state'
			IL_013c: ldarg.0
			IL_013d: ldfld class C/'<>c__DisplayClass0_2' C/'<M>d__0'::'<>8__3'
			IL_0142: pop
			IL_0143: ldarg.0
			IL_0144: ldnull
			IL_0145: stfld class C/'<>c__DisplayClass0_2' C/'<M>d__0'::'<>8__3'
			IL_014a: ldarg.0
			IL_014b: ldnull
			IL_014c: stfld class C/'<>c__DisplayClass0_1' C/'<M>d__0'::'<>8__2'
			IL_0151: br IL_0064
		} // end of method '<M>d__0'::MoveNext
		.method private final hidebysig specialname newslot virtual 
			instance int32 'System.Collections.Generic.IEnumerator<System.Int32>.get_Current' () cil managed 
		{
			.custom instance void [mscorlib]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (
				01 00 00 00
			)
			.override method instance !0 class [mscorlib]System.Collections.Generic.IEnumerator`1<int32>::get_Current()
			// Method begins at RVA 0x222a
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld int32 C/'<M>d__0'::'<>2__current'
			IL_0006: ret
		} // end of method '<M>d__0'::'System.Collections.Generic.IEnumerator<System.Int32>.get_Current'
		.method private final hidebysig newslot virtual 
			instance void System.Collections.IEnumerator.Reset () cil managed 
		{
			.custom instance void [mscorlib]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (
				01 00 00 00
			)
			.override method instance void [mscorlib]System.Collections.IEnumerator::Reset()
			// Method begins at RVA 0x2232
			// Code size 6 (0x6)
			.maxstack 8
			IL_0000: newobj instance void [mscorlib]System.NotSupportedException::.ctor()
			IL_0005: throw
		} // end of method '<M>d__0'::System.Collections.IEnumerator.Reset
		.method private final hidebysig specialname newslot virtual 
			instance object System.Collections.IEnumerator.get_Current () cil managed 
		{
			.custom instance void [mscorlib]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (
				01 00 00 00
			)
			.override method instance object [mscorlib]System.Collections.IEnumerator::get_Current()
			// Method begins at RVA 0x2239
			// Code size 12 (0xc)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld int32 C/'<M>d__0'::'<>2__current'
			IL_0006: box [mscorlib]System.Int32
			IL_000b: ret
		} // end of method '<M>d__0'::System.Collections.IEnumerator.get_Current
		.method private final hidebysig newslot virtual 
			instance class [mscorlib]System.Collections.Generic.IEnumerator`1<int32> 'System.Collections.Generic.IEnumerable<System.Int32>.GetEnumerator' () cil managed 
		{
			.custom instance void [mscorlib]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (
				01 00 00 00
			)
			.override method instance class [mscorlib]System.Collections.Generic.IEnumerator`1<!0> class [mscorlib]System.Collections.Generic.IEnumerable`1<int32>::GetEnumerator()
			// Method begins at RVA 0x2248
			// Code size 43 (0x2b)
			.maxstack 2
			.locals init (
				[0] class C/'<M>d__0'
			)
			IL_0000: ldarg.0
			IL_0001: ldfld int32 C/'<M>d__0'::'<>1__state'
			IL_0006: ldc.i4.s -2
			IL_0008: bne.un.s IL_0022
			IL_000a: ldarg.0
			IL_000b: ldfld int32 C/'<M>d__0'::'<>l__initialThreadId'
			IL_0010: call int32 [mscorlib]System.Environment::get_CurrentManagedThreadId()
			IL_0015: bne.un.s IL_0022
			IL_0017: ldarg.0
			IL_0018: ldc.i4.0
			IL_0019: stfld int32 C/'<M>d__0'::'<>1__state'
			IL_001e: ldarg.0
			IL_001f: stloc.0
			IL_0020: br.s IL_0029
			IL_0022: ldc.i4.0
			IL_0023: newobj instance void C/'<M>d__0'::.ctor(int32)
			IL_0028: stloc.0
			IL_0029: ldloc.0
			IL_002a: ret
		} // end of method '<M>d__0'::'System.Collections.Generic.IEnumerable<System.Int32>.GetEnumerator'
		.method private final hidebysig newslot virtual 
			instance class [mscorlib]System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator () cil managed 
		{
			.custom instance void [mscorlib]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (
				01 00 00 00
			)
			.override method instance class [mscorlib]System.Collections.IEnumerator [mscorlib]System.Collections.IEnumerable::GetEnumerator()
			// Method begins at RVA 0x227f
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance class [mscorlib]System.Collections.Generic.IEnumerator`1<int32> C/'<M>d__0'::'System.Collections.Generic.IEnumerable<System.Int32>.GetEnumerator'()
			IL_0006: ret
		} // end of method '<M>d__0'::System.Collections.IEnumerable.GetEnumerator
		// Properties
		.property instance int32 'System.Collections.Generic.IEnumerator<System.Int32>.Current'()
		{
			.get instance int32 C/'<M>d__0'::'System.Collections.Generic.IEnumerator<System.Int32>.get_Current'()
		}
		.property instance object System.Collections.IEnumerator.Current()
		{
			.get instance object C/'<M>d__0'::System.Collections.IEnumerator.get_Current()
		}
	} // end of class <M>d__0
	// Methods
	.method public hidebysig 
		instance class [mscorlib]System.Collections.Generic.IEnumerable`1<int32> M () cil managed 
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.IteratorStateMachineAttribute::.ctor(class [mscorlib]System.Type) = (
			01 00 09 43 2b 3c 4d 3e 64 5f 5f 30 00 00
		)
		// Method begins at RVA 0x2050
		// Code size 8 (0x8)
		.maxstack 8
		IL_0000: ldc.i4.s -2
		IL_0002: newobj instance void C/'<M>d__0'::.ctor(int32)
		IL_0007: ret
	} // end of method C::M
	.method public hidebysig specialname rtspecialname 
		instance void .ctor () cil managed 
	{
		// Method begins at RVA 0x2059
		// Code size 7 (0x7)
		.maxstack 8
		IL_0000: ldarg.0
		IL_0001: call instance void [mscorlib]System.Object::.ctor()
		IL_0006: ret
	} // end of method C::.ctor
} // end of class C");
        }
 
        [Fact]
        public void AsyncAwaitCorrectDisplayClasseAreCreated()
        {
            var source =
                @"using System;
using System.Threading.Tasks;
 
public class C {
    public async Task M() {
        int a  = 1;
        await Task.Delay(0);
        while(true)
        {
            await Task.Delay(0);
        	int b = 2;
        	await Task.Delay(0);
            {
                await Task.Delay(0);
        		int c = 3;
                target:
        		await Task.Delay(0);
                {
                    await Task.Delay(0);
                    int d = 4;
                    goto target;
                    await Task.Delay(0);
                    Action e = () => Console.WriteLine(a + b + c + d);
                }
            }
        }
    }
}";
            var compilation = CompileAndVerify(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute());
 
            VerifyTypeIL(compilation, "C", @"
.class public auto ansi beforefieldinit C
	extends [mscorlib]System.Object
{
	// Nested Types
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_0'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 a
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x208b
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_0'::.ctor
	} // end of class <>c__DisplayClass0_0
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_1'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 b
		.field public int32 c
		.field public class C/'<>c__DisplayClass0_0' 'CS$<>8__locals1'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x208b
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_1'::.ctor
	} // end of class <>c__DisplayClass0_1
	.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass0_2'
		extends [mscorlib]System.Object
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 d
		.field public class C/'<>c__DisplayClass0_1' 'CS$<>8__locals2'
		// Methods
		.method public hidebysig specialname rtspecialname 
			instance void .ctor () cil managed 
		{
			// Method begins at RVA 0x208b
			// Code size 7 (0x7)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: call instance void [mscorlib]System.Object::.ctor()
			IL_0006: ret
		} // end of method '<>c__DisplayClass0_2'::.ctor
		.method assembly hidebysig 
			instance void '<M>b__0' () cil managed 
		{
			// Method begins at RVA 0x2093
			// Code size 53 (0x35)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldfld class C/'<>c__DisplayClass0_1' C/'<>c__DisplayClass0_2'::'CS$<>8__locals2'
			IL_0006: ldfld class C/'<>c__DisplayClass0_0' C/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
			IL_000b: ldfld int32 C/'<>c__DisplayClass0_0'::a
			IL_0010: ldarg.0
			IL_0011: ldfld class C/'<>c__DisplayClass0_1' C/'<>c__DisplayClass0_2'::'CS$<>8__locals2'
			IL_0016: ldfld int32 C/'<>c__DisplayClass0_1'::b
			IL_001b: add
			IL_001c: ldarg.0
			IL_001d: ldfld class C/'<>c__DisplayClass0_1' C/'<>c__DisplayClass0_2'::'CS$<>8__locals2'
			IL_0022: ldfld int32 C/'<>c__DisplayClass0_1'::c
			IL_0027: add
			IL_0028: ldarg.0
			IL_0029: ldfld int32 C/'<>c__DisplayClass0_2'::d
			IL_002e: add
			IL_002f: call void [mscorlib]System.Console::WriteLine(int32)
			IL_0034: ret
		} // end of method '<>c__DisplayClass0_2'::'<M>b__0'
	} // end of class <>c__DisplayClass0_2
	.class nested private auto ansi sealed beforefieldinit '<M>d__0'
		extends [mscorlib]System.ValueType
		implements [mscorlib]System.Runtime.CompilerServices.IAsyncStateMachine
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
			01 00 00 00
		)
		// Fields
		.field public int32 '<>1__state'
		.field public valuetype [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder '<>t__builder'
		.field private class C/'<>c__DisplayClass0_0' '<>8__1'
		.field private class C/'<>c__DisplayClass0_1' '<>8__2'
		.field private class C/'<>c__DisplayClass0_2' '<>8__3'
		.field private valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter '<>u__1'
		// Methods
		.method private final hidebysig newslot virtual 
			instance void MoveNext () cil managed 
		{
			.override method instance void [mscorlib]System.Runtime.CompilerServices.IAsyncStateMachine::MoveNext()
			// Method begins at RVA 0x20cc
			// Code size 792 (0x318)
			.maxstack 3
			.locals init (
				[0] int32,
				[1] valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter,
				[2] class [mscorlib]System.Exception
			)
			IL_0000: ldarg.0
			IL_0001: ldfld int32 C/'<M>d__0'::'<>1__state'
			IL_0006: stloc.0
			.try
			{
				IL_0007: ldloc.0
				IL_0008: switch (IL_0078, IL_00ef, IL_0156, IL_01b1, IL_0218, IL_028f, IL_02c3)
				IL_0029: ldarg.0
				IL_002a: newobj instance void C/'<>c__DisplayClass0_0'::.ctor()
				IL_002f: stfld class C/'<>c__DisplayClass0_0' C/'<M>d__0'::'<>8__1'
				IL_0034: ldarg.0
				IL_0035: ldfld class C/'<>c__DisplayClass0_0' C/'<M>d__0'::'<>8__1'
				IL_003a: ldc.i4.1
				IL_003b: stfld int32 C/'<>c__DisplayClass0_0'::a
				IL_0040: ldc.i4.0
				IL_0041: call class [mscorlib]System.Threading.Tasks.Task [mscorlib]System.Threading.Tasks.Task::Delay(int32)
				IL_0046: callvirt instance valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter [mscorlib]System.Threading.Tasks.Task::GetAwaiter()
				IL_004b: stloc.1
				IL_004c: ldloca.s 1
				IL_004e: call instance bool [mscorlib]System.Runtime.CompilerServices.TaskAwaiter::get_IsCompleted()
				IL_0053: brtrue.s IL_0094
				IL_0055: ldarg.0
				IL_0056: ldc.i4.0
				IL_0057: dup
				IL_0058: stloc.0
				IL_0059: stfld int32 C/'<M>d__0'::'<>1__state'
				IL_005e: ldarg.0
				IL_005f: ldloc.1
				IL_0060: stfld valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter C/'<M>d__0'::'<>u__1'
				IL_0065: ldarg.0
				IL_0066: ldflda valuetype [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder C/'<M>d__0'::'<>t__builder'
				IL_006b: ldloca.s 1
				IL_006d: ldarg.0
				IL_006e: call instance void [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder::AwaitUnsafeOnCompleted<valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter, valuetype C/'<M>d__0'>(!!0&, !!1&)
				IL_0073: leave IL_0317
				IL_0078: ldarg.0
				IL_0079: ldfld valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter C/'<M>d__0'::'<>u__1'
				IL_007e: stloc.1
				IL_007f: ldarg.0
				IL_0080: ldflda valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter C/'<M>d__0'::'<>u__1'
				IL_0085: initobj [mscorlib]System.Runtime.CompilerServices.TaskAwaiter
				IL_008b: ldarg.0
				IL_008c: ldc.i4.m1
				IL_008d: dup
				IL_008e: stloc.0
				IL_008f: stfld int32 C/'<M>d__0'::'<>1__state'
				IL_0094: ldloca.s 1
				IL_0096: call instance void [mscorlib]System.Runtime.CompilerServices.TaskAwaiter::GetResult()
				IL_009b: ldarg.0
				IL_009c: newobj instance void C/'<>c__DisplayClass0_1'::.ctor()
				IL_00a1: stfld class C/'<>c__DisplayClass0_1' C/'<M>d__0'::'<>8__2'
				IL_00a6: ldarg.0
				IL_00a7: ldfld class C/'<>c__DisplayClass0_1' C/'<M>d__0'::'<>8__2'
				IL_00ac: ldarg.0
				IL_00ad: ldfld class C/'<>c__DisplayClass0_0' C/'<M>d__0'::'<>8__1'
				IL_00b2: stfld class C/'<>c__DisplayClass0_0' C/'<>c__DisplayClass0_1'::'CS$<>8__locals1'
				IL_00b7: ldc.i4.0
				IL_00b8: call class [mscorlib]System.Threading.Tasks.Task [mscorlib]System.Threading.Tasks.Task::Delay(int32)
				IL_00bd: callvirt instance valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter [mscorlib]System.Threading.Tasks.Task::GetAwaiter()
				IL_00c2: stloc.1
				IL_00c3: ldloca.s 1
				IL_00c5: call instance bool [mscorlib]System.Runtime.CompilerServices.TaskAwaiter::get_IsCompleted()
				IL_00ca: brtrue.s IL_010b
				IL_00cc: ldarg.0
				IL_00cd: ldc.i4.1
				IL_00ce: dup
				IL_00cf: stloc.0
				IL_00d0: stfld int32 C/'<M>d__0'::'<>1__state'
				IL_00d5: ldarg.0
				IL_00d6: ldloc.1
				IL_00d7: stfld valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter C/'<M>d__0'::'<>u__1'
				IL_00dc: ldarg.0
				IL_00dd: ldflda valuetype [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder C/'<M>d__0'::'<>t__builder'
				IL_00e2: ldloca.s 1
				IL_00e4: ldarg.0
				IL_00e5: call instance void [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder::AwaitUnsafeOnCompleted<valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter, valuetype C/'<M>d__0'>(!!0&, !!1&)
				IL_00ea: leave IL_0317
				IL_00ef: ldarg.0
				IL_00f0: ldfld valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter C/'<M>d__0'::'<>u__1'
				IL_00f5: stloc.1
				IL_00f6: ldarg.0
				IL_00f7: ldflda valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter C/'<M>d__0'::'<>u__1'
				IL_00fc: initobj [mscorlib]System.Runtime.CompilerServices.TaskAwaiter
				IL_0102: ldarg.0
				IL_0103: ldc.i4.m1
				IL_0104: dup
				IL_0105: stloc.0
				IL_0106: stfld int32 C/'<M>d__0'::'<>1__state'
				IL_010b: ldloca.s 1
				IL_010d: call instance void [mscorlib]System.Runtime.CompilerServices.TaskAwaiter::GetResult()
				IL_0112: ldarg.0
				IL_0113: ldfld class C/'<>c__DisplayClass0_1' C/'<M>d__0'::'<>8__2'
				IL_0118: ldc.i4.2
				IL_0119: stfld int32 C/'<>c__DisplayClass0_1'::b
				IL_011e: ldc.i4.0
				IL_011f: call class [mscorlib]System.Threading.Tasks.Task [mscorlib]System.Threading.Tasks.Task::Delay(int32)
				IL_0124: callvirt instance valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter [mscorlib]System.Threading.Tasks.Task::GetAwaiter()
				IL_0129: stloc.1
				IL_012a: ldloca.s 1
				IL_012c: call instance bool [mscorlib]System.Runtime.CompilerServices.TaskAwaiter::get_IsCompleted()
				IL_0131: brtrue.s IL_0172
				IL_0133: ldarg.0
				IL_0134: ldc.i4.2
				IL_0135: dup
				IL_0136: stloc.0
				IL_0137: stfld int32 C/'<M>d__0'::'<>1__state'
				IL_013c: ldarg.0
				IL_013d: ldloc.1
				IL_013e: stfld valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter C/'<M>d__0'::'<>u__1'
				IL_0143: ldarg.0
				IL_0144: ldflda valuetype [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder C/'<M>d__0'::'<>t__builder'
				IL_0149: ldloca.s 1
				IL_014b: ldarg.0
				IL_014c: call instance void [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder::AwaitUnsafeOnCompleted<valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter, valuetype C/'<M>d__0'>(!!0&, !!1&)
				IL_0151: leave IL_0317
				IL_0156: ldarg.0
				IL_0157: ldfld valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter C/'<M>d__0'::'<>u__1'
				IL_015c: stloc.1
				IL_015d: ldarg.0
				IL_015e: ldflda valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter C/'<M>d__0'::'<>u__1'
				IL_0163: initobj [mscorlib]System.Runtime.CompilerServices.TaskAwaiter
				IL_0169: ldarg.0
				IL_016a: ldc.i4.m1
				IL_016b: dup
				IL_016c: stloc.0
				IL_016d: stfld int32 C/'<M>d__0'::'<>1__state'
				IL_0172: ldloca.s 1
				IL_0174: call instance void [mscorlib]System.Runtime.CompilerServices.TaskAwaiter::GetResult()
				IL_0179: ldc.i4.0
				IL_017a: call class [mscorlib]System.Threading.Tasks.Task [mscorlib]System.Threading.Tasks.Task::Delay(int32)
				IL_017f: callvirt instance valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter [mscorlib]System.Threading.Tasks.Task::GetAwaiter()
				IL_0184: stloc.1
				IL_0185: ldloca.s 1
				IL_0187: call instance bool [mscorlib]System.Runtime.CompilerServices.TaskAwaiter::get_IsCompleted()
				IL_018c: brtrue.s IL_01cd
				IL_018e: ldarg.0
				IL_018f: ldc.i4.3
				IL_0190: dup
				IL_0191: stloc.0
				IL_0192: stfld int32 C/'<M>d__0'::'<>1__state'
				IL_0197: ldarg.0
				IL_0198: ldloc.1
				IL_0199: stfld valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter C/'<M>d__0'::'<>u__1'
				IL_019e: ldarg.0
				IL_019f: ldflda valuetype [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder C/'<M>d__0'::'<>t__builder'
				IL_01a4: ldloca.s 1
				IL_01a6: ldarg.0
				IL_01a7: call instance void [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder::AwaitUnsafeOnCompleted<valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter, valuetype C/'<M>d__0'>(!!0&, !!1&)
				IL_01ac: leave IL_0317
				IL_01b1: ldarg.0
				IL_01b2: ldfld valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter C/'<M>d__0'::'<>u__1'
				IL_01b7: stloc.1
				IL_01b8: ldarg.0
				IL_01b9: ldflda valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter C/'<M>d__0'::'<>u__1'
				IL_01be: initobj [mscorlib]System.Runtime.CompilerServices.TaskAwaiter
				IL_01c4: ldarg.0
				IL_01c5: ldc.i4.m1
				IL_01c6: dup
				IL_01c7: stloc.0
				IL_01c8: stfld int32 C/'<M>d__0'::'<>1__state'
				IL_01cd: ldloca.s 1
				IL_01cf: call instance void [mscorlib]System.Runtime.CompilerServices.TaskAwaiter::GetResult()
				IL_01d4: ldarg.0
				IL_01d5: ldfld class C/'<>c__DisplayClass0_1' C/'<M>d__0'::'<>8__2'
				IL_01da: ldc.i4.3
				IL_01db: stfld int32 C/'<>c__DisplayClass0_1'::c
				IL_01e0: ldc.i4.0
				IL_01e1: call class [mscorlib]System.Threading.Tasks.Task [mscorlib]System.Threading.Tasks.Task::Delay(int32)
				IL_01e6: callvirt instance valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter [mscorlib]System.Threading.Tasks.Task::GetAwaiter()
				IL_01eb: stloc.1
				IL_01ec: ldloca.s 1
				IL_01ee: call instance bool [mscorlib]System.Runtime.CompilerServices.TaskAwaiter::get_IsCompleted()
				IL_01f3: brtrue.s IL_0234
				IL_01f5: ldarg.0
				IL_01f6: ldc.i4.4
				IL_01f7: dup
				IL_01f8: stloc.0
				IL_01f9: stfld int32 C/'<M>d__0'::'<>1__state'
				IL_01fe: ldarg.0
				IL_01ff: ldloc.1
				IL_0200: stfld valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter C/'<M>d__0'::'<>u__1'
				IL_0205: ldarg.0
				IL_0206: ldflda valuetype [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder C/'<M>d__0'::'<>t__builder'
				IL_020b: ldloca.s 1
				IL_020d: ldarg.0
				IL_020e: call instance void [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder::AwaitUnsafeOnCompleted<valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter, valuetype C/'<M>d__0'>(!!0&, !!1&)
				IL_0213: leave IL_0317
				IL_0218: ldarg.0
				IL_0219: ldfld valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter C/'<M>d__0'::'<>u__1'
				IL_021e: stloc.1
				IL_021f: ldarg.0
				IL_0220: ldflda valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter C/'<M>d__0'::'<>u__1'
				IL_0225: initobj [mscorlib]System.Runtime.CompilerServices.TaskAwaiter
				IL_022b: ldarg.0
				IL_022c: ldc.i4.m1
				IL_022d: dup
				IL_022e: stloc.0
				IL_022f: stfld int32 C/'<M>d__0'::'<>1__state'
				IL_0234: ldloca.s 1
				IL_0236: call instance void [mscorlib]System.Runtime.CompilerServices.TaskAwaiter::GetResult()
				IL_023b: ldarg.0
				IL_023c: newobj instance void C/'<>c__DisplayClass0_2'::.ctor()
				IL_0241: stfld class C/'<>c__DisplayClass0_2' C/'<M>d__0'::'<>8__3'
				IL_0246: ldarg.0
				IL_0247: ldfld class C/'<>c__DisplayClass0_2' C/'<M>d__0'::'<>8__3'
				IL_024c: ldarg.0
				IL_024d: ldfld class C/'<>c__DisplayClass0_1' C/'<M>d__0'::'<>8__2'
				IL_0252: stfld class C/'<>c__DisplayClass0_1' C/'<>c__DisplayClass0_2'::'CS$<>8__locals2'
				IL_0257: ldc.i4.0
				IL_0258: call class [mscorlib]System.Threading.Tasks.Task [mscorlib]System.Threading.Tasks.Task::Delay(int32)
				IL_025d: callvirt instance valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter [mscorlib]System.Threading.Tasks.Task::GetAwaiter()
				IL_0262: stloc.1
				IL_0263: ldloca.s 1
				IL_0265: call instance bool [mscorlib]System.Runtime.CompilerServices.TaskAwaiter::get_IsCompleted()
				IL_026a: brtrue.s IL_02ab
				IL_026c: ldarg.0
				IL_026d: ldc.i4.5
				IL_026e: dup
				IL_026f: stloc.0
				IL_0270: stfld int32 C/'<M>d__0'::'<>1__state'
				IL_0275: ldarg.0
				IL_0276: ldloc.1
				IL_0277: stfld valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter C/'<M>d__0'::'<>u__1'
				IL_027c: ldarg.0
				IL_027d: ldflda valuetype [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder C/'<M>d__0'::'<>t__builder'
				IL_0282: ldloca.s 1
				IL_0284: ldarg.0
				IL_0285: call instance void [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder::AwaitUnsafeOnCompleted<valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter, valuetype C/'<M>d__0'>(!!0&, !!1&)
				IL_028a: leave IL_0317
				IL_028f: ldarg.0
				IL_0290: ldfld valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter C/'<M>d__0'::'<>u__1'
				IL_0295: stloc.1
				IL_0296: ldarg.0
				IL_0297: ldflda valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter C/'<M>d__0'::'<>u__1'
				IL_029c: initobj [mscorlib]System.Runtime.CompilerServices.TaskAwaiter
				IL_02a2: ldarg.0
				IL_02a3: ldc.i4.m1
				IL_02a4: dup
				IL_02a5: stloc.0
				IL_02a6: stfld int32 C/'<M>d__0'::'<>1__state'
				IL_02ab: ldloca.s 1
				IL_02ad: call instance void [mscorlib]System.Runtime.CompilerServices.TaskAwaiter::GetResult()
				IL_02b2: ldarg.0
				IL_02b3: ldfld class C/'<>c__DisplayClass0_2' C/'<M>d__0'::'<>8__3'
				IL_02b8: ldc.i4.4
				IL_02b9: stfld int32 C/'<>c__DisplayClass0_2'::d
				IL_02be: br IL_01e0
				IL_02c3: ldarg.0
				IL_02c4: ldfld valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter C/'<M>d__0'::'<>u__1'
				IL_02c9: stloc.1
				IL_02ca: ldarg.0
				IL_02cb: ldflda valuetype [mscorlib]System.Runtime.CompilerServices.TaskAwaiter C/'<M>d__0'::'<>u__1'
				IL_02d0: initobj [mscorlib]System.Runtime.CompilerServices.TaskAwaiter
				IL_02d6: ldarg.0
				IL_02d7: ldc.i4.m1
				IL_02d8: dup
				IL_02d9: stloc.0
				IL_02da: stfld int32 C/'<M>d__0'::'<>1__state'
				IL_02df: ldloca.s 1
				IL_02e1: call instance void [mscorlib]System.Runtime.CompilerServices.TaskAwaiter::GetResult()
				IL_02e6: ldarg.0
				IL_02e7: ldnull
				IL_02e8: stfld class C/'<>c__DisplayClass0_2' C/'<M>d__0'::'<>8__3'
				IL_02ed: ldarg.0
				IL_02ee: ldnull
				IL_02ef: stfld class C/'<>c__DisplayClass0_1' C/'<M>d__0'::'<>8__2'
				IL_02f4: br IL_009b
			} // end .try
			catch [mscorlib]System.Exception
			{
				IL_02f9: stloc.2
				IL_02fa: ldarg.0
				IL_02fb: ldc.i4.s -2
				IL_02fd: stfld int32 C/'<M>d__0'::'<>1__state'
				IL_0302: ldarg.0
				IL_0303: ldnull
				IL_0304: stfld class C/'<>c__DisplayClass0_0' C/'<M>d__0'::'<>8__1'
				IL_0309: ldarg.0
				IL_030a: ldflda valuetype [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder C/'<M>d__0'::'<>t__builder'
				IL_030f: ldloc.2
				IL_0310: call instance void [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder::SetException(class [mscorlib]System.Exception)
				IL_0315: leave.s IL_0317
			} // end handler
			IL_0317: ret
		} // end of method '<M>d__0'::MoveNext
		.method private final hidebysig newslot virtual 
			instance void SetStateMachine (
				class [mscorlib]System.Runtime.CompilerServices.IAsyncStateMachine stateMachine
			) cil managed 
		{
			.custom instance void [mscorlib]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (
				01 00 00 00
			)
			.override method instance void [mscorlib]System.Runtime.CompilerServices.IAsyncStateMachine::SetStateMachine(class [mscorlib]System.Runtime.CompilerServices.IAsyncStateMachine)
			// Method begins at RVA 0x240c
			// Code size 13 (0xd)
			.maxstack 8
			IL_0000: ldarg.0
			IL_0001: ldflda valuetype [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder C/'<M>d__0'::'<>t__builder'
			IL_0006: ldarg.1
			IL_0007: call instance void [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder::SetStateMachine(class [mscorlib]System.Runtime.CompilerServices.IAsyncStateMachine)
			IL_000c: ret
		} // end of method '<M>d__0'::SetStateMachine
	} // end of class <M>d__0
	// Methods
	.method public hidebysig 
		instance class [mscorlib]System.Threading.Tasks.Task M () cil managed 
	{
		.custom instance void [mscorlib]System.Runtime.CompilerServices.AsyncStateMachineAttribute::.ctor(class [mscorlib]System.Type) = (
			01 00 09 43 2b 3c 4d 3e 64 5f 5f 30 00 00
		)
		// Method begins at RVA 0x2050
		// Code size 47 (0x2f)
		.maxstack 2
		.locals init (
			[0] valuetype C/'<M>d__0'
		)
		IL_0000: ldloca.s 0
		IL_0002: call valuetype [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder::Create()
		IL_0007: stfld valuetype [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder C/'<M>d__0'::'<>t__builder'
		IL_000c: ldloca.s 0
		IL_000e: ldc.i4.m1
		IL_000f: stfld int32 C/'<M>d__0'::'<>1__state'
		IL_0014: ldloca.s 0
		IL_0016: ldflda valuetype [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder C/'<M>d__0'::'<>t__builder'
		IL_001b: ldloca.s 0
		IL_001d: call instance void [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder::Start<valuetype C/'<M>d__0'>(!!0&)
		IL_0022: ldloca.s 0
		IL_0024: ldflda valuetype [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder C/'<M>d__0'::'<>t__builder'
		IL_0029: call instance class [mscorlib]System.Threading.Tasks.Task [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder::get_Task()
		IL_002e: ret
	} // end of method C::M
	.method public hidebysig specialname rtspecialname 
		instance void .ctor () cil managed 
	{
		// Method begins at RVA 0x208b
		// Code size 7 (0x7)
		.maxstack 8
		IL_0000: ldarg.0
		IL_0001: call instance void [mscorlib]System.Object::.ctor()
		IL_0006: ret
	} // end of method C::.ctor
} // end of class C");
        }
    }
}