Dmd compiles this code, but linker fails.
---
#!/usr/bin/rdmd
import std;
void main() {
auto httpClient = HTTP();
httpClient.setAuthentication("", "");
string src = `{}`;
auto json = parseJSON(src);
writeln(json);
}
---
It returns a (strange) linking error:
/usr/bin/ld: /tmp/.rdmd-1000/rdmd-test2.d-C954334114259D06EF20F7503F19D193/objs/test2.o: in function `_D4core8internal7switch___T14__switch_errorZQrFNaNbNiNfAyamZv':
/usr/include/dmd/phobos/std/package.d:(.text._D4core8internal7switch___T14__switch_errorZQrFNaNbNiNfAyamZv[_D4core8internal7switch___T14__switch_errorZQrFNaNbNiNfAyamZv]+0x19): undefined reference to `_D4core9exception__T15__switch_errorTZQsFNaNbNiNeAyamZv'
collect2: error: ld returned 1 exit status
Error: linker exited with status 1
If you replace writeln(json) with writeln(json.toString) it works.
If you comment writeln, it works.
If you comment httpClient.setAuthentication, it works.
Comment #1 by maxhaton — 2022-06-23T19:28:25Z
What happens with dmd -run rather than dmd?
Comment #2 by kdevel — 2022-06-24T13:52:04Z
$ dmd k.d
k.o: In function `_D4core8internal7switch___T14__switch_errorZQrFNaNbNiNfAyamZv':
k.d:(.text._D4core8internal7switch___T14__switch_errorZQrFNaNbNiNfAyamZv[_D4core8internal7switch___T14__switch_errorZQrFNaNbNiNfAyamZv]+0x19): undefined reference to `_D4core9exception__T15__switch_errorTZQsFNaNbNiNeAyamZv'
collect2: error: ld returned 1 exit status
Error: linker exited with status 1
$ dmd -allinst -run k.d
{}
[for the record: binutils < 2.26 raises unrecognized relocation (0x2a) in section `.text', https://stackoverflow.com/questions/52737698]
Comment #3 by luis — 2022-09-21T08:47:31Z
I also ran into this issue. The scenario is a bit different, I'm using LDC2 on macOS and I'm linking D code with C code. The linker driver is clang++. The same D code compiled with dub/ldc2 didn't seem to cause issues, but various D libraries are involved so it's hard to tell for sure without reducing it, which I haven't done yet. I also have two linker errors, instead of one. For now, I'm working around it with:
C code:
void _D4core9exception__T15__switch_errorTZQsFNaNbNiNeAyamZv(void) {
assert(0);
}
void _D3std4math10operations__T17extractBitpatternTfZQwFNaNbNiNexfZSQCjQCiQCg__T23FloatingPointBitpatternTfZQBc(void) {
assert(0);
}
I.e. trapping implementations for the missing:
pure nothrow @nogc @trusted void core.exception.__switch_errorT!().__switch_errorT(immutable(char)[], long);
pure nothrow @nogc @trusted std.math.operations.FloatingPointBitpattern!(float).FloatingPointBitpattern std.math.operations.extractBitpattern!(float).extractBitpattern(const(float))
Comment #4 by Bastiaan — 2024-01-08T10:22:29Z
Further reduced:
```d
void main()
{
import std.net.curl, std.stdio;
auto http = HTTP();
http.setAuthentication("", "");
writeln(1.0);
}
```
The missing symbol is `pure nothrow @nogc @trusted void core.exception.__switch_errorT!().__switch_errorT(immutable(char)[], ulong)`.
Comment #5 by Bastiaan — 2024-01-08T10:50:24Z
Workaround: use the `-allinst` option.
Comment #6 by ibuclaw — 2024-02-20T13:23:59Z
Marking this as a duplicate.
*** This issue has been marked as a duplicate of issue 20802 ***