Implement array operations, such as a[] = b[] + c[].

Specification: Array Operations


Walter Bright

Source: arrayop.d

  • Declaration

    bool isArrayOpValid(Expression e);

    Check that there are no uses of arrays without [].

  • Declaration

    Expression arrayOp(BinExp e, Scope* sc);
    Expression arrayOp(BinAssignExp e, Scope* sc);

    Construct the array operation expression, call object.arrayOp!(tiargs)(args).


    Encode operand types and operations into tiargs using reverse polish notation (RPN) to preserve precedence. Unary operations are prefixed with "u" (e.g. "u~"). Pass operand values (slices or scalars) as args.

    Scalar expression sub-trees of e are evaluated before calling into druntime to hoist them out of the loop. This is a valid evaluation order as the actual array operations have no side-effect.

  • Declaration

    bool isArrayOpImplicitCast(TypeDArray tfrom, TypeDArray tto);

    Some implicit casting can be performed by the arrayOp template.


    TypeDArray tfrom

    type converting from

    TypeDArray tto

    type converting to

    Return Value

    true if can be performed by arrayOp

  • Declaration

    bool isUnaArrayOp(EXP op);

    Test if expression is a unary array op.

  • Declaration

    bool isBinArrayOp(EXP op);

    Test if expression is a binary array op.

  • Declaration

    bool isBinAssignArrayOp(EXP op);

    Test if expression is a binary assignment array op.

  • Declaration

    bool isArrayOpOperand(Expression e);

    Test if operand is a valid array op operand.

  • Declaration

    ErrorExp arrayOpInvalidError(Expression e);

    Print error message about invalid array operation.


    Expression e

    expression with the invalid array operation

    Return Value

    instance of ErrorExp