Skip to content

Commit 2c419f6

Browse files
Fix #3322: Add missing checks for equality comparison
1 parent 4a8c375 commit 2c419f6

File tree

4 files changed

+29
-1
lines changed

4 files changed

+29
-1
lines changed

ICSharpCode.Decompiler.Tests/ICSharpCode.Decompiler.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@
130130
<Compile Include="ProjectDecompiler\TargetFrameworkTests.cs" />
131131
<Compile Include="TestAssemblyResolver.cs" />
132132
<Compile Include="TestCases\ILPretty\MonoFixed.cs" />
133+
<Compile Include="TestCases\Pretty\Comparisons.cs" />
133134
<None Include="TestCases\VBPretty\VBAutomaticEvents.vb" />
134135
<Compile Include="TestCases\VBPretty\VBAutomaticEvents.cs" />
135136
<Compile Include="TestCases\VBPretty\VBNonGenericForEach.cs" />

ICSharpCode.Decompiler.Tests/PrettyTestRunner.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -586,6 +586,12 @@ public async Task OptionalArguments([ValueSource(nameof(defaultOptions))] Compil
586586
await RunForLibrary(cscOptions: cscOptions);
587587
}
588588

589+
[Test]
590+
public async Task Comparisons([ValueSource(nameof(defaultOptions))] CompilerOptions cscOptions)
591+
{
592+
await RunForLibrary(cscOptions: cscOptions);
593+
}
594+
589595
[Test]
590596
public async Task ConstantsTests([ValueSource(nameof(defaultOptions))] CompilerOptions cscOptions)
591597
{
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty
2+
{
3+
public class Comparisons
4+
{
5+
private class A
6+
{
7+
}
8+
9+
private class B
10+
{
11+
}
12+
13+
private bool CompareUnrelatedNeedsCast(A a, B b)
14+
{
15+
return (object)a == b;
16+
}
17+
}
18+
}

ICSharpCode.Decompiler/CSharp/Resolver/CSharpResolver.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -805,7 +805,10 @@ public ResolveResult ResolveBinaryOperator(BinaryOperatorType op, ResolveResult
805805
}
806806
if (op == BinaryOperatorType.Equality || op == BinaryOperatorType.InEquality)
807807
{
808-
if (lhsType.IsReferenceType == true && rhsType.IsReferenceType == true)
808+
if (lhsType.IsReferenceType == true && rhsType.IsReferenceType == true
809+
&& (conversions.IdentityConversion(lhsType, rhsType)
810+
|| conversions.ExplicitConversion(lhsType, rhsType).IsReferenceConversion
811+
|| conversions.ExplicitConversion(rhsType, lhsType).IsReferenceConversion))
809812
{
810813
// If it's a reference comparison
811814
if (op == BinaryOperatorType.Equality)

0 commit comments

Comments
 (0)