diff --git a/gen/toir.cpp b/gen/toir.cpp index 2de44404..400cc5ac 100644 --- a/gen/toir.cpp +++ b/gen/toir.cpp @@ -936,7 +936,7 @@ DValue* CallExp::toElem(IRState* p) 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 @@ DValue* CallExp::toElem(IRState* p) 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 @@ DValue* CallExp::toElem(IRState* p) 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 @@ DValue* CallExp::toElem(IRState* p) { Logger::println("doing d-style variadic arguments"); + size_t nimplicit = j; + std::vector vtypes; std::vector vvalues; std::vector vtypeinfos; @@ -1020,7 +1023,7 @@ DValue* CallExp::toElem(IRState* p) 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 --git a/llvmdc.kdevelop.filelist b/llvmdc.kdevelop.filelist index 6f60cd20..7aecc7bc 100644 --- a/llvmdc.kdevelop.filelist +++ b/llvmdc.kdevelop.filelist @@ -325,6 +325,8 @@ test/bug72.d 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/staticarrays.d test/staticvars.d test/stdiotest.d test/strings1.d +test/strings2.d test/structinit.d test/structinit2.d test/structs.d diff --git a/lphobos/std/format.d b/lphobos/std/format.d index 669eb3c8..b217708a 100644 --- a/lphobos/std/format.d +++ b/lphobos/std/format.d @@ -449,7 +449,7 @@ formattedPrint("The answer is %s:", x, 6); ------------------------ */ -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 --git a/test/bug76.d b/test/bug76.d new file mode 100644 index 00000000..71ebde5e --- /dev/null +++ b/test/bug76.d @@ -0,0 +1,9 @@ +module bug76; +char[] fmt(...) +{ + return ""; +} +void main() +{ + char[] s = fmt(); +} diff --git a/test/bug77.d b/test/bug77.d new file mode 100644 index 00000000..b56bddb0 --- /dev/null +++ b/test/bug77.d @@ -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 --git a/test/strings2.d b/test/strings2.d new file mode 100644 index 00000000..8331dccf --- /dev/null +++ b/test/strings2.d @@ -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); +}