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.


Handles operator overloading.

Specification Operator Overloading


Source opover.d

@safe bool isCommutative(EXP op);
Determine if operands of binary op can be reversed to fit operator overload.
Objects* opToArg(Scope* sc, EXP op);
Helper function to turn operator into template argument list
Expression op_overload(Expression e, Scope* sc, EXP* pop = null);
Operator overload. Check for operator overload, if so, replace with function call.
Expression e expression with operator
Scope* sc context
EXP* pop if not null, is set to the operator that was actually overloaded, which may not be e.op. Happens when operands are reversed to match an overload
null if not an operator overload, otherwise the lowered expression
Expression build_overload(const ref Loc loc, Scope* sc, Expression ethis, Expression earg, Dsymbol d);
Utility to build a function call out of this reference and argument.
Dsymbol search_function(ScopeDsymbol ad, Identifier funcid);
Search for function funcid in aggregate ad.
bool inferForeachAggregate(Scope* sc, bool isForeach, ref Expression feaggr, out Dsymbol sapply);
Figure out what is being foreach'd over by looking at the ForeachAggregate.
Scope* sc context
bool isForeach true for foreach, false for foreach_reverse
Expression feaggr ForeachAggregate
Dsymbol sapply set to function opApply/opApplyReverse, or delegate, or null. Overload resolution is not done.
true if successfully figured it out; feaggr updated with semantic analysis. false for failed, which is an error.
bool inferApplyArgTypes(ForeachStatement fes, Scope* sc, ref Dsymbol sapply);
Given array of foreach parameters and an aggregate type, find best opApply overload, if any of the parameter types are missing, attempt to infer them from the aggregate type.
ForeachStatement fes the foreach statement
Scope* sc context
Dsymbol sapply null or opApply or delegate, overload resolution has not been done. Do overload resolution on sapply.
false for errors