D issues are now
tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Summary: |
Linker error on template function. Error 42: Symbol Undefined ... |
Product: |
D
|
Reporter: |
Chad <gamerChad> |
Component: |
dmd | Assignee: |
No Owner <nobody> |
Status: |
RESOLVED
FIXED
|
Severity: |
normal
|
CC: |
bearophile_hugs, bugzilla, k.hara.pg, kennytm
|
Priority: |
P2
|
Keywords: |
link-failure, patch |
Version: |
D2 |
Hardware: |
x86 |
OS: |
Windows |
void explode(char[] foo)()
{
int gremlins;
char[] bar = foo[gremlins..$];
}
void main(){ explode!("BOOM"); }
The above program prints the following when compiled:
C:\dmd\bin\..\..\dm\bin\link.exe main,,,user32+kernel32/noi;
OPTLINK (R) for Win32 Release 7.50B1
Copyright (C) Digital Mars 1989 - 2001 All Rights Reserved
main.obj(main)
Error 42: Symbol Undefined _D4main27__T7explodeVG4aa4_424f4f4dZ7explodeFZv8__do
llark
--- errorlevel 1
This was tested with DMD 1.020 on Windows XP.
Still not fixed in D2.052 :)
-------------------------------------
void explode(string foo)() {
int gremlins = 0;
string bar = foo[gremlins .. $];
}
void main(){ explode!("BOOM")(); }
-------------------------------------
Undefined symbols:
"_D1x27__T7explodeVAyaa4_424f4f4dZ7explodeFZv8__dollark", referenced from:
_D1x27__T7explodeVAyaa4_424f4f4dZ7explodeFZv8__dollark$non_lazy_ptr in x.o
(maybe you meant: _D1x27__T7explodeVAyaa4_424f4f4dZ7explodeFZv8__dollark$non_lazy_ptr)
ld: symbol(s) not found
collect2: ld returned 1 exit status
--- errorlevel 1
-------------------------------------
'_D1x27__T7explodeVAyaa4_424f4f4dZ7explodeFZv8__dollark' means 'void x.explode!("BOOM").explode().uint __dollar'.
Reduced test case for 1.068:
-----------------------------------
void main(){
const string s = "BOOM";
int gremlins = 0;
string bar = s[gremlins .. $];
}
-----------------------------------
Undefined symbols:
"_D1y4mainFZv8__dollark", referenced from:
_D1y4mainFZv8__dollark$non_lazy_ptr in y.o
(maybe you meant: _D1y4mainFZv8__dollark$non_lazy_ptr)
ld: symbol(s) not found
collect2: ld returned 1 exit status
--- errorlevel 1
-----------------------------------
The equivalent for 2.054:
-----------------------------------
void main(){
enum string s = "BOOM";
int gremlins = 0;
string bar = s[gremlins .. $];
}
-----------------------------------
*** Issue 5062 has been marked as a duplicate of this issue. ***