diff --git a/ICSharpCode.Decompiler.Tests/ICSharpCode.Decompiler.Tests.csproj b/ICSharpCode.Decompiler.Tests/ICSharpCode.Decompiler.Tests.csproj index 5a89e7178..f7c49347a 100644 --- a/ICSharpCode.Decompiler.Tests/ICSharpCode.Decompiler.Tests.csproj +++ b/ICSharpCode.Decompiler.Tests/ICSharpCode.Decompiler.Tests.csproj @@ -94,6 +94,7 @@ + @@ -135,6 +136,7 @@ + diff --git a/ICSharpCode.Decompiler.Tests/ILPrettyTestRunner.cs b/ICSharpCode.Decompiler.Tests/ILPrettyTestRunner.cs index aebbf8c09..abdc031fa 100644 --- a/ICSharpCode.Decompiler.Tests/ILPrettyTestRunner.cs +++ b/ICSharpCode.Decompiler.Tests/ILPrettyTestRunner.cs @@ -219,6 +219,12 @@ namespace ICSharpCode.Decompiler.Tests await Run(); } + [Test] + public async Task Issue3466() + { + await Run(); + } + [Test] public async Task Issue2260SwitchString() { diff --git a/ICSharpCode.Decompiler.Tests/TestCases/ILPretty/Issue3466.cs b/ICSharpCode.Decompiler.Tests/TestCases/ILPretty/Issue3466.cs new file mode 100644 index 000000000..875cae068 --- /dev/null +++ b/ICSharpCode.Decompiler.Tests/TestCases/ILPretty/Issue3466.cs @@ -0,0 +1,14 @@ +namespace ICSharpCode.Decompiler.Tests.TestCases.ILPretty +{ + public class Issue3466 + { + public static implicit operator Issue3466(T t) + { + return null; + } + public static bool M(Issue3466 x) + { + return x != null; + } + } +} diff --git a/ICSharpCode.Decompiler.Tests/TestCases/ILPretty/Issue3466.il b/ICSharpCode.Decompiler.Tests/TestCases/ILPretty/Issue3466.il new file mode 100644 index 000000000..a6df20cc4 --- /dev/null +++ b/ICSharpCode.Decompiler.Tests/TestCases/ILPretty/Issue3466.il @@ -0,0 +1,49 @@ +.assembly extern System.Runtime +{ + .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. + .ver 4:0:0:0 +} + +.assembly Issue3466 +{ + .hash algorithm 0x00008004 // SHA1 + .ver 0:0:0:0 +} + +.class public auto ansi beforefieldinit ICSharpCode.Decompiler.Tests.TestCases.ILPretty.Issue3466`1 + extends [System.Runtime]System.Object +{ + .method public hidebysig specialname static + class ICSharpCode.Decompiler.Tests.TestCases.ILPretty.Issue3466`1 op_Implicit ( + !T t + ) cil managed + { + .maxstack 8 + + IL_0000: ldnull + IL_0001: ret + } + + .method public final hidebysig static bool M(class ICSharpCode.Decompiler.Tests.TestCases.ILPretty.Issue3466`1 x) cil managed + { + .maxstack 8 + + IL_0000: ldarg.0 + IL_0001: brtrue.s IL_0004 + IL_0002: ldc.i4.0 + IL_0003: br.s IL_0005 + IL_0004: ldc.i4.1 + IL_0005: ret + } + + .method public hidebysig specialname rtspecialname + instance void .ctor () cil managed + { + .maxstack 8 + + IL_0000: ldarg.0 + IL_0001: call instance void [System.Runtime]System.Object::.ctor() + IL_0006: ret + } + +} \ No newline at end of file diff --git a/ICSharpCode.Decompiler/CSharp/Resolver/CSharpResolver.cs b/ICSharpCode.Decompiler/CSharp/Resolver/CSharpResolver.cs index 9e556e6cd..d60724bcd 100644 --- a/ICSharpCode.Decompiler/CSharp/Resolver/CSharpResolver.cs +++ b/ICSharpCode.Decompiler/CSharp/Resolver/CSharpResolver.cs @@ -805,7 +805,7 @@ namespace ICSharpCode.Decompiler.CSharp.Resolver } if (op == BinaryOperatorType.Equality || op == BinaryOperatorType.InEquality) { - if (lhsType.IsReferenceType == true && rhsType.IsReferenceType == true + if (lhsType.IsReferenceType == true && rhsType.IsReferenceType == true && rhsType.Kind != TypeKind.Null && (conversions.IdentityConversion(lhsType, rhsType) || conversions.ExplicitConversion(lhsType, rhsType).IsReferenceConversion || conversions.ExplicitConversion(rhsType, lhsType).IsReferenceConversion))