From 076a43671ea5ae54b62a73df6e429b89368ecd5a Mon Sep 17 00:00:00 2001 From: Sebastien Lebreton Date: Sat, 8 Aug 2026 11:07:23 +0200 Subject: [PATCH] Keep ref-returning switches as statements C# has no ref-returning switch expression. Skip the transform for StackType.Ref and cover the statement form in RefLocalsAndReturns. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 0dd407b6-9410-48df-add5-761ca4a8dec0 --- .../TestCases/Pretty/RefLocalsAndReturns.cs | 13 +++++++++++++ .../IL/Transforms/ExpressionTransforms.cs | 2 ++ 2 files changed, 15 insertions(+) diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/RefLocalsAndReturns.cs b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/RefLocalsAndReturns.cs index 9c14435cb..8428b684c 100644 --- a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/RefLocalsAndReturns.cs +++ b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/RefLocalsAndReturns.cs @@ -282,6 +282,19 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty return ref DefaultInt; } + public static ref int SwitchRefReturn(int index) + { + switch (index) + { + case 0: + return ref numbers[0]; + case 1: + return ref numbers[1]; + default: + throw new InvalidOperationException(); + } + } + public static ref int LastOrDefault() { if (numbers.Length != 0) diff --git a/ICSharpCode.Decompiler/IL/Transforms/ExpressionTransforms.cs b/ICSharpCode.Decompiler/IL/Transforms/ExpressionTransforms.cs index 0f8d09e69..edb2146e1 100644 --- a/ICSharpCode.Decompiler/IL/Transforms/ExpressionTransforms.cs +++ b/ICSharpCode.Decompiler/IL/Transforms/ExpressionTransforms.cs @@ -676,6 +676,8 @@ namespace ICSharpCode.Decompiler.IL.Transforms // Exactly one of resultVariable/leaveTarget must be null if ((resultVariable == null) == (leaveTarget == null)) return; + if (resultType == StackType.Ref) + return; if (switchInst.Value is StringToInt str2int) { // validate that each integer is used for exactly one value