protected override Arguments CreateSetterArguments (ResolveContext rc, Expression rhs) { // // Indexer has arguments which complicates things as the setter and getter // are called in two steps when unary mutator is used. We have to make a // copy of all variable arguments to not duplicate any side effect. // // ++d[++arg, Foo ()] // if (!can_be_mutator) return base.CreateSetterArguments (rc, rhs); var setter_args = new Arguments (Arguments.Count + 1); for (int i = 0; i < Arguments.Count; ++i) { var expr = Arguments[i].Expr; if (expr is Constant || expr is VariableReference || expr is This) { setter_args.Add (Arguments [i]); continue; } LocalVariable temp = LocalVariable.CreateCompilerGenerated (expr.Type, rc.CurrentBlock, loc); expr = new SimpleAssign (temp.CreateReferenceExpression (rc, expr.Location), expr).Resolve (rc); Arguments[i].Expr = temp.CreateReferenceExpression (rc, expr.Location).Resolve (rc); setter_args.Add (Arguments [i].Clone (expr)); } setter_args.Add (new Argument (rhs)); return setter_args; }