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.

dmd.sideeffect

Find side-effects of expressions.
Authors:

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.
Parameters:
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.
Returns:
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).
Returns:
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.
Parameters:
StorageClass stc storage classes will be added to the made temporary variable
char[] name name for temporary variable
Expression e original expression
Returns:
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.
Parameters:
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.
Returns:
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.