diff --git a/src/Compilers/CSharp/Portable/Lowering/LocalRewriter/LocalRewriter_TupleBinaryOperator.cs b/src/Compilers/CSharp/Portable/Lowering/LocalRewriter/LocalRewriter_TupleBinaryOperator.cs index 493a2955991a5..811b72e111b20 100644 --- a/src/Compilers/CSharp/Portable/Lowering/LocalRewriter/LocalRewriter_TupleBinaryOperator.cs +++ b/src/Compilers/CSharp/Portable/Lowering/LocalRewriter/LocalRewriter_TupleBinaryOperator.cs @@ -24,19 +24,14 @@ internal sealed partial class LocalRewriter public override BoundNode VisitTupleBinaryOperator(BoundTupleBinaryOperator node) { var boolType = node.Type; // we can re-use the bool type - var leftInit = ArrayBuilder.GetInstance(); - var rightInit = ArrayBuilder.GetInstance(); + var initEffects = ArrayBuilder.GetInstance(); var temps = ArrayBuilder.GetInstance(); - BoundExpression newLeft = ReplaceTerminalElementsWithTemps(node.Left, node.Operators, leftInit, temps); - BoundExpression newRight = ReplaceTerminalElementsWithTemps(node.Right, node.Operators, rightInit, temps); + BoundExpression newLeft = ReplaceTerminalElementsWithTemps(node.Left, node.Operators, initEffects, temps); + BoundExpression newRight = ReplaceTerminalElementsWithTemps(node.Right, node.Operators, initEffects, temps); var returnValue = RewriteTupleNestedOperators(node.Operators, newLeft, newRight, boolType, temps, node.OperatorKind); - - leftInit.AddRange(rightInit); - rightInit.Free(); - - BoundExpression result = MakeSequenceOrResultValue(temps.ToImmutableAndFree(), leftInit.ToImmutableAndFree(), returnValue); + BoundExpression result = MakeSequenceOrResultValue(temps.ToImmutableAndFree(), initEffects.ToImmutableAndFree(), returnValue); return result; } @@ -250,7 +245,7 @@ private BoundExpression GetTuplePart(BoundExpression tuple, int i) { // Example: // (1, 2) == (1, 2); - if (IsTupleExpression(tuple.Kind)) + if (tuple.Kind == BoundKind.TupleLiteral) { return ((BoundTupleLiteral)tuple).Arguments[i]; } @@ -300,7 +295,7 @@ private BoundExpression RewriteTupleSingleOperator(TupleBinaryOperatorInfo.Singl // PROTOTYPE(tuple-equality) checked // We leave the null literal in nullable-null conversions unconverted because MakeBinaryOperator has special rules for it - bool isNullableNullConversion = ((operatorKind & BinaryOperatorKind.NullableNull) == 0); + bool isNullableNullConversion = operatorKind.OperandTypes() != BinaryOperatorKind.NullableNull; BoundExpression convertedLeft = (isNullableNullConversion && left.IsLiteralNull()) ? left : MakeConversionNode(left.Syntax, left, single.LeftConversion, single.LeftConvertedType, @checked: false);