changeset 120:5ce8ab11e75a trunk

[svn r124] Fixed another D vararg + return in ptr bug. Fixed some nested function calls failed to resolve the context ptr.
author lindquist
date Mon, 26 Nov 2007 07:26:21 +0100
parents 79c9ac745fbc
children 9c79b61fb638
files gen/toir.cpp llvmdc.kdevelop.filelist lphobos/std/format.d test/bug76.d test/bug77.d test/strings2.d
diffstat 6 files changed, 53 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/gen/toir.cpp	Mon Nov 26 06:45:13 2007 +0100
+++ b/gen/toir.cpp	Mon Nov 26 07:26:21 2007 +0100
@@ -936,7 +936,7 @@
         Logger::println("This Call");
         if (dfn->vthis->getType() != argiter->get()) {
             //Logger::cout() << *fn->thisparam << '|' << *argiter->get() << '\n';
-            llargs[j] = new llvm::BitCastInst(dfn->vthis, argiter->get(), "tmp", p->scopebb());
+            llargs[j] = DtoBitCast(dfn->vthis, argiter->get());
         }
         else {
             llargs[j] = dfn->vthis;
@@ -956,8 +956,9 @@
     else if (dfn && dfn->func && dfn->func->isNested()) {
         Logger::println("Nested Call");
         llvm::Value* contextptr = p->func()->decl->llvmNested;
-        assert(contextptr);
-        llargs[j] = p->ir->CreateBitCast(contextptr, llvm::PointerType::get(llvm::Type::Int8Ty), "tmp");
+        if (!contextptr)
+            contextptr = llvm::ConstantPointerNull::get(llvm::PointerType::get(llvm::Type::Int8Ty));
+        llargs[j] = DtoBitCast(contextptr, llvm::PointerType::get(llvm::Type::Int8Ty));
         ++j;
         ++argiter;
     }
@@ -970,7 +971,7 @@
             Argument* fnarg = Argument::getNth(tf->parameters, i);
             Expression* exp = (Expression*)arguments->data[i];
             DValue* expelem = exp->toElem(p);
-            llargs[j] = p->ir->CreateBitCast(expelem->getLVal(), llvm::PointerType::get(llvm::Type::Int8Ty), "tmp");
+            llargs[j] = DtoBitCast(expelem->getLVal(), llvm::PointerType::get(llvm::Type::Int8Ty));
         }
     }
     // regular arguments
@@ -979,6 +980,8 @@
         {
             Logger::println("doing d-style variadic arguments");
 
+            size_t nimplicit = j;
+
             std::vector<const llvm::Type*> vtypes;
             std::vector<llvm::Value*> vvalues;
             std::vector<llvm::Value*> vtypeinfos;
@@ -1020,7 +1023,7 @@
             j++;
             llargs[j] = p->ir->CreateBitCast(mem, llvm::PointerType::get(llvm::Type::Int8Ty), "tmp");
             j++;
-            llargs.resize(2);
+            llargs.resize(nimplicit+2);
         }
         else {
             Logger::println("doing normal arguments");
--- a/llvmdc.kdevelop.filelist	Mon Nov 26 06:45:13 2007 +0100
+++ b/llvmdc.kdevelop.filelist	Mon Nov 26 07:26:21 2007 +0100
@@ -325,6 +325,8 @@
 test/bug73.d
 test/bug74.d
 test/bug75.d
+test/bug76.d
+test/bug77.d
 test/bug8.d
 test/bug9.d
 test/c.d
@@ -418,6 +420,7 @@
 test/staticvars.d
 test/stdiotest.d
 test/strings1.d
+test/strings2.d
 test/structinit.d
 test/structinit2.d
 test/structs.d
--- a/lphobos/std/format.d	Mon Nov 26 06:45:13 2007 +0100
+++ b/lphobos/std/format.d	Mon Nov 26 07:26:21 2007 +0100
@@ -449,7 +449,7 @@
 ------------------------
  */
 
-void doFormat(void delegate(dchar) putc, TypeInfo[] arguments, va_list argptr)
+void doFormat(void delegate(dchar) putc, TypeInfo[] arguments, void* argptr)
 {   int j;
     TypeInfo ti;
     Mangle m;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/bug76.d	Mon Nov 26 07:26:21 2007 +0100
@@ -0,0 +1,9 @@
+module bug76;
+char[] fmt(...)
+{
+    return "";
+}
+void main()
+{
+    char[] s = fmt();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/bug77.d	Mon Nov 26 07:26:21 2007 +0100
@@ -0,0 +1,17 @@
+module bug77;
+import std.c.string;
+void main()
+{
+    size_t len;
+    void func2()
+    {
+        char* prefix = "";
+
+        void func()
+        {
+        len = strlen(prefix);
+        assert(len == 0);
+        }
+    }
+    func2();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/strings2.d	Mon Nov 26 07:26:21 2007 +0100
@@ -0,0 +1,15 @@
+module strings2;
+
+import std.string;
+import std.stdio;
+
+void main()
+{
+    int i = 32;
+    auto str = format(i);
+    writefln(str);
+
+    long l = 123123;
+    str = format(l);
+    writefln(str);
+}