From 280a94ce5dc13caebdc6512f52414d98bfd6ba10 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Fri, 26 Feb 2021 17:09:13 +0100 Subject: [PATCH] Fix #1828, Fix #2290: Ensure base references have the correct type and are turned into this references and casted if necessary --- ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs | 4 +++- ICSharpCode.Decompiler/CSharp/TranslatedExpression.cs | 8 ++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs index ae4f23486..29fab54b6 100644 --- a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs +++ b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs @@ -2487,9 +2487,11 @@ namespace ICSharpCode.Decompiler.CSharp { if (ShouldUseBaseReference()) { + var baseReferenceType = resolver.CurrentTypeDefinition.DirectBaseTypes + .FirstOrDefault(t => t.Kind != TypeKind.Interface); return new BaseReferenceExpression() .WithILInstruction(target) - .WithRR(new ThisResolveResult(memberDeclaringType, nonVirtualInvocation)); + .WithRR(new ThisResolveResult(baseReferenceType ?? memberDeclaringType, nonVirtualInvocation)); } else { diff --git a/ICSharpCode.Decompiler/CSharp/TranslatedExpression.cs b/ICSharpCode.Decompiler/CSharp/TranslatedExpression.cs index f64dc39a4..71605ce06 100644 --- a/ICSharpCode.Decompiler/CSharp/TranslatedExpression.cs +++ b/ICSharpCode.Decompiler/CSharp/TranslatedExpression.cs @@ -452,6 +452,7 @@ namespace ICSharpCode.Decompiler.CSharp // perform remaining pointer cast, if necessary return pointerExpr.ConvertTo(targetType, expressionBuilder); } + Expression expr; if (targetType.Kind == TypeKind.ByReference) { if (NormalizeTypeVisitor.TypeErasure.EquivalentTypes(targetType, this.Type)) @@ -481,7 +482,6 @@ namespace ICSharpCode.Decompiler.CSharp // Convert from integer/pointer to reference. // First, convert to the corresponding pointer type: var arg = this.ConvertTo(new PointerType(elementType), expressionBuilder, checkForOverflow); - Expression expr; ResolveResult elementRR; if (arg.Expression is UnaryOperatorExpression unary && unary.Operator == UnaryOperatorType.AddressOf) { @@ -561,7 +561,11 @@ namespace ICSharpCode.Decompiler.CSharp return this; } } - var castExpr = new CastExpression(expressionBuilder.ConvertType(targetType), Expression); + // BaseReferenceExpression must not be used with CastExpressions + expr = Expression is BaseReferenceExpression + ? new ThisReferenceExpression().WithILInstruction(this.ILInstructions) + : Expression; + var castExpr = new CastExpression(expressionBuilder.ConvertType(targetType), expr); bool needsCheckAnnotation = targetUType.GetStackType().IsIntegerType(); if (needsCheckAnnotation) {