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.


Find side-effects of expressions.

Source sideeffect.d

bool isTrivialExp(Expression e);
Front-end expression rewriting should create temporary variables for non trivial sub-expressions in order to:
  1. save evaluation order
  2. prevent sharing of sub-expression in AST
bool hasSideEffect(Expression e, bool assumeImpureCalls = false);
Determine if Expression has any side effects.
Expression e the expression
bool assumeImpureCalls whether function calls should always be assumed to be impure (e.g. debug is allowed to violate purity)
int callSideEffectLevel(FuncDeclaration f);
Determine if the call of f, or function type or delegate type t1, has any side effects.
0 has any side effects 1 nothrow + strongly pure 2 nothrow + strongly pure + only immutable indirections in the return type
bool discardValue(Expression e);
The result of this expression will be discarded. Print error messages if the operation has no side effects (and hence is meaningless).
true if expression has no side effects
VarDeclaration copyToTemp(StorageClass stc, const char[] name, Expression e);
Build a temporary variable to copy the value of e into.
StorageClass stc storage classes will be added to the made temporary variable
char[] name name for temporary variable
Expression e original expression
Newly created temporary variable.
Expression extractSideEffect(Scope* sc, const char[] name, ref Expression e0, Expression e, bool alwaysCopy = false);
Build a temporary variable to extract e's evaluation, if e is not trivial.
Scope* sc scope
char[] name name for temporary variable
Expression e0 a new side effect part will be appended to it.
Expression e original expression
bool alwaysCopy if true, build new temporary variable even if e is trivial.
When e is trivial and alwaysCopy == false, e itself is returned. Otherwise, a new VarExp is returned.

Note e's lvalue-ness will be handled well by STC.ref_ or STC.rvalue.