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.
What happens with dmd -run rather than dmd?
$ 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]
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))
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)`.
Workaround: use the `-allinst` option.
Marking this as a duplicate. *** This issue has been marked as a duplicate of issue 20802 ***