Skip to content

Commit d4de698

Browse files
committed
#3466: avoid recursion in CSharpConversions.SelectOperator
1 parent c1ecf1a commit d4de698

File tree

1 file changed

+28
-5
lines changed

1 file changed

+28
-5
lines changed

ICSharpCode.Decompiler/CSharp/Resolver/CSharpConversions.cs

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,14 @@ public Conversion ExplicitConversion(IType fromType, IType toType)
307307
return UserDefinedExplicitConversion(null, fromType, toType);
308308
}
309309

310+
Conversion ExplicitConversionNotUserDefined(IType fromType, IType toType)
311+
{
312+
Conversion c = ImplicitConversion(fromType, toType, allowUserDefined: false, allowTuple: false);
313+
if (c != Conversion.None)
314+
return c;
315+
return ExplicitConversionImpl(fromType, toType);
316+
}
317+
310318
Conversion ExplicitConversionImpl(IType fromType, IType toType)
311319
{
312320
// This method is called after we already checked for implicit conversions,
@@ -971,16 +979,31 @@ Conversion SelectOperator(IType mostSpecificSource, IType mostSpecificTarget, IL
971979
return Conversion.None;
972980

973981
if (selected.Count == 1)
974-
return Conversion.UserDefinedConversion(selected[0].Method, isLifted: selected[0].IsLifted, isImplicit: isImplicit, conversionBeforeUserDefinedOperator: ExplicitConversion(source, mostSpecificSource), conversionAfterUserDefinedOperator: ExplicitConversion(mostSpecificTarget, target));
982+
{
983+
return Conversion.UserDefinedConversion(selected[0].Method,
984+
isLifted: selected[0].IsLifted,
985+
isImplicit: isImplicit,
986+
conversionBeforeUserDefinedOperator: ExplicitConversionNotUserDefined(source, mostSpecificSource),
987+
conversionAfterUserDefinedOperator: ExplicitConversionNotUserDefined(mostSpecificTarget, target));
988+
}
975989

976990
int nNonLifted = selected.Count(s => !s.IsLifted);
977991
if (nNonLifted == 1)
978992
{
979993
var op = selected.First(s => !s.IsLifted);
980-
return Conversion.UserDefinedConversion(op.Method, isLifted: op.IsLifted, isImplicit: isImplicit, conversionBeforeUserDefinedOperator: ExplicitConversion(source, mostSpecificSource), conversionAfterUserDefinedOperator: ExplicitConversion(mostSpecificTarget, target));
981-
}
982-
983-
return Conversion.UserDefinedConversion(selected[0].Method, isLifted: selected[0].IsLifted, isImplicit: isImplicit, isAmbiguous: true, conversionBeforeUserDefinedOperator: ExplicitConversion(source, mostSpecificSource), conversionAfterUserDefinedOperator: ExplicitConversion(mostSpecificTarget, target));
994+
return Conversion.UserDefinedConversion(op.Method,
995+
isLifted: op.IsLifted,
996+
isImplicit: isImplicit,
997+
conversionBeforeUserDefinedOperator: ExplicitConversionNotUserDefined(source, mostSpecificSource),
998+
conversionAfterUserDefinedOperator: ExplicitConversionNotUserDefined(mostSpecificTarget, target));
999+
}
1000+
1001+
return Conversion.UserDefinedConversion(selected[0].Method,
1002+
isLifted: selected[0].IsLifted,
1003+
isImplicit: isImplicit,
1004+
isAmbiguous: true,
1005+
conversionBeforeUserDefinedOperator: ExplicitConversionNotUserDefined(source, mostSpecificSource),
1006+
conversionAfterUserDefinedOperator: ExplicitConversionNotUserDefined(mostSpecificTarget, target));
9841007
}
9851008

9861009
Conversion UserDefinedImplicitConversion(ResolveResult fromResult, IType fromType, IType toType)

0 commit comments

Comments
 (0)