changeset 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 1c65b5477eaa
children 3424f0fab7a9
files gen/classes.cpp gen/llvmhelpers.h gen/tocall.cpp gen/toir.cpp
diffstat 4 files changed, 37 insertions(+), 28 deletions(-) [+]
line wrap: on
line diff
--- a/gen/classes.cpp	Mon Jul 28 21:37:47 2008 +0200
+++ b/gen/classes.cpp	Tue Jul 29 10:29:52 2008 +0200
@@ -798,7 +798,7 @@
     {
         DtoForceDeclareDsymbol(newexp->allocator);
         DFuncValue dfn(newexp->allocator, newexp->allocator->ir.irFunc->func);
-        DValue* res = DtoCallFunction(NULL, &dfn, newexp->newargs);
+        DValue* res = DtoCallFunction(newexp->loc, NULL, &dfn, newexp->newargs);
         mem = DtoBitCast(res->getRVal(), DtoType(tc), ".newclass_custom");
     }
     // default allocator
@@ -852,7 +852,7 @@
         assert(newexp->arguments != NULL);
         DtoForceDeclareDsymbol(newexp->member);
         DFuncValue dfn(newexp->member, newexp->member->ir.irFunc->func, mem);
-        return DtoCallFunction(tc, &dfn, newexp->arguments);
+        return DtoCallFunction(newexp->loc, tc, &dfn, newexp->arguments);
     }
 
     // return default constructed class
--- a/gen/llvmhelpers.h	Mon Jul 28 21:37:47 2008 +0200
+++ b/gen/llvmhelpers.h	Tue Jul 29 10:29:52 2008 +0200
@@ -118,6 +118,6 @@
 void DtoBuildDVarArgList(std::vector<LLValue*>& args, llvm::PAListPtr& palist, TypeFunction* tf, Expressions* arguments, size_t argidx);
 
 ///
-DValue* DtoCallFunction(Type* resulttype, DValue* fnval, Expressions* arguments);
+DValue* DtoCallFunction(Loc& loc, Type* resulttype, DValue* fnval, Expressions* arguments);
 
 #endif
--- 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
--- a/gen/toir.cpp	Mon Jul 28 21:37:47 2008 +0200
+++ b/gen/toir.cpp	Tue Jul 29 10:29:52 2008 +0200
@@ -886,7 +886,7 @@
         }
     }
 
-    return DtoCallFunction(type, fnval, arguments);
+    return DtoCallFunction(loc, type, fnval, arguments);
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////