Right = Unwrap.CreateUnwrapped (Right);
UnwrapRight = Right as Unwrap;
}
+
+ if (Left.Type.BuiltinType == BuiltinTypeSpec.Type.Decimal) {
+ var decimal_operators = MemberCache.GetUserOperator (Left.Type, Binary.ConvertBinaryToUserOperator (Binary.Oper), false);
+
+ Arguments args = new Arguments (2);
+ args.Add (new Argument (Left));
+ args.Add (new Argument (Right));
+
+ const OverloadResolver.Restrictions restr = OverloadResolver.Restrictions.ProbingOnly |
+ OverloadResolver.Restrictions.NoBaseMembers | OverloadResolver.Restrictions.BaseMembersIncluded;
+
+ var res = new OverloadResolver (decimal_operators, restr, loc);
+ UserOperator = res.ResolveOperator (rc, ref args);
+ }
}
type = Binary.Type;
//
// Both operands are bool? types
//
- if (UnwrapLeft != null && UnwrapRight != null) {
+ if ((UnwrapLeft != null && !Left.IsNull) && (UnwrapRight != null && !Right.IsNull)) {
if (ec.HasSet (BuilderContext.Options.AsyncBody) && Binary.Right.ContainsEmitWithAwait ()) {
Left = Left.EmitToField (ec);
Right = Right.EmitToField (ec);
LiftedNull.Create (type, loc).Emit (ec);
} else {
Left.Emit (ec);
+ UnwrapRight.Store (ec);
+
ec.Emit (or ? OpCodes.Brfalse_S : OpCodes.Brtrue_S, load_right);
ec.EmitInt (or ? 1 : 0);
ec.Emit (OpCodes.Br_S, end_label);
ec.MarkLabel (load_right);
- UnwrapRight.Original.Emit (ec);
+ UnwrapRight.Load (ec);
}
} else {
//
ec.MarkLabel (is_null_label);
LiftedNull.Create (type, loc).Emit (ec);
+ } else if (Left.IsNull && UnwrapRight != null) {
+ UnwrapRight.Emit (ec);
+
+ ec.Emit (or ? OpCodes.Brtrue_S : OpCodes.Brfalse_S, load_right);
+
+ LiftedNull.Create (type, loc).Emit (ec);
+
+ ec.Emit (OpCodes.Br_S, end_label);
+
+ ec.MarkLabel (load_right);
+
+ UnwrapRight.Load (ec);
} else {
Right.Emit (ec);
- ec.Emit (or ? OpCodes.Brfalse_S : OpCodes.Brtrue_S, load_right);
+ ec.Emit (or ? OpCodes.Brfalse_S : OpCodes.Brtrue_S, load_left);
ec.EmitInt (or ? 1 : 0);
ec.Emit (OpCodes.Newobj, NullableInfo.GetConstructor (type));
ec.Emit (OpCodes.Br_S, end_label);
- ec.MarkLabel (load_right);
+ ec.MarkLabel (load_left);
UnwrapLeft.Load (ec);
}
//
// Special case null ?? null
//
- if (right.IsNull && ltype == right.Type)
+ if (right is NullLiteral && ltype == right.Type)
return null;
return ReducedExpression.Create (lc != null ? right : left, this, false);