// REQUIRED_ARGS: -unittest -boundscheck=off // PERMUTE_ARGS: // EXTRA_SOURCES: imports/a15030.d imports/b15030.d void main() {} /+ Compiler output with -v switch. With 2.068.0: -------- code a code b function b.__unittestL5_2 function b.__unittestL5_2.__lambda1 function b.__unittestL5_2.__lambda1.__lambda2 function b.__unittestL5_2.__lambda1.__lambda2.filter!((a) => a).filter!(int[]).filter function b.__unittestL5_2.__lambda1.__lambda2.FilterResult!(__lambda2, int[]).FilterResult.this function b.__unittestL5_2.__lambda1.__lambda2.FilterResult!(__lambda2, int[]).FilterResult.empty function b.__unittestL5_2.__lambda1.__lambda2.FilterResult!(__lambda2, int[]).FilterResult.front function b.__unittestL5_2.__lambda1.__lambda2.FilterResult!(__lambda2, int[]).FilterResult.popFront function b.__unittestL5_2.__lambda1.__lambda2.FilterResult!(__lambda2, int[]).FilterResult.__xopEquals function b.__unittestL5_2.__lambda1.__lambda2.FilterResult!(__lambda2, int[]).FilterResult.__xtoHash function b.__unittestL5_2.__lambda1.__lambda2.__lambda2 The nested functions '__lambda1', '__lambda2', and 'filter' are (fortunately) generated from outer to inner. With 2.068.1: -------- code a function b.__unittestL5_2.__lambda1.__lambda2.filter!((a) => a).filter!(int[]).filter function b.__unittestL5_2.__lambda1.__lambda2 function b.__unittestL5_2.__lambda1.__lambda2.FilterResult!(__lambda2, int[]).FilterResult.this function b.__unittestL5_2.__lambda1.__lambda2.FilterResult!(__lambda2, int[]).FilterResult.empty function b.__unittestL5_2.__lambda1.__lambda2.FilterResult!(__lambda2, int[]).FilterResult.front function b.__unittestL5_2.__lambda1.__lambda2.FilterResult!(__lambda2, int[]).FilterResult.popFront function b.__unittestL5_2.__lambda1.__lambda2.FilterResult!(__lambda2, int[]).FilterResult.__xopEquals function b.__unittestL5_2.__lambda1.__lambda2.FilterResult!(__lambda2, int[]).FilterResult.__xtoHash code b function b.__unittestL5_2 function b.__unittestL5_2.__lambda1 Assertion failure: '!v->csym' on line 1060 in file 'glue.c' abnormal program termination 'filer' is generated before its ancestor functions '__lambda1' and '__lambda2' - it's a bug. Fixed (contains debug prints): -------- code a b.__unittestL5_2.__lambda1.__lambda2.filter!((a) => a).filter!(int[]).filter @[algorithm.d(5)] --> pushed to unittest @[b.d(5)] function b.__unittestL5_2.__lambda1.__lambda2.FilterResult!(__lambda2, int[]).FilterResult.this function b.__unittestL5_2.__lambda1.__lambda2.FilterResult!(__lambda2, int[]).FilterResult.empty function b.__unittestL5_2.__lambda1.__lambda2.FilterResult!(__lambda2, int[]).FilterResult.front function b.__unittestL5_2.__lambda1.__lambda2.FilterResult!(__lambda2, int[]).FilterResult.popFront function b.__unittestL5_2.__lambda1.__lambda2.FilterResult!(__lambda2, int[]).FilterResult.__xopEquals function b.__unittestL5_2.__lambda1.__lambda2.FilterResult!(__lambda2, int[]).FilterResult.__xtoHash code b function b.__unittestL5_2 function b.__unittestL5_2.__lambda1 function b.__unittestL5_2.__lambda1.__lambda2 function b.__unittestL5_2.__lambda1.__lambda2.filter!((a) => a).filter!(int[]).filter function b.__unittestL5_2.__lambda1.__lambda2.__lambda2 By using `deferredNested` correctly, those nested function generations are ordered again. Fixed more: -------- function D main code a code b function b.__unittestL5_2 function b.__unittestL5_2.__lambda1 function b.__unittestL5_2.__lambda1.__lambda2 function b.__unittestL5_2.__lambda1.__lambda2.filter!(int[]).filter function b.__unittestL5_2.__lambda1.__lambda2.FilterResult!(__lambda2, int[]).FilterResult.this function b.__unittestL5_2.__lambda1.__lambda2.FilterResult!(__lambda2, int[]).FilterResult.empty function b.__unittestL5_2.__lambda1.__lambda2.FilterResult!(__lambda2, int[]).FilterResult.front function b.__unittestL5_2.__lambda1.__lambda2.FilterResult!(__lambda2, int[]).FilterResult.popFront function b.__unittestL5_2.__lambda1.__lambda2.FilterResult!(__lambda2, int[]).FilterResult.__xopEquals function b.__unittestL5_2.__lambda1.__lambda2.FilterResult!(__lambda2, int[]).FilterResult.__xtoHash function b.__unittestL5_2.__lambda1.__lambda2.__lambda2 By the tweak in TemplateInstance::appendToModuleMember(), all the code of (implicitly) nested instances are stored into corresponding module object file. +/