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.
Comment #6 by k.hara.pg — 2015-02-05T05:59:45Z
The test case still fails to compile with 2.066.1. https://github.com/D-Programming-Language/dmd/pull/4384
Comment #7 by k.hara.pg — 2015-02-05T10:01:14Z
*** Issue 12099 has been marked as a duplicate of this issue. ***
Comment #8 by github-bugzilla — 2015-02-13T22:03:23Z
Commits pushed to master at https://github.com/D-Programming-Language/dmd https://github.com/D-Programming-Language/dmd/commit/5ba40267bb26f5405e829112933d1d4e5c179d61 fix Issue 2500 - template struct methods are left unresolved if imported from multiple modules https://github.com/D-Programming-Language/dmd/commit/c4387428c034ae83fa2504379c68ed3ac354d58f Merge pull request #4384 from 9rnsr/fix2644 Issue 2644 & 2500 & 10920 - Unresolved template reference
Comment #9 by github-bugzilla — 2015-02-21T09:11:03Z
Commits pushed to https://github.com/D-Programming-Language/dmd https://github.com/D-Programming-Language/dmd/commit/5ba40267bb26f5405e829112933d1d4e5c179d61 fix Issue 2500 - template struct methods are left unresolved if imported from multiple modules https://github.com/D-Programming-Language/dmd/commit/c4387428c034ae83fa2504379c68ed3ac354d58f Merge pull request #4384 from 9rnsr/fix2644