public override BoundNode VisitPointerElementAccess(BoundPointerElementAccess node) { BoundExpression rewrittenExpression = VisitExpression(node.Expression); BoundExpression rewrittenIndex = VisitExpression(node.Index); return RewritePointerElementAccess(node, rewrittenExpression, rewrittenIndex); }
public override BoundNode VisitPointerElementAccess(BoundPointerElementAccess node) { BoundExpression rewrittenExpression = VisitExpression(node.Expression); BoundExpression rewrittenIndex = VisitExpression(node.Index); // Optimization: p[0] == *p if (rewrittenIndex.IsDefaultValue()) { return new BoundPointerIndirectionOperator( node.Syntax, rewrittenExpression, node.Type); } BinaryOperatorKind additionKind = BinaryOperatorKind.Addition; switch (rewrittenIndex.Type.SpecialType) { case SpecialType.System_Int32: additionKind |= BinaryOperatorKind.PointerAndIntAddition; break; case SpecialType.System_UInt32: additionKind |= BinaryOperatorKind.PointerAndUIntAddition; break; case SpecialType.System_Int64: additionKind |= BinaryOperatorKind.PointerAndLongAddition; break; case SpecialType.System_UInt64: additionKind |= BinaryOperatorKind.PointerAndULongAddition; break; default: throw ExceptionUtilities.UnexpectedValue(rewrittenIndex.Type.SpecialType); } if (node.Checked) { additionKind |= BinaryOperatorKind.Checked; } return new BoundPointerIndirectionOperator( node.Syntax, MakeBinaryOperator( node.Syntax, additionKind, rewrittenExpression, rewrittenIndex, rewrittenExpression.Type, method: null, isPointerElementAccess: true), //see RewriterPointerNumericOperator node.Type); }
private static BoundExpression VisitPointerElementAccess(BoundPointerElementAccess node) { // error should have been reported earlier // Diagnostics.Add(ErrorCode.ERR_ExpressionTreeContainsPointerOp, node.Syntax.Location); return new BoundBadExpression(node.Syntax, default(LookupResultKind), ImmutableArray<Symbol>.Empty, ImmutableArray.Create<BoundNode>(node), node.Type); }
public override BoundNode VisitPointerElementAccess(BoundPointerElementAccess node) { BoundSpillSequence2 ss = null; var index = VisitExpression(ref ss, node.Index); BoundExpression expression; if (ss == null) { expression = VisitExpression(ref ss, node.Expression); } else { // if the right-hand-side has await, spill the left var ss2 = new BoundSpillSequence2(); expression = VisitExpression(ref ss2, node.Expression); expression = Spill(ss2, expression); ss2.IncludeSequence(ss); ss = ss2; } return UpdateExpression(ss, node.Update(expression, index, node.Checked, node.Type)); }
public override BoundNode VisitPointerElementAccess(BoundPointerElementAccess node) { NoteUnsafe(node); return base.VisitPointerElementAccess(node); }