Browse Source

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

pull/2465/head
Siegfried Pammer 4 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 @@ -36,6 +36,7 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Correctness
Issue1747();
CallAmbiguousOutParam();
CallWithInParam();
Issue2444.M2();
}
#region ConstructorTest
@ -334,6 +335,38 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Correctness @@ -334,6 +335,38 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Correctness
}
#endif
#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

2
ICSharpCode.Decompiler/CSharp/CallBuilder.cs

@ -1148,7 +1148,7 @@ namespace ICSharpCode.Decompiler.CSharp @@ -1148,7 +1148,7 @@ namespace ICSharpCode.Decompiler.CSharp
var conversions = CSharpConversions.Get(expressionBuilder.compilation);
IType targetType = method.ReturnType;
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
argument = argument.ConvertTo(method.Parameters[0].Type, expressionBuilder);

Loading…
Cancel
Save