From 08dcead162917d086f9d865852b9e1c7c383c108 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Wed, 18 Oct 2017 09:23:22 +0200 Subject: [PATCH] Fix false positive in struct initializers with default.value init --- .../TestCases/Pretty/InitializerTests.cs | 14 ++++++++------ .../TransformCollectionAndObjectInitializers.cs | 7 +++++++ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.cs b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.cs index 63439bcb7..9a3b12ff4 100644 --- a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.cs +++ b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.cs @@ -338,7 +338,7 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty InitializerTests.X(InitializerTests.Y(), new Data { MoreData = { a = MyEnum.a, - [2] = (Data)null + [2] = null } }); } @@ -348,11 +348,13 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty InitializerTests.X(InitializerTests.Y(), new Data { MoreData = { a = MyEnum.a, - [GetInt()] = { + [InitializerTests.GetInt()] = { a = MyEnum.b, - FieldList = { MyEnum2.c }, - [GetInt(), GetString()] = new Data(), - [2] = (Data)null + FieldList = { + MyEnum2.c + }, + [InitializerTests.GetInt(), InitializerTests.GetString()] = new Data(), + [2] = null } } }); @@ -397,7 +399,7 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty public static void NotAStructInitializer_DefaultConstructor() { - StructData structData = new StructData(); + StructData structData = default(StructData); structData.Field = 1; structData.Property = 2; InitializerTests.X(InitializerTests.Y(), structData); diff --git a/ICSharpCode.Decompiler/IL/Transforms/TransformCollectionAndObjectInitializers.cs b/ICSharpCode.Decompiler/IL/Transforms/TransformCollectionAndObjectInitializers.cs index d927bb61f..7813a84fd 100644 --- a/ICSharpCode.Decompiler/IL/Transforms/TransformCollectionAndObjectInitializers.cs +++ b/ICSharpCode.Decompiler/IL/Transforms/TransformCollectionAndObjectInitializers.cs @@ -66,6 +66,13 @@ namespace ICSharpCode.Decompiler.IL.Transforms instType = newObjInst.Method.DeclaringType; break; case DefaultValue defaultVal: + if (defaultVal.ILStackWasEmpty && v.Kind == VariableKind.Local && !context.Function.Method.IsConstructor) { + // on statement level (no other expressions on IL stack), + // prefer to keep local variables (but not stack slots), + // unless we are in a constructor (where inlining object initializers might be critical + // for the base ctor call) + return false; + } instType = defaultVal.Type; break; case Block existingInitializer: