Browse Source

Fix invalid code generated for impossible casts.

pull/1686/head
Daniel Grunwald 6 years ago
parent
commit
ab993fc6c6
  1. 10
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/TypeAnalysisTests.cs
  2. 7
      ICSharpCode.Decompiler/CSharp/TranslatedExpression.cs

10
ICSharpCode.Decompiler.Tests/TestCases/Pretty/TypeAnalysisTests.cs

@ -276,5 +276,15 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty @@ -276,5 +276,15 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty
{
return AttributeTargets.All.HasFlag(AttributeTargets.Assembly);
}
public static string ImpossibleCast1(int i)
{
return (string)(object)i;
}
public static string ImpossibleCast2(Action a)
{
return (string)(object)a;
}
}
}

7
ICSharpCode.Decompiler/CSharp/TranslatedExpression.cs

@ -416,6 +416,13 @@ namespace ICSharpCode.Decompiler.CSharp @@ -416,6 +416,13 @@ namespace ICSharpCode.Decompiler.CSharp
if (rr.IsCompileTimeConstant && !rr.IsError) {
return expressionBuilder.ConvertConstantValue(rr, allowImplicitConversion)
.WithILInstruction(this.ILInstructions);
} else if (rr.IsError && targetType.IsReferenceType == true && type.IsReferenceType == true) {
// Conversion between two reference types, but no direct cast allowed? cast via object
// Just make sure we avoid infinite recursion even if the resolver falsely claims we can't cast directly:
if (!(targetType.IsKnownType(KnownTypeCode.Object) || type.IsKnownType(KnownTypeCode.Object))) {
return this.ConvertTo(compilation.FindType(KnownTypeCode.Object), expressionBuilder)
.ConvertTo(targetType, expressionBuilder, checkForOverflow, allowImplicitConversion);
}
}
if (targetType.Kind == TypeKind.Pointer && (0.Equals(ResolveResult.ConstantValue) || 0u.Equals(ResolveResult.ConstantValue))) {
if (allowImplicitConversion) {

Loading…
Cancel
Save