From 4203a681d81e7f2bedf36be32048ed0a2f45318c Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sat, 12 Jul 2025 13:47:52 +0200 Subject: [PATCH] Extend test cases --- .../ICSharpCode.Decompiler.Tests.csproj | 4 +- .../NoGenericTypeInstantiation.Expected.cs | 17 ---- .../Ugly/NoGenericTypeInstantiation.cs | 15 --- .../TestCases/Ugly/NoNewOfT.Expected.cs | 68 +++++++++++++ .../TestCases/Ugly/NoNewOfT.cs | 27 +++++ ...enericTypeInstantiation.il => NoNewOfT.il} | 98 ++++++++++++++++--- ...t40.roslyn.il => NoNewOfT.net40.roslyn.il} | 77 ++++++++++++--- ...peInstantiation.opt.il => NoNewOfT.opt.il} | 81 ++++++++++++--- ...roslyn.il => NoNewOfT.opt.net40.roslyn.il} | 58 +++++++++-- ...n.opt.roslyn.il => NoNewOfT.opt.roslyn.il} | 66 ++++++++++--- ...antiation.roslyn.il => NoNewOfT.roslyn.il} | 85 +++++++++++++--- .../UglyTestRunner.cs | 3 +- 12 files changed, 481 insertions(+), 118 deletions(-) delete mode 100644 ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.Expected.cs delete mode 100644 ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.cs create mode 100644 ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoNewOfT.Expected.cs create mode 100644 ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoNewOfT.cs rename ICSharpCode.Decompiler.Tests/TestCases/Ugly/{NoGenericTypeInstantiation.il => NoNewOfT.il} (51%) rename ICSharpCode.Decompiler.Tests/TestCases/Ugly/{NoGenericTypeInstantiation.net40.roslyn.il => NoNewOfT.net40.roslyn.il} (76%) rename ICSharpCode.Decompiler.Tests/TestCases/Ugly/{NoGenericTypeInstantiation.opt.il => NoNewOfT.opt.il} (52%) rename ICSharpCode.Decompiler.Tests/TestCases/Ugly/{NoGenericTypeInstantiation.opt.net40.roslyn.il => NoNewOfT.opt.net40.roslyn.il} (78%) rename ICSharpCode.Decompiler.Tests/TestCases/Ugly/{NoGenericTypeInstantiation.opt.roslyn.il => NoNewOfT.opt.roslyn.il} (56%) rename ICSharpCode.Decompiler.Tests/TestCases/Ugly/{NoGenericTypeInstantiation.roslyn.il => NoNewOfT.roslyn.il} (54%) diff --git a/ICSharpCode.Decompiler.Tests/ICSharpCode.Decompiler.Tests.csproj b/ICSharpCode.Decompiler.Tests/ICSharpCode.Decompiler.Tests.csproj index b49bb64c4..2c3e9f93f 100644 --- a/ICSharpCode.Decompiler.Tests/ICSharpCode.Decompiler.Tests.csproj +++ b/ICSharpCode.Decompiler.Tests/ICSharpCode.Decompiler.Tests.csproj @@ -152,8 +152,8 @@ - - + + diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.Expected.cs b/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.Expected.cs deleted file mode 100644 index af805e890..000000000 --- a/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.Expected.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; - -namespace ICSharpCode.Decompiler.Tests.TestCases.Ugly -{ - internal class NoGenericTypeInstantiation where TOnType : new() - { - public static TOnType CreateTOnType() - { - return Activator.CreateInstance(); - } - - public static TOnMethod CreateTOnMethod() where TOnMethod : new() - { - return Activator.CreateInstance(); - } - } -} diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.cs b/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.cs deleted file mode 100644 index 06cffa1a7..000000000 --- a/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace ICSharpCode.Decompiler.Tests.TestCases.Ugly -{ - internal class NoGenericTypeInstantiation where TOnType : new() - { - public static TOnType CreateTOnType() - { - return new TOnType(); - } - - public static TOnMethod CreateTOnMethod() where TOnMethod : new() - { - return new TOnMethod(); - } - } -} diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoNewOfT.Expected.cs b/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoNewOfT.Expected.cs new file mode 100644 index 000000000..9cdf26361 --- /dev/null +++ b/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoNewOfT.Expected.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; + +namespace ICSharpCode.Decompiler.Tests.TestCases.Ugly +{ + internal class NoNewOfT where TOnType : new() + { + public static TOnType CreateTOnType() + { +#if !ROSLYN +#if OPT + if (default(TOnType) != null) + { + return default(TOnType); + } + return Activator.CreateInstance(); +#else + return (default(TOnType) == null) ? Activator.CreateInstance() : default(TOnType); +#endif +#else + return Activator.CreateInstance(); +#endif + } + + public static T CreateUnconstrainedT() where T : new() + { +#if !ROSLYN +#if OPT + if (default(T) != null) + { + return default(T); + } + return Activator.CreateInstance(); +#else + return (default(T) == null) ? Activator.CreateInstance() : default(T); +#endif +#else + return Activator.CreateInstance(); +#endif + } + + public static T CreateClassT() where T : class, new() + { + return Activator.CreateInstance(); + } + + public static T CollectionInitializer() where T : IList, new() + { +#if ROSLYN + T result = Activator.CreateInstance(); + result.Add(1); + result.Add(2); + result.Add(3); + result.Add(4); + result.Add(5); + return result; +#else + T val = ((default(T) == null) ? Activator.CreateInstance() : default(T)); + val.Add(1); + val.Add(2); + val.Add(3); + val.Add(4); + val.Add(5); + return val; +#endif + } + } +} diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoNewOfT.cs b/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoNewOfT.cs new file mode 100644 index 000000000..2ceec6ec2 --- /dev/null +++ b/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoNewOfT.cs @@ -0,0 +1,27 @@ +using System.Collections.Generic; + +namespace ICSharpCode.Decompiler.Tests.TestCases.Ugly +{ + internal class NoNewOfT where TOnType : new() + { + public static TOnType CreateTOnType() + { + return new TOnType(); + } + + public static T CreateUnconstrainedT() where T : new() + { + return new T(); + } + + public static T CreateClassT() where T : class, new() + { + return new T(); + } + + public static T CollectionInitializer() where T : IList, new() + { + return new T() { 1, 2, 3, 4, 5 }; + } + } +} diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.il b/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoNewOfT.il similarity index 51% rename from ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.il rename to ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoNewOfT.il index 4f21fa536..59e8de7fd 100644 --- a/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.il +++ b/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoNewOfT.il @@ -9,7 +9,7 @@ .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. .ver 4:0:0:0 } -.assembly tmppi3wbt +.assembly tmpvpdwr1 { .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 ) .custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx @@ -19,8 +19,8 @@ .hash algorithm 0x00008004 .ver 0:0:0:0 } -.module tmppi3wbt.tmp -// MVID: {4130db71-37be-40af-9724-d988f7189866} +.module tmpvpdwr1.tmp +// MVID: {8447adbb-757d-4626-b7b7-846d745d90d0} .custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = ( 01 00 00 00 ) .imagebase 0x10000000 .file alignment 0x00000200 @@ -31,7 +31,7 @@ // =============== CLASS MEMBERS DECLARATION =================== -.class private auto ansi beforefieldinit ICSharpCode.Decompiler.Tests.TestCases.Ugly.NoGenericTypeInstantiation`1<.ctor TOnType> +.class private auto ansi beforefieldinit ICSharpCode.Decompiler.Tests.TestCases.Ugly.NoNewOfT`1<.ctor TOnType> extends [mscorlib]System.Object { .method public hidebysig static !TOnType @@ -60,24 +60,23 @@ IL_0025: ldloc.0 IL_0026: ret - } // end of method NoGenericTypeInstantiation`1::CreateTOnType + } // end of method NoNewOfT`1::CreateTOnType - .method public hidebysig static !!TOnMethod - CreateTOnMethod<.ctor TOnMethod>() cil managed + .method public hidebysig static !!T CreateUnconstrainedT<.ctor T>() cil managed { // Code size 39 (0x27) .maxstack 1 - .locals init (!!TOnMethod V_0, - !!TOnMethod V_1) + .locals init (!!T V_0, + !!T V_1) IL_0000: nop IL_0001: ldloca.s V_1 - IL_0003: initobj !!TOnMethod + IL_0003: initobj !!T IL_0009: ldloc.1 - IL_000a: box !!TOnMethod + IL_000a: box !!T IL_000f: brfalse.s IL_001c IL_0011: ldloca.s V_1 - IL_0013: initobj !!TOnMethod + IL_0013: initobj !!T IL_0019: ldloc.1 IL_001a: br.s IL_0021 @@ -88,7 +87,76 @@ IL_0025: ldloc.0 IL_0026: ret - } // end of method NoGenericTypeInstantiation`1::CreateTOnMethod + } // end of method NoNewOfT`1::CreateUnconstrainedT + + .method public hidebysig static !!T CreateClassT() cil managed + { + // Code size 11 (0xb) + .maxstack 1 + .locals init (!!T V_0) + IL_0000: nop + IL_0001: call !!0 [mscorlib]System.Activator::CreateInstance() + IL_0006: stloc.0 + IL_0007: br.s IL_0009 + + IL_0009: ldloc.0 + IL_000a: ret + } // end of method NoNewOfT`1::CreateClassT + + .method public hidebysig static !!T CollectionInitializer<.ctor (class [mscorlib]System.Collections.Generic.IList`1) T>() cil managed + { + // Code size 106 (0x6a) + .maxstack 2 + .locals init (!!T V_0, + !!T V_1, + !!T V_2) + IL_0000: nop + IL_0001: ldloca.s V_2 + IL_0003: initobj !!T + IL_0009: ldloc.2 + IL_000a: box !!T + IL_000f: brfalse.s IL_001c + + IL_0011: ldloca.s V_2 + IL_0013: initobj !!T + IL_0019: ldloc.2 + IL_001a: br.s IL_0021 + + IL_001c: call !!0 [mscorlib]System.Activator::CreateInstance() + IL_0021: nop + IL_0022: stloc.0 + IL_0023: ldloc.0 + IL_0024: box !!T + IL_0029: ldc.i4.1 + IL_002a: callvirt instance void class [mscorlib]System.Collections.Generic.ICollection`1::Add(!0) + IL_002f: nop + IL_0030: ldloc.0 + IL_0031: box !!T + IL_0036: ldc.i4.2 + IL_0037: callvirt instance void class [mscorlib]System.Collections.Generic.ICollection`1::Add(!0) + IL_003c: nop + IL_003d: ldloc.0 + IL_003e: box !!T + IL_0043: ldc.i4.3 + IL_0044: callvirt instance void class [mscorlib]System.Collections.Generic.ICollection`1::Add(!0) + IL_0049: nop + IL_004a: ldloc.0 + IL_004b: box !!T + IL_0050: ldc.i4.4 + IL_0051: callvirt instance void class [mscorlib]System.Collections.Generic.ICollection`1::Add(!0) + IL_0056: nop + IL_0057: ldloc.0 + IL_0058: box !!T + IL_005d: ldc.i4.5 + IL_005e: callvirt instance void class [mscorlib]System.Collections.Generic.ICollection`1::Add(!0) + IL_0063: nop + IL_0064: ldloc.0 + IL_0065: stloc.1 + IL_0066: br.s IL_0068 + + IL_0068: ldloc.1 + IL_0069: ret + } // end of method NoNewOfT`1::CollectionInitializer .method public hidebysig specialname rtspecialname instance void .ctor() cil managed @@ -98,9 +166,9 @@ IL_0000: ldarg.0 IL_0001: call instance void [mscorlib]System.Object::.ctor() IL_0006: ret - } // end of method NoGenericTypeInstantiation`1::.ctor + } // end of method NoNewOfT`1::.ctor -} // end of class ICSharpCode.Decompiler.Tests.TestCases.Ugly.NoGenericTypeInstantiation`1 +} // end of class ICSharpCode.Decompiler.Tests.TestCases.Ugly.NoNewOfT`1 // ============================================================= diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.net40.roslyn.il b/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoNewOfT.net40.roslyn.il similarity index 76% rename from ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.net40.roslyn.il rename to ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoNewOfT.net40.roslyn.il index 99236e576..a46e2be15 100644 --- a/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.net40.roslyn.il +++ b/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoNewOfT.net40.roslyn.il @@ -9,7 +9,7 @@ .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. .ver 4:0:0:0 } -.assembly tmphku2gd +.assembly tmpyccvci { .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 ) .custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx @@ -23,8 +23,8 @@ .hash algorithm 0x00008004 .ver 0:0:0:0 } -.module tmphku2gd.tmp -// MVID: {1307db53-f6c4-45d3-a995-8cb116ea8821} +.module tmpyccvci.tmp +// MVID: {ff6a33b6-7f19-447b-b168-f5c528dc4b6f} .custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = ( 01 00 00 00 ) .custom instance void System.Runtime.CompilerServices.RefSafetyRulesAttribute::.ctor(int32) = ( 01 00 0B 00 00 00 00 00 ) .imagebase 0x10000000 @@ -134,7 +134,7 @@ } // end of class System.Runtime.CompilerServices.RequiredMemberAttribute -.class private auto ansi beforefieldinit ICSharpCode.Decompiler.Tests.TestCases.Ugly.NoGenericTypeInstantiation`1<.ctor TOnType> +.class private auto ansi beforefieldinit ICSharpCode.Decompiler.Tests.TestCases.Ugly.NoNewOfT`1<.ctor TOnType> extends [mscorlib]System.Object { .method public hidebysig static !TOnType @@ -150,14 +150,13 @@ IL_0009: ldloc.0 IL_000a: ret - } // end of method NoGenericTypeInstantiation`1::CreateTOnType + } // end of method NoNewOfT`1::CreateTOnType - .method public hidebysig static !!TOnMethod - CreateTOnMethod<.ctor TOnMethod>() cil managed + .method public hidebysig static !!T CreateUnconstrainedT<.ctor T>() cil managed { // Code size 11 (0xb) .maxstack 1 - .locals init (!!TOnMethod V_0) + .locals init (!!T V_0) IL_0000: nop IL_0001: call !!0 [mscorlib]System.Activator::CreateInstance() IL_0006: stloc.0 @@ -165,7 +164,63 @@ IL_0009: ldloc.0 IL_000a: ret - } // end of method NoGenericTypeInstantiation`1::CreateTOnMethod + } // end of method NoNewOfT`1::CreateUnconstrainedT + + .method public hidebysig static !!T CreateClassT() cil managed + { + // Code size 11 (0xb) + .maxstack 1 + .locals init (!!T V_0) + IL_0000: nop + IL_0001: call !!0 [mscorlib]System.Activator::CreateInstance() + IL_0006: stloc.0 + IL_0007: br.s IL_0009 + + IL_0009: ldloc.0 + IL_000a: ret + } // end of method NoNewOfT`1::CreateClassT + + .method public hidebysig static !!T CollectionInitializer<.ctor (class [mscorlib]System.Collections.Generic.IList`1) T>() cil managed + { + // Code size 88 (0x58) + .maxstack 2 + .locals init (!!T V_0, + !!T V_1) + IL_0000: nop + IL_0001: call !!0 [mscorlib]System.Activator::CreateInstance() + IL_0006: stloc.0 + IL_0007: ldloca.s V_0 + IL_0009: ldc.i4.1 + IL_000a: constrained. !!T + IL_0010: callvirt instance void class [mscorlib]System.Collections.Generic.ICollection`1::Add(!0) + IL_0015: nop + IL_0016: ldloca.s V_0 + IL_0018: ldc.i4.2 + IL_0019: constrained. !!T + IL_001f: callvirt instance void class [mscorlib]System.Collections.Generic.ICollection`1::Add(!0) + IL_0024: nop + IL_0025: ldloca.s V_0 + IL_0027: ldc.i4.3 + IL_0028: constrained. !!T + IL_002e: callvirt instance void class [mscorlib]System.Collections.Generic.ICollection`1::Add(!0) + IL_0033: nop + IL_0034: ldloca.s V_0 + IL_0036: ldc.i4.4 + IL_0037: constrained. !!T + IL_003d: callvirt instance void class [mscorlib]System.Collections.Generic.ICollection`1::Add(!0) + IL_0042: nop + IL_0043: ldloca.s V_0 + IL_0045: ldc.i4.5 + IL_0046: constrained. !!T + IL_004c: callvirt instance void class [mscorlib]System.Collections.Generic.ICollection`1::Add(!0) + IL_0051: nop + IL_0052: ldloc.0 + IL_0053: stloc.1 + IL_0054: br.s IL_0056 + + IL_0056: ldloc.1 + IL_0057: ret + } // end of method NoNewOfT`1::CollectionInitializer .method public hidebysig specialname rtspecialname instance void .ctor() cil managed @@ -176,9 +231,9 @@ IL_0001: call instance void [mscorlib]System.Object::.ctor() IL_0006: nop IL_0007: ret - } // end of method NoGenericTypeInstantiation`1::.ctor + } // end of method NoNewOfT`1::.ctor -} // end of class ICSharpCode.Decompiler.Tests.TestCases.Ugly.NoGenericTypeInstantiation`1 +} // end of class ICSharpCode.Decompiler.Tests.TestCases.Ugly.NoNewOfT`1 // ============================================================= diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.opt.il b/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoNewOfT.opt.il similarity index 52% rename from ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.opt.il rename to ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoNewOfT.opt.il index 03a347cb7..c49b5ab54 100644 --- a/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.opt.il +++ b/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoNewOfT.opt.il @@ -9,7 +9,7 @@ .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. .ver 4:0:0:0 } -.assembly tmp4sutck +.assembly tmp1ekgox { .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 ) .custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx @@ -19,8 +19,8 @@ .hash algorithm 0x00008004 .ver 0:0:0:0 } -.module tmp4sutck.tmp -// MVID: {8529154b-7a90-417c-b54f-0d5c900533db} +.module tmp1ekgox.tmp +// MVID: {67ce32bd-0144-4136-a198-2fc9f941f624} .custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = ( 01 00 00 00 ) .imagebase 0x10000000 .file alignment 0x00000200 @@ -31,7 +31,7 @@ // =============== CLASS MEMBERS DECLARATION =================== -.class private auto ansi beforefieldinit ICSharpCode.Decompiler.Tests.TestCases.Ugly.NoGenericTypeInstantiation`1<.ctor TOnType> +.class private auto ansi beforefieldinit ICSharpCode.Decompiler.Tests.TestCases.Ugly.NoNewOfT`1<.ctor TOnType> extends [mscorlib]System.Object { .method public hidebysig static !TOnType @@ -54,29 +54,80 @@ IL_001a: call !!0 [mscorlib]System.Activator::CreateInstance() IL_001f: ret - } // end of method NoGenericTypeInstantiation`1::CreateTOnType + } // end of method NoNewOfT`1::CreateTOnType - .method public hidebysig static !!TOnMethod - CreateTOnMethod<.ctor TOnMethod>() cil managed + .method public hidebysig static !!T CreateUnconstrainedT<.ctor T>() cil managed { // Code size 32 (0x20) .maxstack 1 - .locals init (!!TOnMethod V_0, - !!TOnMethod V_1) + .locals init (!!T V_0, + !!T V_1) IL_0000: ldloca.s V_0 - IL_0002: initobj !!TOnMethod + IL_0002: initobj !!T IL_0008: ldloc.0 - IL_0009: box !!TOnMethod + IL_0009: box !!T IL_000e: brfalse.s IL_001a IL_0010: ldloca.s V_1 - IL_0012: initobj !!TOnMethod + IL_0012: initobj !!T IL_0018: ldloc.1 IL_0019: ret IL_001a: call !!0 [mscorlib]System.Activator::CreateInstance() IL_001f: ret - } // end of method NoGenericTypeInstantiation`1::CreateTOnMethod + } // end of method NoNewOfT`1::CreateUnconstrainedT + + .method public hidebysig static !!T CreateClassT() cil managed + { + // Code size 6 (0x6) + .maxstack 8 + IL_0000: call !!0 [mscorlib]System.Activator::CreateInstance() + IL_0005: ret + } // end of method NoNewOfT`1::CreateClassT + + .method public hidebysig static !!T CollectionInitializer<.ctor (class [mscorlib]System.Collections.Generic.IList`1) T>() cil managed + { + // Code size 95 (0x5f) + .maxstack 2 + .locals init (!!T V_0, + !!T V_1, + !!T V_2) + IL_0000: ldloca.s V_1 + IL_0002: initobj !!T + IL_0008: ldloc.1 + IL_0009: box !!T + IL_000e: brfalse.s IL_001b + + IL_0010: ldloca.s V_2 + IL_0012: initobj !!T + IL_0018: ldloc.2 + IL_0019: br.s IL_0020 + + IL_001b: call !!0 [mscorlib]System.Activator::CreateInstance() + IL_0020: stloc.0 + IL_0021: ldloc.0 + IL_0022: box !!T + IL_0027: ldc.i4.1 + IL_0028: callvirt instance void class [mscorlib]System.Collections.Generic.ICollection`1::Add(!0) + IL_002d: ldloc.0 + IL_002e: box !!T + IL_0033: ldc.i4.2 + IL_0034: callvirt instance void class [mscorlib]System.Collections.Generic.ICollection`1::Add(!0) + IL_0039: ldloc.0 + IL_003a: box !!T + IL_003f: ldc.i4.3 + IL_0040: callvirt instance void class [mscorlib]System.Collections.Generic.ICollection`1::Add(!0) + IL_0045: ldloc.0 + IL_0046: box !!T + IL_004b: ldc.i4.4 + IL_004c: callvirt instance void class [mscorlib]System.Collections.Generic.ICollection`1::Add(!0) + IL_0051: ldloc.0 + IL_0052: box !!T + IL_0057: ldc.i4.5 + IL_0058: callvirt instance void class [mscorlib]System.Collections.Generic.ICollection`1::Add(!0) + IL_005d: ldloc.0 + IL_005e: ret + } // end of method NoNewOfT`1::CollectionInitializer .method public hidebysig specialname rtspecialname instance void .ctor() cil managed @@ -86,9 +137,9 @@ IL_0000: ldarg.0 IL_0001: call instance void [mscorlib]System.Object::.ctor() IL_0006: ret - } // end of method NoGenericTypeInstantiation`1::.ctor + } // end of method NoNewOfT`1::.ctor -} // end of class ICSharpCode.Decompiler.Tests.TestCases.Ugly.NoGenericTypeInstantiation`1 +} // end of class ICSharpCode.Decompiler.Tests.TestCases.Ugly.NoNewOfT`1 // ============================================================= diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.opt.net40.roslyn.il b/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoNewOfT.opt.net40.roslyn.il similarity index 78% rename from ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.opt.net40.roslyn.il rename to ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoNewOfT.opt.net40.roslyn.il index 61d75dac2..849b7843d 100644 --- a/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.opt.net40.roslyn.il +++ b/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoNewOfT.opt.net40.roslyn.il @@ -9,7 +9,7 @@ .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. .ver 4:0:0:0 } -.assembly tmp2yw4m4 +.assembly tmp4xstme { .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 ) .custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx @@ -23,8 +23,8 @@ .hash algorithm 0x00008004 .ver 0:0:0:0 } -.module tmp2yw4m4.tmp -// MVID: {1cd5c846-415a-403b-98cb-2fd0dd281694} +.module tmp4xstme.tmp +// MVID: {a031faef-fcb2-420c-9cd3-6e9b01e7f81e} .custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = ( 01 00 00 00 ) .custom instance void System.Runtime.CompilerServices.RefSafetyRulesAttribute::.ctor(int32) = ( 01 00 0B 00 00 00 00 00 ) .imagebase 0x10000000 @@ -128,7 +128,7 @@ } // end of class System.Runtime.CompilerServices.RequiredMemberAttribute -.class private auto ansi beforefieldinit ICSharpCode.Decompiler.Tests.TestCases.Ugly.NoGenericTypeInstantiation`1<.ctor TOnType> +.class private auto ansi beforefieldinit ICSharpCode.Decompiler.Tests.TestCases.Ugly.NoNewOfT`1<.ctor TOnType> extends [mscorlib]System.Object { .method public hidebysig static !TOnType @@ -138,16 +138,54 @@ .maxstack 8 IL_0000: call !!0 [mscorlib]System.Activator::CreateInstance() IL_0005: ret - } // end of method NoGenericTypeInstantiation`1::CreateTOnType + } // end of method NoNewOfT`1::CreateTOnType - .method public hidebysig static !!TOnMethod - CreateTOnMethod<.ctor TOnMethod>() cil managed + .method public hidebysig static !!T CreateUnconstrainedT<.ctor T>() cil managed { // Code size 6 (0x6) .maxstack 8 IL_0000: call !!0 [mscorlib]System.Activator::CreateInstance() IL_0005: ret - } // end of method NoGenericTypeInstantiation`1::CreateTOnMethod + } // end of method NoNewOfT`1::CreateUnconstrainedT + + .method public hidebysig static !!T CreateClassT() cil managed + { + // Code size 6 (0x6) + .maxstack 8 + IL_0000: call !!0 [mscorlib]System.Activator::CreateInstance() + IL_0005: ret + } // end of method NoNewOfT`1::CreateClassT + + .method public hidebysig static !!T CollectionInitializer<.ctor (class [mscorlib]System.Collections.Generic.IList`1) T>() cil managed + { + // Code size 78 (0x4e) + .maxstack 2 + .locals init (!!T V_0) + IL_0000: call !!0 [mscorlib]System.Activator::CreateInstance() + IL_0005: stloc.0 + IL_0006: ldloca.s V_0 + IL_0008: ldc.i4.1 + IL_0009: constrained. !!T + IL_000f: callvirt instance void class [mscorlib]System.Collections.Generic.ICollection`1::Add(!0) + IL_0014: ldloca.s V_0 + IL_0016: ldc.i4.2 + IL_0017: constrained. !!T + IL_001d: callvirt instance void class [mscorlib]System.Collections.Generic.ICollection`1::Add(!0) + IL_0022: ldloca.s V_0 + IL_0024: ldc.i4.3 + IL_0025: constrained. !!T + IL_002b: callvirt instance void class [mscorlib]System.Collections.Generic.ICollection`1::Add(!0) + IL_0030: ldloca.s V_0 + IL_0032: ldc.i4.4 + IL_0033: constrained. !!T + IL_0039: callvirt instance void class [mscorlib]System.Collections.Generic.ICollection`1::Add(!0) + IL_003e: ldloca.s V_0 + IL_0040: ldc.i4.5 + IL_0041: constrained. !!T + IL_0047: callvirt instance void class [mscorlib]System.Collections.Generic.ICollection`1::Add(!0) + IL_004c: ldloc.0 + IL_004d: ret + } // end of method NoNewOfT`1::CollectionInitializer .method public hidebysig specialname rtspecialname instance void .ctor() cil managed @@ -157,9 +195,9 @@ IL_0000: ldarg.0 IL_0001: call instance void [mscorlib]System.Object::.ctor() IL_0006: ret - } // end of method NoGenericTypeInstantiation`1::.ctor + } // end of method NoNewOfT`1::.ctor -} // end of class ICSharpCode.Decompiler.Tests.TestCases.Ugly.NoGenericTypeInstantiation`1 +} // end of class ICSharpCode.Decompiler.Tests.TestCases.Ugly.NoNewOfT`1 // ============================================================= diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.opt.roslyn.il b/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoNewOfT.opt.roslyn.il similarity index 56% rename from ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.opt.roslyn.il rename to ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoNewOfT.opt.roslyn.il index e28f5c4b6..75c9478f9 100644 --- a/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.opt.roslyn.il +++ b/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoNewOfT.opt.roslyn.il @@ -7,9 +7,9 @@ .assembly extern System.Runtime { .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....: - .ver 8:0:0:0 + .ver 10:0:0:0 } -.assembly tmpbfpzzx +.assembly tmpauzspg { .custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 ) .custom instance void [System.Runtime]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx @@ -18,17 +18,15 @@ // --- The following custom attribute is added automatically, do not uncomment ------- // .custom instance void [System.Runtime]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [System.Runtime]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 02 00 00 00 00 00 ) - .custom instance void [System.Runtime]System.Runtime.Versioning.TargetFrameworkAttribute::.ctor(string) = ( 01 00 18 2E 4E 45 54 43 6F 72 65 41 70 70 2C 56 // ....NETCoreApp,V - 65 72 73 69 6F 6E 3D 76 38 2E 30 01 00 54 0E 14 // ersion=v8.0..T.. - 46 72 61 6D 65 77 6F 72 6B 44 69 73 70 6C 61 79 // FrameworkDisplay - 4E 61 6D 65 00 ) // Name. + .custom instance void [System.Runtime]System.Runtime.Versioning.TargetFrameworkAttribute::.ctor(string) = ( 01 00 19 2E 4E 45 54 43 6F 72 65 41 70 70 2C 56 // ....NETCoreApp,V + 65 72 73 69 6F 6E 3D 76 31 30 2E 30 00 00 ) // ersion=v10.0.. .permissionset reqmin = {[System.Runtime]System.Security.Permissions.SecurityPermissionAttribute = {property bool 'SkipVerification' = bool(true)}} .hash algorithm 0x00008004 .ver 0:0:0:0 } -.module tmpbfpzzx.tmp -// MVID: {5d4ee8e5-8c47-4519-bd9e-e6d2d3628bfc} +.module tmpauzspg.tmp +// MVID: {6d3a3b63-d01c-49f7-9515-565421f78266} .custom instance void [System.Runtime]System.Security.UnverifiableCodeAttribute::.ctor() = ( 01 00 00 00 ) .custom instance void [System.Runtime]System.Runtime.CompilerServices.RefSafetyRulesAttribute::.ctor(int32) = ( 01 00 0B 00 00 00 00 00 ) .imagebase 0x10000000 @@ -40,7 +38,7 @@ // =============== CLASS MEMBERS DECLARATION =================== -.class private auto ansi beforefieldinit ICSharpCode.Decompiler.Tests.TestCases.Ugly.NoGenericTypeInstantiation`1<.ctor TOnType> +.class private auto ansi beforefieldinit ICSharpCode.Decompiler.Tests.TestCases.Ugly.NoNewOfT`1<.ctor TOnType> extends [System.Runtime]System.Object { .method public hidebysig static !TOnType @@ -50,16 +48,54 @@ .maxstack 8 IL_0000: call !!0 [System.Runtime]System.Activator::CreateInstance() IL_0005: ret - } // end of method NoGenericTypeInstantiation`1::CreateTOnType + } // end of method NoNewOfT`1::CreateTOnType - .method public hidebysig static !!TOnMethod - CreateTOnMethod<.ctor TOnMethod>() cil managed + .method public hidebysig static !!T CreateUnconstrainedT<.ctor T>() cil managed { // Code size 6 (0x6) .maxstack 8 IL_0000: call !!0 [System.Runtime]System.Activator::CreateInstance() IL_0005: ret - } // end of method NoGenericTypeInstantiation`1::CreateTOnMethod + } // end of method NoNewOfT`1::CreateUnconstrainedT + + .method public hidebysig static !!T CreateClassT() cil managed + { + // Code size 6 (0x6) + .maxstack 8 + IL_0000: call !!0 [System.Runtime]System.Activator::CreateInstance() + IL_0005: ret + } // end of method NoNewOfT`1::CreateClassT + + .method public hidebysig static !!T CollectionInitializer<.ctor (class [System.Runtime]System.Collections.Generic.IList`1) T>() cil managed + { + // Code size 78 (0x4e) + .maxstack 2 + .locals init (!!T V_0) + IL_0000: call !!0 [System.Runtime]System.Activator::CreateInstance() + IL_0005: stloc.0 + IL_0006: ldloca.s V_0 + IL_0008: ldc.i4.1 + IL_0009: constrained. !!T + IL_000f: callvirt instance void class [System.Runtime]System.Collections.Generic.ICollection`1::Add(!0) + IL_0014: ldloca.s V_0 + IL_0016: ldc.i4.2 + IL_0017: constrained. !!T + IL_001d: callvirt instance void class [System.Runtime]System.Collections.Generic.ICollection`1::Add(!0) + IL_0022: ldloca.s V_0 + IL_0024: ldc.i4.3 + IL_0025: constrained. !!T + IL_002b: callvirt instance void class [System.Runtime]System.Collections.Generic.ICollection`1::Add(!0) + IL_0030: ldloca.s V_0 + IL_0032: ldc.i4.4 + IL_0033: constrained. !!T + IL_0039: callvirt instance void class [System.Runtime]System.Collections.Generic.ICollection`1::Add(!0) + IL_003e: ldloca.s V_0 + IL_0040: ldc.i4.5 + IL_0041: constrained. !!T + IL_0047: callvirt instance void class [System.Runtime]System.Collections.Generic.ICollection`1::Add(!0) + IL_004c: ldloc.0 + IL_004d: ret + } // end of method NoNewOfT`1::CollectionInitializer .method public hidebysig specialname rtspecialname instance void .ctor() cil managed @@ -69,9 +105,9 @@ IL_0000: ldarg.0 IL_0001: call instance void [System.Runtime]System.Object::.ctor() IL_0006: ret - } // end of method NoGenericTypeInstantiation`1::.ctor + } // end of method NoNewOfT`1::.ctor -} // end of class ICSharpCode.Decompiler.Tests.TestCases.Ugly.NoGenericTypeInstantiation`1 +} // end of class ICSharpCode.Decompiler.Tests.TestCases.Ugly.NoNewOfT`1 // ============================================================= diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.roslyn.il b/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoNewOfT.roslyn.il similarity index 54% rename from ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.roslyn.il rename to ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoNewOfT.roslyn.il index 00886efd5..3706f9e89 100644 --- a/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.roslyn.il +++ b/ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoNewOfT.roslyn.il @@ -7,9 +7,9 @@ .assembly extern System.Runtime { .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....: - .ver 8:0:0:0 + .ver 10:0:0:0 } -.assembly tmpw4dati +.assembly tmpybdlca { .custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 ) .custom instance void [System.Runtime]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx @@ -18,17 +18,15 @@ // --- The following custom attribute is added automatically, do not uncomment ------- // .custom instance void [System.Runtime]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [System.Runtime]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 07 01 00 00 00 00 ) - .custom instance void [System.Runtime]System.Runtime.Versioning.TargetFrameworkAttribute::.ctor(string) = ( 01 00 18 2E 4E 45 54 43 6F 72 65 41 70 70 2C 56 // ....NETCoreApp,V - 65 72 73 69 6F 6E 3D 76 38 2E 30 01 00 54 0E 14 // ersion=v8.0..T.. - 46 72 61 6D 65 77 6F 72 6B 44 69 73 70 6C 61 79 // FrameworkDisplay - 4E 61 6D 65 00 ) // Name. + .custom instance void [System.Runtime]System.Runtime.Versioning.TargetFrameworkAttribute::.ctor(string) = ( 01 00 19 2E 4E 45 54 43 6F 72 65 41 70 70 2C 56 // ....NETCoreApp,V + 65 72 73 69 6F 6E 3D 76 31 30 2E 30 00 00 ) // ersion=v10.0.. .permissionset reqmin = {[System.Runtime]System.Security.Permissions.SecurityPermissionAttribute = {property bool 'SkipVerification' = bool(true)}} .hash algorithm 0x00008004 .ver 0:0:0:0 } -.module tmpw4dati.tmp -// MVID: {901dcf98-cf20-4065-abc3-85086e5af113} +.module tmpybdlca.tmp +// MVID: {b57f13a4-d291-42ea-b595-3766c1f1470c} .custom instance void [System.Runtime]System.Security.UnverifiableCodeAttribute::.ctor() = ( 01 00 00 00 ) .custom instance void [System.Runtime]System.Runtime.CompilerServices.RefSafetyRulesAttribute::.ctor(int32) = ( 01 00 0B 00 00 00 00 00 ) .imagebase 0x10000000 @@ -40,7 +38,7 @@ // =============== CLASS MEMBERS DECLARATION =================== -.class private auto ansi beforefieldinit ICSharpCode.Decompiler.Tests.TestCases.Ugly.NoGenericTypeInstantiation`1<.ctor TOnType> +.class private auto ansi beforefieldinit ICSharpCode.Decompiler.Tests.TestCases.Ugly.NoNewOfT`1<.ctor TOnType> extends [System.Runtime]System.Object { .method public hidebysig static !TOnType @@ -56,14 +54,13 @@ IL_0009: ldloc.0 IL_000a: ret - } // end of method NoGenericTypeInstantiation`1::CreateTOnType + } // end of method NoNewOfT`1::CreateTOnType - .method public hidebysig static !!TOnMethod - CreateTOnMethod<.ctor TOnMethod>() cil managed + .method public hidebysig static !!T CreateUnconstrainedT<.ctor T>() cil managed { // Code size 11 (0xb) .maxstack 1 - .locals init (!!TOnMethod V_0) + .locals init (!!T V_0) IL_0000: nop IL_0001: call !!0 [System.Runtime]System.Activator::CreateInstance() IL_0006: stloc.0 @@ -71,7 +68,63 @@ IL_0009: ldloc.0 IL_000a: ret - } // end of method NoGenericTypeInstantiation`1::CreateTOnMethod + } // end of method NoNewOfT`1::CreateUnconstrainedT + + .method public hidebysig static !!T CreateClassT() cil managed + { + // Code size 11 (0xb) + .maxstack 1 + .locals init (!!T V_0) + IL_0000: nop + IL_0001: call !!0 [System.Runtime]System.Activator::CreateInstance() + IL_0006: stloc.0 + IL_0007: br.s IL_0009 + + IL_0009: ldloc.0 + IL_000a: ret + } // end of method NoNewOfT`1::CreateClassT + + .method public hidebysig static !!T CollectionInitializer<.ctor (class [System.Runtime]System.Collections.Generic.IList`1) T>() cil managed + { + // Code size 88 (0x58) + .maxstack 2 + .locals init (!!T V_0, + !!T V_1) + IL_0000: nop + IL_0001: call !!0 [System.Runtime]System.Activator::CreateInstance() + IL_0006: stloc.0 + IL_0007: ldloca.s V_0 + IL_0009: ldc.i4.1 + IL_000a: constrained. !!T + IL_0010: callvirt instance void class [System.Runtime]System.Collections.Generic.ICollection`1::Add(!0) + IL_0015: nop + IL_0016: ldloca.s V_0 + IL_0018: ldc.i4.2 + IL_0019: constrained. !!T + IL_001f: callvirt instance void class [System.Runtime]System.Collections.Generic.ICollection`1::Add(!0) + IL_0024: nop + IL_0025: ldloca.s V_0 + IL_0027: ldc.i4.3 + IL_0028: constrained. !!T + IL_002e: callvirt instance void class [System.Runtime]System.Collections.Generic.ICollection`1::Add(!0) + IL_0033: nop + IL_0034: ldloca.s V_0 + IL_0036: ldc.i4.4 + IL_0037: constrained. !!T + IL_003d: callvirt instance void class [System.Runtime]System.Collections.Generic.ICollection`1::Add(!0) + IL_0042: nop + IL_0043: ldloca.s V_0 + IL_0045: ldc.i4.5 + IL_0046: constrained. !!T + IL_004c: callvirt instance void class [System.Runtime]System.Collections.Generic.ICollection`1::Add(!0) + IL_0051: nop + IL_0052: ldloc.0 + IL_0053: stloc.1 + IL_0054: br.s IL_0056 + + IL_0056: ldloc.1 + IL_0057: ret + } // end of method NoNewOfT`1::CollectionInitializer .method public hidebysig specialname rtspecialname instance void .ctor() cil managed @@ -82,9 +135,9 @@ IL_0001: call instance void [System.Runtime]System.Object::.ctor() IL_0006: nop IL_0007: ret - } // end of method NoGenericTypeInstantiation`1::.ctor + } // end of method NoNewOfT`1::.ctor -} // end of class ICSharpCode.Decompiler.Tests.TestCases.Ugly.NoGenericTypeInstantiation`1 +} // end of class ICSharpCode.Decompiler.Tests.TestCases.Ugly.NoNewOfT`1 // ============================================================= diff --git a/ICSharpCode.Decompiler.Tests/UglyTestRunner.cs b/ICSharpCode.Decompiler.Tests/UglyTestRunner.cs index 0b191cd5f..f6b05db1b 100644 --- a/ICSharpCode.Decompiler.Tests/UglyTestRunner.cs +++ b/ICSharpCode.Decompiler.Tests/UglyTestRunner.cs @@ -17,7 +17,6 @@ // DEALINGS IN THE SOFTWARE. using System; -using System.CodeDom.Compiler; using System.IO; using System.Linq; using System.Runtime.CompilerServices; @@ -133,7 +132,7 @@ namespace ICSharpCode.Decompiler.Tests } [Test] - public async Task NoGenericTypeInstantiation([ValueSource(nameof(roslynOnlyOptions))] CompilerOptions cscOptions) + public async Task NoNewOfT([ValueSource(nameof(defaultOptions))] CompilerOptions cscOptions) { await RunForLibrary(cscOptions: cscOptions, decompilerSettings: new DecompilerSettings(CSharp.LanguageVersion.CSharp1)); }