From b5433b60544a428c82bf8dca8ab416ab36994735 Mon Sep 17 00:00:00 2001 From: Tomas Lindquist Olsen Date: Sun, 28 Oct 2007 03:14:29 +0100 Subject: [PATCH] [svn r72] Calling a nested function that is not a delegate was not working. --- gen/toir.c | 10 ++++++++++ gen/toobj.c | 1 + test/nested3.d | 12 ++++++++++++ 3 files changed, 23 insertions(+) create mode 100644 test/nested3.d diff --git a/gen/toir.c b/gen/toir.c index d16473fe..f9c5d2dc 100644 --- a/gen/toir.c +++ b/gen/toir.c @@ -1036,6 +1036,7 @@ elem* CallExp::toElem(IRState* p) if (fn->arg || delegateCall) n++; if (retinptr) n++; if (tf->linkage == LINKd && tf->varargs == 1) n+=2; + if (fn->funcdecl && fn->funcdecl->isNested()) n++; llvm::Value* funcval = fn->getValue(); assert(funcval != 0); @@ -1127,6 +1128,15 @@ elem* CallExp::toElem(IRState* p) ++j; ++argiter; } + // nested call + else if (fn->funcdecl && fn->funcdecl->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"); + ++j; + ++argiter; + } // va arg function special argument passing if (va_magic) { diff --git a/gen/toobj.c b/gen/toobj.c index 24621a62..a5693a24 100644 --- a/gen/toobj.c +++ b/gen/toobj.c @@ -789,6 +789,7 @@ void FuncDeclaration::toObjFile() VarDeclaration* vd = *i; if (vd->isParameter()) { gIR->ir->CreateStore(vd->llvmValue, LLVM_DtoGEPi(llvmNested, 0, vd->llvmNestedIndex, "tmp")); + vd->llvmValue = llvmNested; } } } diff --git a/test/nested3.d b/test/nested3.d new file mode 100644 index 00000000..68203d4b --- /dev/null +++ b/test/nested3.d @@ -0,0 +1,12 @@ +module nested3; + +void main() +{ + int i; + void test() + { + i = 3; + } + test(); + assert(i == 3); +}