Browse Source

Fix #953: Missing nullable specifier for array initializer

pull/960/head
Siegfried Pammer 8 years ago
parent
commit
23c7a8a46e
  1. 58
      ICSharpCode.Decompiler.Tests/TestCases/Correctness/InitializerTests.cs
  2. 12
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.cs
  3. 50
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.il
  4. 38
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.opt.il
  5. 40
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.opt.roslyn.il
  6. 52
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.roslyn.il
  7. 6
      ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

58
ICSharpCode.Decompiler.Tests/TestCases/Correctness/InitializerTests.cs

@ -194,6 +194,64 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Correctness
}); });
} }
public static void NestedNullableArray(int a, int b, int c)
{
InitializerTests.X(InitializerTests.Y(), new int?[][]
{
new int?[]
{
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
null
},
new int?[]
{
a,
b,
c,
null
},
new int?[]
{
1,
2,
3,
4,
5,
6,
null
}
});
}
public unsafe static void NestedPointerArray(int a, int b, int c)
{
InitializerTests.X(InitializerTests.Y(), new void*[][]
{
new void*[]
{
null
},
new void*[]
{
(void*)200,
null
},
new void*[]
{
(void*)100,
null
}
});
}
public static void ArrayBoolean() public static void ArrayBoolean()
{ {
InitializerTests.X(InitializerTests.Y(), new bool[] InitializerTests.X(InitializerTests.Y(), new bool[]

12
ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.cs

@ -344,6 +344,11 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty
return "Test"; return "Test";
} }
private static void NoOp(Guid?[] array)
{
}
#if !LEGACY_CSC #if !LEGACY_CSC
public static void SimpleDictInitializer() public static void SimpleDictInitializer()
{ {
@ -480,5 +485,12 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty
} }
}); });
} }
public static void Bug953_MissingNullableSpecifierForArrayInitializer()
{
InitializerTests.NoOp(new Guid?[1] {
Guid.Empty
});
}
} }
} }

50
ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.il

@ -1,6 +1,6 @@
// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.1055.0 // Microsoft (R) .NET Framework IL Disassembler. Version 4.6.1055.0
// Copyright (c) Microsoft Corporation. Alle Rechte vorbehalten. // Copyright (c) Microsoft Corporation. All rights reserved.
@ -15,7 +15,7 @@
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 4:0:0:0 .ver 4:0:0:0
} }
.assembly n0iwoj0v .assembly '31sn40gd'
{ {
.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.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 .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
@ -25,15 +25,15 @@
.hash algorithm 0x00008004 .hash algorithm 0x00008004
.ver 0:0:0:0 .ver 0:0:0:0
} }
.module n0iwoj0v.dll .module '31sn40gd.dll'
// MVID: {04AC1961-FA71-4E8B-A77B-45FF217A617C} // MVID: {EE7CB403-8040-4C94-B17A-F697CE60CA23}
.custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = ( 01 00 00 00 ) .custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = ( 01 00 00 00 )
.imagebase 0x10000000 .imagebase 0x10000000
.file alignment 0x00000200 .file alignment 0x00000200
.stackreserve 0x00100000 .stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI .subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY .corflags 0x00000001 // ILONLY
// Image base: 0x009A0000 // Image base: 0x02FB0000
// =============== CLASS MEMBERS DECLARATION =================== // =============== CLASS MEMBERS DECLARATION ===================
@ -1172,6 +1172,14 @@
IL_000a: ret IL_000a: ret
} // end of method InitializerTests::GetString } // end of method InitializerTests::GetString
.method private hidebysig static void NoOp(valuetype [mscorlib]System.Nullable`1<valuetype [mscorlib]System.Guid>[] 'array') cil managed
{
// Code size 2 (0x2)
.maxstack 8
IL_0000: nop
IL_0001: ret
} // end of method InitializerTests::NoOp
.method public hidebysig static void ObjectInitializerWithInitializationOfDeeplyNestedObjects() cil managed .method public hidebysig static void ObjectInitializerWithInitializationOfDeeplyNestedObjects() cil managed
{ {
// Code size 84 (0x54) // Code size 84 (0x54)
@ -1474,6 +1482,27 @@
IL_007f: ret IL_007f: ret
} // end of method InitializerTests::Bug270_NestedInitialisers } // end of method InitializerTests::Bug270_NestedInitialisers
.method public hidebysig static void Bug953_MissingNullableSpecifierForArrayInitializer() cil managed
{
// Code size 38 (0x26)
.maxstack 2
.locals init (valuetype [mscorlib]System.Nullable`1<valuetype [mscorlib]System.Guid>[] V_0)
IL_0000: nop
IL_0001: ldc.i4.1
IL_0002: newarr valuetype [mscorlib]System.Nullable`1<valuetype [mscorlib]System.Guid>
IL_0007: stloc.0
IL_0008: ldloc.0
IL_0009: ldc.i4.0
IL_000a: ldelema valuetype [mscorlib]System.Nullable`1<valuetype [mscorlib]System.Guid>
IL_000f: ldsfld valuetype [mscorlib]System.Guid [mscorlib]System.Guid::Empty
IL_0014: newobj instance void valuetype [mscorlib]System.Nullable`1<valuetype [mscorlib]System.Guid>::.ctor(!0)
IL_0019: stobj valuetype [mscorlib]System.Nullable`1<valuetype [mscorlib]System.Guid>
IL_001e: ldloc.0
IL_001f: call void ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests::NoOp(valuetype [mscorlib]System.Nullable`1<valuetype [mscorlib]System.Guid>[])
IL_0024: nop
IL_0025: ret
} // end of method InitializerTests::Bug953_MissingNullableSpecifierForArrayInitializer
.method public hidebysig specialname rtspecialname .method public hidebysig specialname rtspecialname
instance void .ctor() cil managed instance void .ctor() cil managed
{ {
@ -1488,11 +1517,12 @@
class [mscorlib]System.EventArgs e) cil managed class [mscorlib]System.EventArgs e) cil managed
{ {
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 7 (0x7) // Code size 8 (0x8)
.maxstack 8 .maxstack 8
IL_0000: call void [mscorlib]System.Console::WriteLine() IL_0000: nop
IL_0005: nop IL_0001: call void [mscorlib]System.Console::WriteLine()
IL_0006: ret IL_0006: nop
IL_0007: ret
} // end of method InitializerTests::'<NotAnObjectInitializerWithEvent>b__7' } // end of method InitializerTests::'<NotAnObjectInitializerWithEvent>b__7'
.method private hidebysig static bool '<Bug270_NestedInitialisers>b__1b'(class [mscorlib]System.Globalization.NumberFormatInfo format) cil managed .method private hidebysig static bool '<Bug270_NestedInitialisers>b__1b'(class [mscorlib]System.Globalization.NumberFormatInfo format) cil managed
@ -1519,4 +1549,4 @@
// ============================================================= // =============================================================
// *********** DISASSEMBLY COMPLETE *********************** // *********** DISASSEMBLY COMPLETE ***********************
// Warnung: Win32-Ressourcendatei "../../../TestCases/Pretty\InitializerTests.res" wurde erstellt. // WARNING: Created Win32 resource file ../../../TestCases/Pretty\InitializerTests.res

38
ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.opt.il

@ -1,6 +1,6 @@
// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.1055.0 // Microsoft (R) .NET Framework IL Disassembler. Version 4.6.1055.0
// Copyright (c) Microsoft Corporation. Alle Rechte vorbehalten. // Copyright (c) Microsoft Corporation. All rights reserved.
@ -15,7 +15,7 @@
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 4:0:0:0 .ver 4:0:0:0
} }
.assembly mo2wq1js .assembly awwuldf0
{ {
.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.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 .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
@ -25,15 +25,15 @@
.hash algorithm 0x00008004 .hash algorithm 0x00008004
.ver 0:0:0:0 .ver 0:0:0:0
} }
.module mo2wq1js.dll .module awwuldf0.dll
// MVID: {99F5978B-D68E-4578-9D8F-7D47C1F63A30} // MVID: {59891EFA-EBA3-4F9A-9034-4F24037CEC15}
.custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = ( 01 00 00 00 ) .custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = ( 01 00 00 00 )
.imagebase 0x10000000 .imagebase 0x10000000
.file alignment 0x00000200 .file alignment 0x00000200
.stackreserve 0x00100000 .stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI .subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY .corflags 0x00000001 // ILONLY
// Image base: 0x027A0000 // Image base: 0x03070000
// =============== CLASS MEMBERS DECLARATION =================== // =============== CLASS MEMBERS DECLARATION ===================
@ -981,6 +981,13 @@
IL_0005: ret IL_0005: ret
} // end of method InitializerTests::GetString } // end of method InitializerTests::GetString
.method private hidebysig static void NoOp(valuetype [mscorlib]System.Nullable`1<valuetype [mscorlib]System.Guid>[] 'array') cil managed
{
// Code size 1 (0x1)
.maxstack 8
IL_0000: ret
} // end of method InitializerTests::NoOp
.method public hidebysig static void ObjectInitializerWithInitializationOfDeeplyNestedObjects() cil managed .method public hidebysig static void ObjectInitializerWithInitializationOfDeeplyNestedObjects() cil managed
{ {
// Code size 79 (0x4f) // Code size 79 (0x4f)
@ -1239,6 +1246,25 @@
IL_0076: ret IL_0076: ret
} // end of method InitializerTests::Bug270_NestedInitialisers } // end of method InitializerTests::Bug270_NestedInitialisers
.method public hidebysig static void Bug953_MissingNullableSpecifierForArrayInitializer() cil managed
{
// Code size 36 (0x24)
.maxstack 2
.locals init (valuetype [mscorlib]System.Nullable`1<valuetype [mscorlib]System.Guid>[] V_0)
IL_0000: ldc.i4.1
IL_0001: newarr valuetype [mscorlib]System.Nullable`1<valuetype [mscorlib]System.Guid>
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: ldc.i4.0
IL_0009: ldelema valuetype [mscorlib]System.Nullable`1<valuetype [mscorlib]System.Guid>
IL_000e: ldsfld valuetype [mscorlib]System.Guid [mscorlib]System.Guid::Empty
IL_0013: newobj instance void valuetype [mscorlib]System.Nullable`1<valuetype [mscorlib]System.Guid>::.ctor(!0)
IL_0018: stobj valuetype [mscorlib]System.Nullable`1<valuetype [mscorlib]System.Guid>
IL_001d: ldloc.0
IL_001e: call void ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests::NoOp(valuetype [mscorlib]System.Nullable`1<valuetype [mscorlib]System.Guid>[])
IL_0023: ret
} // end of method InitializerTests::Bug953_MissingNullableSpecifierForArrayInitializer
.method public hidebysig specialname rtspecialname .method public hidebysig specialname rtspecialname
instance void .ctor() cil managed instance void .ctor() cil managed
{ {
@ -1278,4 +1304,4 @@
// ============================================================= // =============================================================
// *********** DISASSEMBLY COMPLETE *********************** // *********** DISASSEMBLY COMPLETE ***********************
// Warnung: Win32-Ressourcendatei "../../../TestCases/Pretty\InitializerTests.opt.res" wurde erstellt. // WARNING: Created Win32 resource file ../../../TestCases/Pretty\InitializerTests.opt.res

40
ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.opt.roslyn.il

@ -1,6 +1,6 @@
// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.1055.0 // Microsoft (R) .NET Framework IL Disassembler. Version 4.6.1055.0
// Copyright (c) Microsoft Corporation. Alle Rechte vorbehalten. // Copyright (c) Microsoft Corporation. All rights reserved.
@ -30,14 +30,14 @@
.ver 0:0:0:0 .ver 0:0:0:0
} }
.module InitializerTests.dll .module InitializerTests.dll
// MVID: {1A200C9E-AB38-4402-A1D6-E7C3307A45E2} // MVID: {8AE31202-72A4-4C73-86BF-EE49F9DE8C56}
.custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = ( 01 00 00 00 ) .custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = ( 01 00 00 00 )
.imagebase 0x10000000 .imagebase 0x10000000
.file alignment 0x00000200 .file alignment 0x00000200
.stackreserve 0x00100000 .stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI .subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY .corflags 0x00000001 // ILONLY
// Image base: 0x02C80000 // Image base: 0x02EC0000
// =============== CLASS MEMBERS DECLARATION =================== // =============== CLASS MEMBERS DECLARATION ===================
@ -504,7 +504,7 @@
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
.field public static initonly class ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c' '<>9' .field public static initonly class ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c' '<>9'
.field public static class [mscorlib]System.EventHandler '<>9__23_0' .field public static class [mscorlib]System.EventHandler '<>9__23_0'
.field public static class [mscorlib]System.Func`2<class [mscorlib]System.Globalization.NumberFormatInfo,bool> '<>9__41_0' .field public static class [mscorlib]System.Func`2<class [mscorlib]System.Globalization.NumberFormatInfo,bool> '<>9__42_0'
.method private hidebysig specialname rtspecialname static .method private hidebysig specialname rtspecialname static
void .cctor() cil managed void .cctor() cil managed
{ {
@ -536,7 +536,7 @@
} // end of method '<>c'::'<NotAnObjectInitializerWithEvent>b__23_0' } // end of method '<>c'::'<NotAnObjectInitializerWithEvent>b__23_0'
.method assembly hidebysig instance bool .method assembly hidebysig instance bool
'<Bug270_NestedInitialisers>b__41_0'(class [mscorlib]System.Globalization.NumberFormatInfo format) cil managed '<Bug270_NestedInitialisers>b__42_0'(class [mscorlib]System.Globalization.NumberFormatInfo format) cil managed
{ {
// Code size 17 (0x11) // Code size 17 (0x11)
.maxstack 8 .maxstack 8
@ -546,7 +546,7 @@
IL_000b: call bool [mscorlib]System.String::op_Equality(string, IL_000b: call bool [mscorlib]System.String::op_Equality(string,
string) string)
IL_0010: ret IL_0010: ret
} // end of method '<>c'::'<Bug270_NestedInitialisers>b__41_0' } // end of method '<>c'::'<Bug270_NestedInitialisers>b__42_0'
} // end of class '<>c' } // end of class '<>c'
@ -981,6 +981,13 @@
IL_0005: ret IL_0005: ret
} // end of method InitializerTests::GetString } // end of method InitializerTests::GetString
.method private hidebysig static void NoOp(valuetype [mscorlib]System.Nullable`1<valuetype [mscorlib]System.Guid>[] 'array') cil managed
{
// Code size 1 (0x1)
.maxstack 8
IL_0000: ret
} // end of method InitializerTests::NoOp
.method public hidebysig static void SimpleDictInitializer() cil managed .method public hidebysig static void SimpleDictInitializer() cil managed
{ {
// Code size 41 (0x29) // Code size 41 (0x29)
@ -1275,17 +1282,17 @@
IL_0033: callvirt instance void [mscorlib]System.Globalization.CultureInfo::set_DateTimeFormat(class [mscorlib]System.Globalization.DateTimeFormatInfo) IL_0033: callvirt instance void [mscorlib]System.Globalization.CultureInfo::set_DateTimeFormat(class [mscorlib]System.Globalization.DateTimeFormatInfo)
IL_0038: dup IL_0038: dup
IL_0039: ldloc.0 IL_0039: ldloc.0
IL_003a: ldsfld class [mscorlib]System.Func`2<class [mscorlib]System.Globalization.NumberFormatInfo,bool> ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c'::'<>9__41_0' IL_003a: ldsfld class [mscorlib]System.Func`2<class [mscorlib]System.Globalization.NumberFormatInfo,bool> ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c'::'<>9__42_0'
IL_003f: dup IL_003f: dup
IL_0040: brtrue.s IL_0059 IL_0040: brtrue.s IL_0059
IL_0042: pop IL_0042: pop
IL_0043: ldsfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c' ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c'::'<>9' IL_0043: ldsfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c' ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c'::'<>9'
IL_0048: ldftn instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c'::'<Bug270_NestedInitialisers>b__41_0'(class [mscorlib]System.Globalization.NumberFormatInfo) IL_0048: ldftn instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c'::'<Bug270_NestedInitialisers>b__42_0'(class [mscorlib]System.Globalization.NumberFormatInfo)
IL_004e: newobj instance void class [mscorlib]System.Func`2<class [mscorlib]System.Globalization.NumberFormatInfo,bool>::.ctor(object, IL_004e: newobj instance void class [mscorlib]System.Func`2<class [mscorlib]System.Globalization.NumberFormatInfo,bool>::.ctor(object,
native int) native int)
IL_0053: dup IL_0053: dup
IL_0054: stsfld class [mscorlib]System.Func`2<class [mscorlib]System.Globalization.NumberFormatInfo,bool> ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c'::'<>9__41_0' IL_0054: stsfld class [mscorlib]System.Func`2<class [mscorlib]System.Globalization.NumberFormatInfo,bool> ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c'::'<>9__42_0'
IL_0059: call class [mscorlib]System.Collections.Generic.IEnumerable`1<!!0> [System.Core]System.Linq.Enumerable::Where<class [mscorlib]System.Globalization.NumberFormatInfo>(class [mscorlib]System.Collections.Generic.IEnumerable`1<!!0>, IL_0059: call class [mscorlib]System.Collections.Generic.IEnumerable`1<!!0> [System.Core]System.Linq.Enumerable::Where<class [mscorlib]System.Globalization.NumberFormatInfo>(class [mscorlib]System.Collections.Generic.IEnumerable`1<!!0>,
class [mscorlib]System.Func`2<!!0,bool>) class [mscorlib]System.Func`2<!!0,bool>)
IL_005e: call !!0 [System.Core]System.Linq.Enumerable::First<class [mscorlib]System.Globalization.NumberFormatInfo>(class [mscorlib]System.Collections.Generic.IEnumerable`1<!!0>) IL_005e: call !!0 [System.Core]System.Linq.Enumerable::First<class [mscorlib]System.Globalization.NumberFormatInfo>(class [mscorlib]System.Collections.Generic.IEnumerable`1<!!0>)
@ -1296,6 +1303,21 @@
IL_0072: ret IL_0072: ret
} // end of method InitializerTests::Bug270_NestedInitialisers } // end of method InitializerTests::Bug270_NestedInitialisers
.method public hidebysig static void Bug953_MissingNullableSpecifierForArrayInitializer() cil managed
{
// Code size 29 (0x1d)
.maxstack 8
IL_0000: ldc.i4.1
IL_0001: newarr valuetype [mscorlib]System.Nullable`1<valuetype [mscorlib]System.Guid>
IL_0006: dup
IL_0007: ldc.i4.0
IL_0008: ldsfld valuetype [mscorlib]System.Guid [mscorlib]System.Guid::Empty
IL_000d: newobj instance void valuetype [mscorlib]System.Nullable`1<valuetype [mscorlib]System.Guid>::.ctor(!0)
IL_0012: stelem valuetype [mscorlib]System.Nullable`1<valuetype [mscorlib]System.Guid>
IL_0017: call void ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests::NoOp(valuetype [mscorlib]System.Nullable`1<valuetype [mscorlib]System.Guid>[])
IL_001c: ret
} // end of method InitializerTests::Bug953_MissingNullableSpecifierForArrayInitializer
.method public hidebysig specialname rtspecialname .method public hidebysig specialname rtspecialname
instance void .ctor() cil managed instance void .ctor() cil managed
{ {

52
ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.roslyn.il

@ -1,6 +1,6 @@
// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.1055.0 // Microsoft (R) .NET Framework IL Disassembler. Version 4.6.1055.0
// Copyright (c) Microsoft Corporation. Alle Rechte vorbehalten. // Copyright (c) Microsoft Corporation. All rights reserved.
@ -30,14 +30,14 @@
.ver 0:0:0:0 .ver 0:0:0:0
} }
.module InitializerTests.dll .module InitializerTests.dll
// MVID: {764AEFFE-E491-413B-876B-B40EBE774D84} // MVID: {4E6BCF8B-3662-4EB0-88AA-8085A69A4D25}
.custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = ( 01 00 00 00 ) .custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = ( 01 00 00 00 )
.imagebase 0x10000000 .imagebase 0x10000000
.file alignment 0x00000200 .file alignment 0x00000200
.stackreserve 0x00100000 .stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI .subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY .corflags 0x00000001 // ILONLY
// Image base: 0x00FC0000 // Image base: 0x02C10000
// =============== CLASS MEMBERS DECLARATION =================== // =============== CLASS MEMBERS DECLARATION ===================
@ -531,7 +531,7 @@
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
.field public static initonly class ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c' '<>9' .field public static initonly class ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c' '<>9'
.field public static class [mscorlib]System.EventHandler '<>9__23_0' .field public static class [mscorlib]System.EventHandler '<>9__23_0'
.field public static class [mscorlib]System.Func`2<class [mscorlib]System.Globalization.NumberFormatInfo,bool> '<>9__41_0' .field public static class [mscorlib]System.Func`2<class [mscorlib]System.Globalization.NumberFormatInfo,bool> '<>9__42_0'
.method private hidebysig specialname rtspecialname static .method private hidebysig specialname rtspecialname static
void .cctor() cil managed void .cctor() cil managed
{ {
@ -557,15 +557,16 @@
'<NotAnObjectInitializerWithEvent>b__23_0'(object sender, '<NotAnObjectInitializerWithEvent>b__23_0'(object sender,
class [mscorlib]System.EventArgs e) cil managed class [mscorlib]System.EventArgs e) cil managed
{ {
// Code size 7 (0x7) // Code size 8 (0x8)
.maxstack 8 .maxstack 8
IL_0000: call void [mscorlib]System.Console::WriteLine() IL_0000: nop
IL_0005: nop IL_0001: call void [mscorlib]System.Console::WriteLine()
IL_0006: ret IL_0006: nop
IL_0007: ret
} // end of method '<>c'::'<NotAnObjectInitializerWithEvent>b__23_0' } // end of method '<>c'::'<NotAnObjectInitializerWithEvent>b__23_0'
.method assembly hidebysig instance bool .method assembly hidebysig instance bool
'<Bug270_NestedInitialisers>b__41_0'(class [mscorlib]System.Globalization.NumberFormatInfo format) cil managed '<Bug270_NestedInitialisers>b__42_0'(class [mscorlib]System.Globalization.NumberFormatInfo format) cil managed
{ {
// Code size 17 (0x11) // Code size 17 (0x11)
.maxstack 8 .maxstack 8
@ -575,7 +576,7 @@
IL_000b: call bool [mscorlib]System.String::op_Equality(string, IL_000b: call bool [mscorlib]System.String::op_Equality(string,
string) string)
IL_0010: ret IL_0010: ret
} // end of method '<>c'::'<Bug270_NestedInitialisers>b__41_0' } // end of method '<>c'::'<Bug270_NestedInitialisers>b__42_0'
} // end of class '<>c' } // end of class '<>c'
@ -1149,6 +1150,14 @@
IL_000a: ret IL_000a: ret
} // end of method InitializerTests::GetString } // end of method InitializerTests::GetString
.method private hidebysig static void NoOp(valuetype [mscorlib]System.Nullable`1<valuetype [mscorlib]System.Guid>[] 'array') cil managed
{
// Code size 2 (0x2)
.maxstack 8
IL_0000: nop
IL_0001: ret
} // end of method InitializerTests::NoOp
.method public hidebysig static void SimpleDictInitializer() cil managed .method public hidebysig static void SimpleDictInitializer() cil managed
{ {
// Code size 45 (0x2d) // Code size 45 (0x2d)
@ -1490,17 +1499,17 @@
IL_003b: nop IL_003b: nop
IL_003c: dup IL_003c: dup
IL_003d: ldloc.0 IL_003d: ldloc.0
IL_003e: ldsfld class [mscorlib]System.Func`2<class [mscorlib]System.Globalization.NumberFormatInfo,bool> ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c'::'<>9__41_0' IL_003e: ldsfld class [mscorlib]System.Func`2<class [mscorlib]System.Globalization.NumberFormatInfo,bool> ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c'::'<>9__42_0'
IL_0043: dup IL_0043: dup
IL_0044: brtrue.s IL_005d IL_0044: brtrue.s IL_005d
IL_0046: pop IL_0046: pop
IL_0047: ldsfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c' ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c'::'<>9' IL_0047: ldsfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c' ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c'::'<>9'
IL_004c: ldftn instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c'::'<Bug270_NestedInitialisers>b__41_0'(class [mscorlib]System.Globalization.NumberFormatInfo) IL_004c: ldftn instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c'::'<Bug270_NestedInitialisers>b__42_0'(class [mscorlib]System.Globalization.NumberFormatInfo)
IL_0052: newobj instance void class [mscorlib]System.Func`2<class [mscorlib]System.Globalization.NumberFormatInfo,bool>::.ctor(object, IL_0052: newobj instance void class [mscorlib]System.Func`2<class [mscorlib]System.Globalization.NumberFormatInfo,bool>::.ctor(object,
native int) native int)
IL_0057: dup IL_0057: dup
IL_0058: stsfld class [mscorlib]System.Func`2<class [mscorlib]System.Globalization.NumberFormatInfo,bool> ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c'::'<>9__41_0' IL_0058: stsfld class [mscorlib]System.Func`2<class [mscorlib]System.Globalization.NumberFormatInfo,bool> ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c'::'<>9__42_0'
IL_005d: call class [mscorlib]System.Collections.Generic.IEnumerable`1<!!0> [System.Core]System.Linq.Enumerable::Where<class [mscorlib]System.Globalization.NumberFormatInfo>(class [mscorlib]System.Collections.Generic.IEnumerable`1<!!0>, IL_005d: call class [mscorlib]System.Collections.Generic.IEnumerable`1<!!0> [System.Core]System.Linq.Enumerable::Where<class [mscorlib]System.Globalization.NumberFormatInfo>(class [mscorlib]System.Collections.Generic.IEnumerable`1<!!0>,
class [mscorlib]System.Func`2<!!0,bool>) class [mscorlib]System.Func`2<!!0,bool>)
IL_0062: call !!0 [System.Core]System.Linq.Enumerable::First<class [mscorlib]System.Globalization.NumberFormatInfo>(class [mscorlib]System.Collections.Generic.IEnumerable`1<!!0>) IL_0062: call !!0 [System.Core]System.Linq.Enumerable::First<class [mscorlib]System.Globalization.NumberFormatInfo>(class [mscorlib]System.Collections.Generic.IEnumerable`1<!!0>)
@ -1514,6 +1523,23 @@
IL_0079: ret IL_0079: ret
} // end of method InitializerTests::Bug270_NestedInitialisers } // end of method InitializerTests::Bug270_NestedInitialisers
.method public hidebysig static void Bug953_MissingNullableSpecifierForArrayInitializer() cil managed
{
// Code size 31 (0x1f)
.maxstack 8
IL_0000: nop
IL_0001: ldc.i4.1
IL_0002: newarr valuetype [mscorlib]System.Nullable`1<valuetype [mscorlib]System.Guid>
IL_0007: dup
IL_0008: ldc.i4.0
IL_0009: ldsfld valuetype [mscorlib]System.Guid [mscorlib]System.Guid::Empty
IL_000e: newobj instance void valuetype [mscorlib]System.Nullable`1<valuetype [mscorlib]System.Guid>::.ctor(!0)
IL_0013: stelem valuetype [mscorlib]System.Nullable`1<valuetype [mscorlib]System.Guid>
IL_0018: call void ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests::NoOp(valuetype [mscorlib]System.Nullable`1<valuetype [mscorlib]System.Guid>[])
IL_001d: nop
IL_001e: ret
} // end of method InitializerTests::Bug953_MissingNullableSpecifierForArrayInitializer
.method public hidebysig specialname rtspecialname .method public hidebysig specialname rtspecialname
instance void .ctor() cil managed instance void .ctor() cil managed
{ {

6
ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

@ -1852,9 +1852,9 @@ namespace ICSharpCode.Decompiler.CSharp
additionalSpecifiers = new[] { new ArraySpecifier() }; additionalSpecifiers = new[] { new ArraySpecifier() };
} else { } else {
typeExpression = ConvertType(type); typeExpression = ConvertType(type);
if (typeExpression is ComposedType) { if (typeExpression is ComposedType compType && compType.ArraySpecifiers.Count > 0) {
additionalSpecifiers = ((ComposedType)typeExpression).ArraySpecifiers.SelectArray(a => (ArraySpecifier)a.Clone()); additionalSpecifiers = compType.ArraySpecifiers.SelectArray(a => (ArraySpecifier)a.Clone());
typeExpression = ((ComposedType)typeExpression).BaseType.Clone(); compType.ArraySpecifiers.Clear();
} else { } else {
additionalSpecifiers = NoSpecifiers; additionalSpecifiers = NoSpecifiers;
} }

Loading…
Cancel
Save