Skip to content

Commit 1bba26c

Browse files
committed
Fix stack overflow exception in CSharpResolver
1 parent 74ed8c7 commit 1bba26c

File tree

5 files changed

+72
-1
lines changed

5 files changed

+72
-1
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@
9494
<None Include="TestCases\ILPretty\GuessAccessors.il" />
9595
<None Include="TestCases\ILPretty\Issue2260SwitchString.il" />
9696
<None Include="TestCases\ILPretty\Issue3442.il" />
97+
<None Include="TestCases\ILPretty\Issue3466.il" />
9798
<None Include="TestCases\ILPretty\MonoFixed.il" />
9899
<None Include="TestCases\Correctness\NonGenericConstrainedCallVirt.il" />
99100
<None Include="TestCases\ILPretty\UnknownTypes.cs" />
@@ -135,6 +136,7 @@
135136
<Compile Include="TestAssemblyResolver.cs" />
136137
<Compile Include="TestCases\ILPretty\Issue3421.cs" />
137138
<Compile Include="TestCases\ILPretty\Issue3442.cs" />
139+
<Compile Include="TestCases\ILPretty\Issue3466.cs" />
138140
<Compile Include="TestCases\ILPretty\MonoFixed.cs" />
139141
<Compile Include="TestCases\Pretty\Comparisons.cs" />
140142
<Compile Include="TestCases\Pretty\GloballyQualifiedTypeInStringInterpolation.cs" />

ICSharpCode.Decompiler.Tests/ILPrettyTestRunner.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,12 @@ public async Task Issue3442()
219219
await Run();
220220
}
221221

222+
[Test]
223+
public async Task Issue3466()
224+
{
225+
await Run();
226+
}
227+
222228
[Test]
223229
public async Task Issue2260SwitchString()
224230
{
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
namespace ICSharpCode.Decompiler.Tests.TestCases.ILPretty
2+
{
3+
public class Issue3466<T>
4+
{
5+
public static implicit operator Issue3466<T>(T t)
6+
{
7+
return null;
8+
}
9+
public static bool M(Issue3466<object> x)
10+
{
11+
return x != null;
12+
}
13+
}
14+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
.assembly extern System.Runtime
2+
{
3+
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
4+
.ver 4:0:0:0
5+
}
6+
7+
.assembly Issue3466
8+
{
9+
.hash algorithm 0x00008004 // SHA1
10+
.ver 0:0:0:0
11+
}
12+
13+
.class public auto ansi beforefieldinit ICSharpCode.Decompiler.Tests.TestCases.ILPretty.Issue3466`1<T>
14+
extends [System.Runtime]System.Object
15+
{
16+
.method public hidebysig specialname static
17+
class ICSharpCode.Decompiler.Tests.TestCases.ILPretty.Issue3466`1<!T> op_Implicit (
18+
!T t
19+
) cil managed
20+
{
21+
.maxstack 8
22+
23+
IL_0000: ldnull
24+
IL_0001: ret
25+
}
26+
27+
.method public final hidebysig static bool M(class ICSharpCode.Decompiler.Tests.TestCases.ILPretty.Issue3466`1<object> x) cil managed
28+
{
29+
.maxstack 8
30+
31+
IL_0000: ldarg.0
32+
IL_0001: brtrue.s IL_0004
33+
IL_0002: ldc.i4.0
34+
IL_0003: br.s IL_0005
35+
IL_0004: ldc.i4.1
36+
IL_0005: ret
37+
}
38+
39+
.method public hidebysig specialname rtspecialname
40+
instance void .ctor () cil managed
41+
{
42+
.maxstack 8
43+
44+
IL_0000: ldarg.0
45+
IL_0001: call instance void [System.Runtime]System.Object::.ctor()
46+
IL_0006: ret
47+
}
48+
49+
}

ICSharpCode.Decompiler/CSharp/Resolver/CSharpResolver.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -805,7 +805,7 @@ 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 && rhsType.Kind != TypeKind.Null
809809
&& (conversions.IdentityConversion(lhsType, rhsType)
810810
|| conversions.ExplicitConversion(lhsType, rhsType).IsReferenceConversion
811811
|| conversions.ExplicitConversion(rhsType, lhsType).IsReferenceConversion))

0 commit comments

Comments
 (0)