Report a bug
If you spot a problem with this page, click here to create a Bugzilla issue.
Improve this page
Quickly fork, edit online, and submit a pull request for this page. Requires a signed-in GitHub account. This works well for small changes. If you'd like to make larger changes you may want to consider using a local clone.


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

Specification Array Operations


Source arrayop.d

bool isArrayOpValid(Expression e);
Check that there are no uses of arrays without [].
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.
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
true if can be performed by arrayOp
@safe bool isUnaArrayOp(EXP op);
Test if expression is a unary array op.
@safe bool isBinArrayOp(EXP op);
Test if expression is a binary array op.
@safe bool isBinAssignArrayOp(EXP op);
Test if expression is a binary assignment array op.
bool isArrayOpOperand(Expression e);
Test if operand is a valid array op operand.
ErrorExp arrayOpInvalidError(Expression e);
Print error message about invalid array operation.
Expression e expression with the invalid array operation
instance of ErrorExp