From 3409ffca25ddb53cc4377128ae1ba8d7e91a550c Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Wed, 22 Jul 2020 20:48:31 +0200 Subject: [PATCH] Fix #2073: Ensure the startOffsetVar actually appears in the expected instruction, not somewhere else. --- ICSharpCode.Decompiler/IL/Transforms/IndexRangeTransform.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ICSharpCode.Decompiler/IL/Transforms/IndexRangeTransform.cs b/ICSharpCode.Decompiler/IL/Transforms/IndexRangeTransform.cs index 22e62edf0..651113ce6 100644 --- a/ICSharpCode.Decompiler/IL/Transforms/IndexRangeTransform.cs +++ b/ICSharpCode.Decompiler/IL/Transforms/IndexRangeTransform.cs @@ -205,6 +205,8 @@ namespace ICSharpCode.Decompiler.IL.Transforms if (!CheckContainerLengthVariableUseCount(containerLengthVar, startIndexKind)) { return; } + if (!call.IsDescendantOf(block.Instructions[pos])) + return; // startOffsetVar might be used deep inside a complex statement, ensure we can inline up to that point: for (int i = startPos; i < pos; i++) { if (!ILInlining.CanInlineInto(block.Instructions[pos], startOffsetVar, block.Instructions[i])) @@ -275,6 +277,8 @@ namespace ICSharpCode.Decompiler.IL.Transforms } if (!(sliceLengthVar.LoadInstructions.Single().Parent is CallInstruction call)) return; + if (!call.IsDescendantOf(block.Instructions[pos])) + return; if (!IsSlicingMethod(call.Method)) return; if (call.Arguments.Count != 3)