# HG changeset patch # User lindquist # Date 1196058381 -3600 # Node ID 5ce8ab11e75a7867113c54fc432c8f9337344b06 # Parent 79c9ac745fbcad584accc7e995fa1d1a433c036a [svn r124] Fixed another D vararg + return in ptr bug. Fixed some nested function calls failed to resolve the context ptr. diff -r 79c9ac745fbc -r 5ce8ab11e75a gen/toir.cpp --- 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 vtypes; std::vector vvalues; std::vector 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"); diff -r 79c9ac745fbc -r 5ce8ab11e75a llvmdc.kdevelop.filelist --- 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 diff -r 79c9ac745fbc -r 5ce8ab11e75a lphobos/std/format.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; diff -r 79c9ac745fbc -r 5ce8ab11e75a test/bug76.d --- /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(); +} diff -r 79c9ac745fbc -r 5ce8ab11e75a test/bug77.d --- /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(); +} diff -r 79c9ac745fbc -r 5ce8ab11e75a test/strings2.d --- /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); +}