Skip to content

Commit

Permalink
Merge pull request #2289 from wwh1004/fix4
Browse files Browse the repository at this point in the history
Fix wrong nullable lift
  • Loading branch information
siegfriedpammer authored Feb 15, 2021
2 parents 2364aeb + 3b2f00e commit 501d418
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -894,6 +894,12 @@ public void NullCoalescing()
Test<Func<string, string, string>>((string a, string b) => a ?? b, (string a, string b) => a ?? b);
Test<Func<int?, int>>((int? a) => a ?? 1, (int? a) => a ?? 1);
}

public void NullableLifting(Guid? a, Guid? b)
{
ToCode(null, () => a == b);
ToCode(null, () => (Guid)a == (Guid)b);
}
}

internal static class Extensions
Expand Down
23 changes: 12 additions & 11 deletions ICSharpCode.Decompiler/IL/Transforms/TransformExpressionTrees.cs
Original file line number Diff line number Diff line change
Expand Up @@ -515,15 +515,16 @@ ILInstruction Convert()
Arguments = { left(), right() }
}, method.ReturnType);
case 4:
if (!invocation.Arguments[2].MatchLdcI4(out var isLifted))
if (!invocation.Arguments[2].MatchLdcI4(out var isLiftedToNull))
return (null, SpecialType.UnknownType);
if (!MatchGetMethodFromHandle(invocation.Arguments[3], out method))
return (null, SpecialType.UnknownType);
if (isLifted != 0)
bool isLifted = NullableType.IsNullable(leftType);
if (isLifted)
method = CSharpOperators.LiftUserDefinedOperator((IMethod)method);
return (() => new Call((IMethod)method) {
Arguments = { left(), right() }
}, method.ReturnType);
}, isLiftedToNull != 0 ? NullableType.Create(method.Compilation, method.ReturnType) : method.ReturnType);
default:
return (null, SpecialType.UnknownType);
}
Expand Down Expand Up @@ -729,13 +730,12 @@ Func<ILInstruction>[] ConvertCallArguments(IList<ILInstruction> arguments, IMeth
var (right, rightType) = ConvertInstruction(invocation.Arguments[1]);
if (right == null)
return (null, SpecialType.UnknownType);
if (invocation.Arguments.Count == 4 && invocation.Arguments[2].MatchLdcI4(out var isLifted) && MatchGetMethodFromHandle(invocation.Arguments[3], out var method))
if (invocation.Arguments.Count == 4 && invocation.Arguments[2].MatchLdcI4(out var isLiftedToNull) && MatchGetMethodFromHandle(invocation.Arguments[3], out var method))
{
if (isLifted != 0)
{
bool isLifted = NullableType.IsNullable(leftType);
if (isLifted)
method = CSharpOperators.LiftUserDefinedOperator((IMethod)method);
}
return (() => new Call((IMethod)method) { Arguments = { left(), right() } }, method.ReturnType);
return (() => new Call((IMethod)method) { Arguments = { left(), right() } }, isLiftedToNull != 0 ? NullableType.Create(method.Compilation, method.ReturnType) : method.ReturnType);
}
var rr = resolver.ResolveBinaryOperator(kind.ToBinaryOperatorType(), new ResolveResult(leftType), new ResolveResult(rightType)) as OperatorResolveResult;
if (rr != null && !rr.IsError && rr.UserDefinedOperatorMethod != null)
Expand Down Expand Up @@ -979,15 +979,16 @@ Block BuildBlock()
Arguments = { left(), right() }
}, method.ReturnType);
case 4:
if (!invocation.Arguments[2].MatchLdcI4(out var isLifted))
if (!invocation.Arguments[2].MatchLdcI4(out var isLiftedToNull))
return (null, SpecialType.UnknownType);
if (!MatchGetMethodFromHandle(invocation.Arguments[3], out method))
return (null, SpecialType.UnknownType);
if (isLifted != 0)
bool isLifted = NullableType.IsNullable(leftType);
if (isLifted)
method = CSharpOperators.LiftUserDefinedOperator((IMethod)method);
return (() => new Call((IMethod)method) {
Arguments = { left(), right() }
}, method.ReturnType);
}, isLiftedToNull != 0 ? NullableType.Create(method.Compilation, method.ReturnType) : method.ReturnType);
default:
return (null, SpecialType.UnknownType);
}
Expand Down

0 comments on commit 501d418

Please sign in to comment.