Bug 2500 – template struct methods are left unresolved if imported from multiple modules
Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2008-12-08T20:08:00Z
Last change time
2015-06-09T05:11:54Z
Keywords
link-failure, pull
Assigned to
bugzilla
Creator
2korden
Comments
Comment #0 by 2korden — 2008-12-08T20:08:05Z
The smallest test case I could find that fails for both D1 and D2 follows:
module A;
import B;
import C;
public class A
{
T!(A) c;
}
void main()
{
A a = new A();
a.c.foo();
}
// B.d
module B;
import A;
import C;
class B
{
T!(A) t;
}
// C.d
module C;
struct T(Type)
{
void foo(){}
}
If anyone knows a workaround *please* let me know.
Comment #1 by 2korden — 2008-12-08T23:44:59Z
Oopps, I forgot to add some importannt information...
The compilation command sequence I used is:
# dmd a -c // ok
# dmd b -c // ok
# dmd c -c // ok
# dmd a.obj b.obj c.obj // link error
Error 42: Symbol Undefined _D1C12__T1TTC1A1AZ1T3fooMFZv
--- errorlevel 1
Comment #2 by schveiguy — 2008-12-09T08:30:02Z
Confirmed on Linux as well.
Note that the following commands work ok:
dmd A.d B.d C.d
or
dmd -c A.d B.d C.d
dmd A.o B.o C.o
It seems that in the first (without -c), the symbol is defined in A.o
In the second case, now B.o has the symbol defined, whereas if you compile B.d separate, it is not defined. There is definitely a bug if compiling the files into objects separately generates different code than compiling them in to objects in one line.
Comment #3 by bugzilla — 2008-12-11T02:17:33Z
What's happening is A.d thinks that T!(int) is instantiated by B, and B thinks it is instantiated in A. (T!(A) can be T!(int), the A just confuses things.) The workaround is:
1. compile A and B on the same command, instead of separately.
2. structure A and B so they don't import each other.
Comment #4 by bugzilla — 2008-12-25T04:39:50Z
Fixed dmd 1.038 amd 2.022
Comment #5 by wbaxter — 2009-01-07T18:11:50Z
Fix was reverted in 1.039 because it was causing hideously slow compile times for some code.