Browse Source

Fix #2444: Ambiguous implicit conversions from null literals in decompiled code

pull/2465/head
Siegfried Pammer 5 years ago
parent
commit
84101f804a
  1. 33
      ICSharpCode.Decompiler.Tests/TestCases/Correctness/OverloadResolution.cs
  2. 2
      ICSharpCode.Decompiler/CSharp/CallBuilder.cs

33
ICSharpCode.Decompiler.Tests/TestCases/Correctness/OverloadResolution.cs

@ -36,6 +36,7 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Correctness
Issue1747(); Issue1747();
CallAmbiguousOutParam(); CallAmbiguousOutParam();
CallWithInParam(); CallWithInParam();
Issue2444.M2();
} }
#region ConstructorTest #region ConstructorTest
@ -334,6 +335,38 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Correctness
} }
#endif #endif
#endregion #endregion
#region #2444
public struct Issue2444
{
public class X { }
public class Y { }
public static implicit operator Issue2444(X x)
{
Console.WriteLine("#2444: op_Implicit(X)");
return new Issue2444();
}
public static implicit operator Issue2444(Y y)
{
Console.WriteLine("#2444: op_Implicit(Y)");
return new Issue2444();
}
public static void M1(Issue2444 z)
{
Console.WriteLine(string.Format("#2444: M1({0})", z));
}
public static void M2()
{
Console.WriteLine("#2444: before M1");
M1((X)null);
Console.WriteLine("#2444: after M1");
}
}
#endregion
} }
class IndexerTests class IndexerTests

2
ICSharpCode.Decompiler/CSharp/CallBuilder.cs

@ -1148,7 +1148,7 @@ namespace ICSharpCode.Decompiler.CSharp
var conversions = CSharpConversions.Get(expressionBuilder.compilation); var conversions = CSharpConversions.Get(expressionBuilder.compilation);
IType targetType = method.ReturnType; IType targetType = method.ReturnType;
var conv = conversions.ImplicitConversion(argument.Type, targetType); var conv = conversions.ImplicitConversion(argument.Type, targetType);
if (!(conv.IsUserDefined && conv.Method.Equals(method))) if (!(conv.IsUserDefined && conv.IsValid && conv.Method.Equals(method)))
{ {
// implicit conversion to targetType isn't directly possible, so first insert a cast to the argument type // implicit conversion to targetType isn't directly possible, so first insert a cast to the argument type
argument = argument.ConvertTo(method.Parameters[0].Type, expressionBuilder); argument = argument.ConvertTo(method.Parameters[0].Type, expressionBuilder);

Loading…
Cancel
Save