From c0a9afc4ad6525e1ab672c691c53a037d54bec73 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Fri, 12 Dec 2025 14:00:19 +0100 Subject: [PATCH] Fix #3616: local variable naming conflict with primary constructor parameters. --- .../Pretty/ConstructorInitializers.cs | 26 +++++++++++++++++++ .../IL/Transforms/AssignVariableNames.cs | 10 +++++++ 2 files changed, 36 insertions(+) diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/ConstructorInitializers.cs b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/ConstructorInitializers.cs index c4d46b49f..2b93b1838 100644 --- a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/ConstructorInitializers.cs +++ b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/ConstructorInitializers.cs @@ -264,6 +264,32 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty { } #endif +#if OPT && EXPECTED_OUTPUT + public class C8(object obj) + { + public int Test() + { + object obj2 = obj; + if (obj2 is int) + { + return (int)obj2; + } + return 0; + } + } +#else + public class C8(object obj) + { + public int Test() + { + if (obj is int result) + { + return result; + } + return 0; + } + } +#endif #endif } } diff --git a/ICSharpCode.Decompiler/IL/Transforms/AssignVariableNames.cs b/ICSharpCode.Decompiler/IL/Transforms/AssignVariableNames.cs index 326ffa96e..9a3cce0c8 100644 --- a/ICSharpCode.Decompiler/IL/Transforms/AssignVariableNames.cs +++ b/ICSharpCode.Decompiler/IL/Transforms/AssignVariableNames.cs @@ -28,6 +28,7 @@ using Humanizer.Inflections; using ICSharpCode.Decompiler.CSharp; using ICSharpCode.Decompiler.CSharp.OutputVisitor; +using ICSharpCode.Decompiler.CSharp.Transforms; using ICSharpCode.Decompiler.CSharp.TypeSystem; using ICSharpCode.Decompiler.TypeSystem; using ICSharpCode.Decompiler.TypeSystem.Implementation; @@ -106,6 +107,15 @@ namespace ICSharpCode.Decompiler.IL.Transforms var currentLowerCaseTypeOrMemberNames = new HashSet(StringComparer.Ordinal); foreach (var name in CollectAllLowerCaseMemberNames(function.Method.DeclaringTypeDefinition)) currentLowerCaseTypeOrMemberNames.Add(name); + foreach (IField item in function.Method.DeclaringTypeDefinition.Fields) + { + if (TransformFieldAndConstructorInitializers.IsGeneratedPrimaryConstructorBackingField(item)) + { + string name = item.Name.Substring(1, item.Name.Length - 3); + currentLowerCaseTypeOrMemberNames.Add(name); + AddExistingName(reservedVariableNames, name); + } + } foreach (var name in CollectAllLowerCaseTypeNames(function.Method.DeclaringTypeDefinition)) { currentLowerCaseTypeOrMemberNames.Add(name);