From 28ffe2776d9c0146e6b5e021f170768229b206f3 Mon Sep 17 00:00:00 2001 From: Paul Chen Date: Wed, 12 Jan 2022 00:22:25 +0800 Subject: [PATCH] Feedback: Add a test for C# 10. Add tests for cache field sharing the same anonymous delegate. --- ...odeGenMethodGroupConversionCachingTests.cs | 130 ++++++++++++++++++ 1 file changed, 130 insertions(+) diff --git a/src/Compilers/CSharp/Test/Emit2/CodeGen/CodeGenMethodGroupConversionCachingTests.cs b/src/Compilers/CSharp/Test/Emit2/CodeGen/CodeGenMethodGroupConversionCachingTests.cs index cda9e8791c245..50cc12f67f61a 100644 --- a/src/Compilers/CSharp/Test/Emit2/CodeGen/CodeGenMethodGroupConversionCachingTests.cs +++ b/src/Compilers/CSharp/Test/Emit2/CodeGen/CodeGenMethodGroupConversionCachingTests.cs @@ -507,6 +507,28 @@ .maxstack 2 "); } + [Fact] + public void Not_CSharp10() + { + var source = @" +var f = Target; +f(); +static void Target() { } +"; + var verifier = CompileAndVerify(source, parseOptions: TestOptions.Regular10, symbolValidator: VerifyNoCacheContainersIn("Program")); + verifier.VerifyIL("", @" +{ + // Code size 18 (0x12) + .maxstack 2 + IL_0000: ldnull + IL_0001: ldftn ""void Program.<
$>g__Target|0_0()"" + IL_0007: newobj ""System.Action..ctor(object, System.IntPtr)"" + IL_000c: callvirt ""void System.Action.Invoke()"" + IL_0011: ret +} +"); + } + [Fact] public void CacheExplicitConversions_TypeScoped_CouldBeModuleScoped0() { @@ -3023,6 +3045,62 @@ .maxstack 2 "); } + [Fact] + public void SameTypeAndSymbolResultsSameField_TypeScoped5_AnonymousDelegate() + { + var source = @" +class C +{ + void Test0(T t) { G0(Target); } + void Test1(T t) { G1(Target); } + + void G0(System.Delegate d) { } + void G1(System.Delegate d) { } + + static dynamic Target(ref G g) => 0; +} +"; + var verifier = CompileAndVerify(source, symbolValidator: VerifyCacheContainer("C.<>O", arity: 0 + , "<>F{00000001} <0>__Target" + )); + verifier.VerifyIL("C.Test0", @" +{ + // Code size 34 (0x22) + .maxstack 3 + IL_0000: ldarg.0 + IL_0001: ldsfld "" C.<>O.<0>__Target"" + IL_0006: dup + IL_0007: brtrue.s IL_001c + IL_0009: pop + IL_000a: ldnull + IL_000b: ldftn ""dynamic C.Target(ref int)"" + IL_0011: newobj ""<>F{00000001}..ctor(object, System.IntPtr)"" + IL_0016: dup + IL_0017: stsfld "" C.<>O.<0>__Target"" + IL_001c: call ""void C.G0(System.Delegate)"" + IL_0021: ret +} +"); + verifier.VerifyIL("C.Test1", @" +{ + // Code size 34 (0x22) + .maxstack 3 + IL_0000: ldarg.0 + IL_0001: ldsfld "" C.<>O.<0>__Target"" + IL_0006: dup + IL_0007: brtrue.s IL_001c + IL_0009: pop + IL_000a: ldnull + IL_000b: ldftn ""dynamic C.Target(ref int)"" + IL_0011: newobj ""<>F{00000001}..ctor(object, System.IntPtr)"" + IL_0016: dup + IL_0017: stsfld "" C.<>O.<0>__Target"" + IL_001c: call ""void C.G1(System.Delegate)"" + IL_0021: ret +} +"); + } + [Fact] public void SameTypeAndSymbolResultsSameField_MethodScoped0() { @@ -3193,6 +3271,58 @@ .maxstack 2 "); } + [Fact] + public void SameTypeAndSymbolResultsSameField_MethodScoped4_AnonymousDelegate() + { + var source = @" +class C +{ + void Test(T t) + { + G0(Target); + G1(Target); + } + + void G0(System.Delegate d) { } + void G1(System.Delegate d) { } + + static dynamic Target(ref G g) => 0; +} +"; + var verifier = CompileAndVerify(source, symbolValidator: VerifyCacheContainer("C.O__0_0", arity: 1 + , "<>F{00000001} <0>__Target" + )); + verifier.VerifyIL("C.Test", @" +{ + // Code size 67 (0x43) + .maxstack 3 + IL_0000: ldarg.0 + IL_0001: ldsfld "" C.O__0_0.<0>__Target"" + IL_0006: dup + IL_0007: brtrue.s IL_001c + IL_0009: pop + IL_000a: ldnull + IL_000b: ldftn ""dynamic C.Target(ref T)"" + IL_0011: newobj ""<>F{00000001}..ctor(object, System.IntPtr)"" + IL_0016: dup + IL_0017: stsfld "" C.O__0_0.<0>__Target"" + IL_001c: call ""void C.G0(System.Delegate)"" + IL_0021: ldarg.0 + IL_0022: ldsfld "" C.O__0_0.<0>__Target"" + IL_0027: dup + IL_0028: brtrue.s IL_003d + IL_002a: pop + IL_002b: ldnull + IL_002c: ldftn ""dynamic C.Target(ref T)"" + IL_0032: newobj ""<>F{00000001}..ctor(object, System.IntPtr)"" + IL_0037: dup + IL_0038: stsfld "" C.O__0_0.<0>__Target"" + IL_003d: call ""void C.G1(System.Delegate)"" + IL_0042: ret +} +"); + } + [Fact] public void ContainersCanBeShared_TypeScoped0() {