diff --git a/dmd2/arrayop.c b/dmd2/arrayop.c index 92985f39be..15cfcc045d 100644 --- a/dmd2/arrayop.c +++ b/dmd2/arrayop.c @@ -353,10 +353,10 @@ Expression *BinExp::arrayOp(Scope *sc) fd = new FuncDeclaration(0, 0, Lexer::idPool(name), STCundefined, ftype); fd->fbody = fbody; fd->protection = PROTpublic; - fd->linkage = LINKd; + fd->linkage = LINKd; - // special attention for array ops - fd->isArrayOp = true; + // special attention for array ops + fd->isArrayOp = true; sc->module->importedFrom->members->push(fd); diff --git a/gen/tocall.cpp b/gen/tocall.cpp index 33be5ef850..f3854fc09c 100644 --- a/gen/tocall.cpp +++ b/gen/tocall.cpp @@ -424,13 +424,29 @@ DValue* DtoCallFunction(Loc& loc, Type* resulttype, DValue* fnval, Expressions* LLSmallVector attrptr(n, 0); + std::vector argvals; + if (dfnval && dfnval->func->isArrayOp) { + // slightly different approach for array operators + for (int i=n-1; i>=0; --i) { + Parameter* fnarg = Parameter::getNth(tf->parameters, i); + assert(fnarg); + DValue* argval = DtoArgument(fnarg, (Expression*)arguments->data[i]); + argvals.insert(argvals.begin(), argval); + } + } else { + for (int i=0; iparameters, i); + assert(fnarg); + DValue* argval = DtoArgument(fnarg, (Expression*)arguments->data[i]); + argvals.push_back(argval); + } + } + // do formal params int beg = argiter-argbegin; for (int i=0; iparameters, i); - assert(fnarg); - DValue* argval = DtoArgument(fnarg, (Expression*)arguments->data[i]); + DValue* argval = argvals.at(i); #if 0 if (Logger::enabled()) {