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