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