# HG changeset patch # User ChristianK # Date 1216110230 -7200 # Node ID 051ab876fe118c121c943476d42b5647c060b8ff # Parent 7d91d82000aeeca2cdb0364186f5fe2cfbe3dc74 [svn r391] Fix classes nested inside functions for real. diff -r 7d91d82000ae -r 051ab876fe11 gen/classes.cpp --- a/gen/classes.cpp Tue Jul 15 08:44:08 2008 +0200 +++ b/gen/classes.cpp Tue Jul 15 10:23:50 2008 +0200 @@ -828,7 +828,8 @@ Logger::println("Resolving nested context"); LOG_SCOPE; - LLValue* gep = DtoGEPi(mem,0,2,"tmp"); + size_t idx = 2 + tc->sym->vthis->ir.irField->index; + LLValue* gep = DtoGEPi(mem,0,idx,"tmp"); // this value might be zero if it was not necessary to generate it ... LLValue* nest = gIR->func()->nestedVar; diff -r 7d91d82000ae -r 051ab876fe11 gen/llvmhelpers.cpp --- a/gen/llvmhelpers.cpp Tue Jul 15 08:44:08 2008 +0200 +++ b/gen/llvmhelpers.cpp Tue Jul 15 10:23:50 2008 +0200 @@ -382,7 +382,7 @@ } else if (ClassDeclaration* cd = fd->toParent2()->isClassDeclaration()) { - v = DtoGEPi(v,0,2,"tmp"); + v = DtoGEPi(v,0,2+cd->vthis->ir.irField->index,"tmp"); v = DtoLoad(v); } else diff -r 7d91d82000ae -r 051ab876fe11 tests/mini/nested6a.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/mini/nested6a.d Tue Jul 15 10:23:50 2008 +0200 @@ -0,0 +1,39 @@ +module nested6a; +extern(C) int printf(char*, ...); + +void main() +{ + int i = 42; + + printf("main() %d\n", i++); + + class C + { + int j; + void func() + { + int k; + printf("C.func() %d\n", i++); + + class C2 + { + int l; + void func2() + { + printf("C2.func2() %d\n", i++); + } + int m; + } + + { + scope c2 = new C2; + c2.func2(); + } + int n; + } + int o; + } + + scope c = new C; + c.func(); +}