diff gen/toir.c @ 66:0c5f410d973c trunk

[svn r70] Fixed bug where correct calling convention was not set on calling aggregate methods
author lindquist
date Sun, 28 Oct 2007 02:03:42 +0200
parents b688ad419f8c
children f918f3e2e99e
line wrap: on
line diff
--- a/gen/toir.c	Fri Oct 26 15:14:51 2007 +0200
+++ b/gen/toir.c	Sun Oct 28 02:03:42 2007 +0200
@@ -1254,7 +1254,13 @@
         e->val = call;
 
     // set calling convention
-    if ((fn->funcdecl && (fn->funcdecl->llvmInternal != LLVMintrinsic && fn->funcdecl->llvmInternal != LLVMva_start)) || delegateCall)
+    if (fn->funcdecl) {
+        int li = fn->funcdecl->llvmInternal;
+        if (li != LLVMintrinsic && li != LLVMva_start && li != LLVMva_intrinsic) {
+            call->setCallingConv(LLVM_DtoCallingConv(dlink));
+        }
+    }
+    else if (delegateCall)
         call->setCallingConv(LLVM_DtoCallingConv(dlink));
     else if (fn->callconv != (unsigned)-1)
         call->setCallingConv(fn->callconv);
@@ -1600,7 +1606,8 @@
             e->callconv = LLVM_DtoCallingConv(fdecl->linkage);
         }
         e->val = funcval;
-        e->type = elem::VAL;
+        e->type = elem::FUNC;
+        e->funcdecl = fdecl;
     }
     else {
         printf("unknown: %s\n", var->toChars());