Mercurial > projects > ldc
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); +}