d: Merge upstream dmd 0fcdaab32
authorIain Buclaw <ibuclaw@gdcproject.org>
Fri, 23 Oct 2020 07:41:11 +0000 (09:41 +0200)
committerIain Buclaw <ibuclaw@gdcproject.org>
Tue, 27 Oct 2020 10:50:35 +0000 (11:50 +0100)
commite419ede8915eeb879de3d9c026cd4213aaceb86a
tree03b7bf22cb46b94e4ad563d88dfbb0e73aaac92e
parent14e19b82c1e67ead60c3095ac23347317298904b
d: Merge upstream dmd 0fcdaab32

Fixes a bug where there was undefined template references when compiling
upstream dmd mainline.

In `TemplateInstance::semantic`, there exists special handling of
matching template instances for the same template declaration to ensure
that only at most one instance gets codegen'd.

If the primary instance `inst` originated from a non-root module, the
`minst` field will be updated so it is now coming from a root module,
however all Dsymbol `inst->members` of the instance still have their
`_scope->minst` pointing at the original non-root module. We must now
propagate `minst` to all members so that forward referenced dependencies
that get instantiated will also be appended to the root module,
otherwise there will be undefined references at link-time.

This doesn't affect compilations where all modules are compiled
together, as every module is a root module in that situation.  What this
primarily affects are cases where there is a mix of root and non-root
modules, and a template was first instantiated in a non-root context,
then later instantiated again in a root context.

Reviewed-on: https://github.com/dlang/dmd/pull/11867

gcc/d/ChangeLog:

* dmd/MERGE: Merge upstream dmd 0fcdaab32
gcc/d/dmd/MERGE
gcc/d/dmd/dtemplate.c
gcc/testsuite/gdc.test/compilable/imports/test21299/func.d [new file with mode: 0644]
gcc/testsuite/gdc.test/compilable/imports/test21299/mtype.d [new file with mode: 0644]
gcc/testsuite/gdc.test/compilable/imports/test21299/rootstringtable.d [new file with mode: 0644]
gcc/testsuite/gdc.test/compilable/test21299a.d [new file with mode: 0644]
gcc/testsuite/gdc.test/compilable/test21299b.d [new file with mode: 0644]
gcc/testsuite/gdc.test/compilable/test21299c.d [new file with mode: 0644]
gcc/testsuite/gdc.test/compilable/test21299d.d [new file with mode: 0644]