Given these two files (noting that the original file didn't have an error in it, it just allowed me to cut it down further), a.d: struct S (T) { void m () { intentional mistake; } } S! (T) f (T) () { return S! (T) (); } b.d: import a; void main () { f! (char) ().m (); } Compile them separately then link them together. The link fails because b.obj has a reference to _D1a8__T1STaZ1S1mMFZv but doesn't have a COMDAT for it (not that it could compile it).
It turns out that there actually was a problem with the template; oddly enough the problem was one that causes the compiler to crash, unlike the banal semantic error here. So having invalid code appears to be a prerequisite for this problem to manifest.
Works in DMD v2.046. D:\test>dmd a.d b.d a.d(5): Error: identifier 'intentional' is not defined a.d(5): Error: intentional is used as a type a.d(9): Error: template instance a.S!(char) error instantiating b.d(5): instantiated from here: f!(char)