diff --git a/src/glue.c b/src/glue.c index fefe3696508d..2c1e14d4e0e6 100644 --- a/src/glue.c +++ b/src/glue.c @@ -588,8 +588,34 @@ void FuncDeclaration::toObjFile(int multiobj) if (!global.params.useUnitTests && ti && ti->instantiatingModule && !ti->instantiatingModule->root) { - //printf("instantiated by %s %s\n", ti->instantiatingModule->toChars(), ti->toChars()); - return; + Module *mi = ti->instantiatingModule; + + // If mi imports any root modules, we still need to generate the code. + for (size_t i = 0; i < Module::amodules.dim; ++i) + { + Module *m = Module::amodules[i]; + m->insearch = 0; + } + bool importsRoot = false; + for (size_t i = 0; i < Module::amodules.dim; ++i) + { + Module *m = Module::amodules[i]; + if (m->root && mi->imports(m)) + { + importsRoot = true; + break; + } + } + for (size_t i = 0; i < Module::amodules.dim; ++i) + { + Module *m = Module::amodules[i]; + m->insearch = 0; + } + if (!importsRoot) + { + //printf("instantiated by %s %s\n", ti->instantiatingModule->toChars(), ti->toChars()); + return; + } } if (global.params.verbose) diff --git a/test/runnable/imports/test11039b.d b/test/runnable/imports/test11039b.d new file mode 100644 index 000000000000..7a56f8a2b53e --- /dev/null +++ b/test/runnable/imports/test11039b.d @@ -0,0 +1,7 @@ + +module imports.test11039b; + +import test11039; + +static anotherGlobalField = SomeStruct!string("Hello Again!"); + diff --git a/test/runnable/test11039.d b/test/runnable/test11039.d new file mode 100644 index 000000000000..8c2e624499bd --- /dev/null +++ b/test/runnable/test11039.d @@ -0,0 +1,23 @@ + +// COMPILE_SEPARATELY +// EXTRA_SOURCES: imports/test11039b.d + +import imports.test11039b; + +struct SomeStruct(T) +{ + T field; + T getInnerField() + { + return field; + } +} + +static globalField = SomeStruct!string("Hello!"); + +void main() +{ + globalField.getInnerField(); + anotherGlobalField.getInnerField(); +} +