Mercurial > projects > ldc
diff gen/tocall.cpp @ 422:fa91b03d9cd7
Error message for calling a function with a missing 'this' arg.
author | Christian Kamm <kamm incasoftware de> |
---|---|
date | Tue, 29 Jul 2008 10:29:52 +0200 |
parents | ac1fcc138e42 |
children | 74101be2a553 |
line wrap: on
line diff
--- a/gen/tocall.cpp Mon Jul 28 21:37:47 2008 +0200 +++ b/gen/tocall.cpp Tue Jul 29 10:29:52 2008 +0200 @@ -180,7 +180,7 @@ } -DValue* DtoCallFunction(Type* resulttype, DValue* fnval, Expressions* arguments) +DValue* DtoCallFunction(Loc& loc, Type* resulttype, DValue* fnval, Expressions* arguments) { // the callee D type Type* calleeType = fnval->getType(); @@ -224,31 +224,40 @@ args.push_back(retvar); } - // then comes the 'this' argument - if (dfnval && dfnval->vthis) - { - LLValue* thisarg = DtoBitCast(dfnval->vthis, argiter->get()); - ++argiter; - args.push_back(thisarg); - } - // or a delegate context arg - else if (delegatecall) + // then comes a context argument... + if(usesthis || delegatecall || nestedcall) { - LLValue* ctxarg = DtoLoad(DtoGEPi(fnval->getRVal(), 0,0)); - assert(ctxarg->getType() == argiter->get()); - ++argiter; - args.push_back(ctxarg); - } - // or a nested function context arg - else if (nestedcall) - { - LLValue* contextptr = DtoNestedContext(dfnval->func->toParent2()->isFuncDeclaration()); - if (!contextptr) - contextptr = getNullPtr(getVoidPtrType()); + // ... which can be a 'this' argument + if (dfnval && dfnval->vthis) + { + LLValue* thisarg = DtoBitCast(dfnval->vthis, argiter->get()); + ++argiter; + args.push_back(thisarg); + } + // ... or a delegate context arg + else if (delegatecall) + { + LLValue* ctxarg = DtoLoad(DtoGEPi(fnval->getRVal(), 0,0)); + assert(ctxarg->getType() == argiter->get()); + ++argiter; + args.push_back(ctxarg); + } + // ... or a nested function context arg + else if (nestedcall) + { + LLValue* contextptr = DtoNestedContext(dfnval->func->toParent2()->isFuncDeclaration()); + if (!contextptr) + contextptr = getNullPtr(getVoidPtrType()); + else + contextptr = DtoBitCast(contextptr, getVoidPtrType()); + ++argiter; + args.push_back(contextptr); + } else - contextptr = DtoBitCast(contextptr, getVoidPtrType()); - ++argiter; - args.push_back(contextptr); + { + error(loc, "Context argument required but none given"); + fatal(); + } } // handle the rest of the arguments based on param passing style