Bug 18870 – Link failure only with -allinst for code in isExpression

Status
RESOLVED
Resolution
WONTFIX
Severity
normal
Priority
P1
Component
dmd
Product
D
Version
D2
Platform
x86_64
OS
Linux
Creation time
2018-05-18T00:14:55Z
Last change time
2022-07-18T14:25:56Z
Keywords
link-failure
Assigned to
No Owner
Creator
Simon Arneaud

Comments

Comment #0 by sarn — 2018-05-18T00:14:55Z
Hi, I'm using version 2.080. Here's a reduced version of some code I had a problem with: import std.datetime.date; import std.stdio; void main() { writef("%s", TimeOfDay()); } It compiles and runs fine for me with no flags to dmd, but here's what happens with -allinst: $ dmd -allinst broken.d broken.o: In function `_D3std5range10primitives__T5doPutTSQBh6format__T11hasToStringTSQCj8datetime4date9TimeOfDayTaZ9__lambda2MFZ1STaZQDgFNaNbNiNfKQDmKaZv': broken.d:(.text._D3std5range10primitives__T5doPutTSQBh6format__T11hasToStringTSQCj8datetime4date9TimeOfDayTaZ9__lambda2MFZ1STaZQDgFNaNbNiNfKQDmKaZv[_D3std5range10primitives__T5doPutTSQBh6format__T11hasToStringTSQCj8datetime4date9TimeOfDayTaZ9__lambda2MFZ1STaZQDgFNaNbNiNfKQDmKaZv]+0x14): undefined reference to `_D3std6format__T11hasToStringTSQBd8datetime4date9TimeOfDayTaZ9__lambda2MFZ1S3putMFNaNbNiNfaZv' broken.o: In function `_D3std5range10primitives__T5doPutTSQBh6format__T11hasToStringTSQCj8datetime4date9TimeOfDayTaZ9__lambda2MFZ1STaZQDgFNaNbNiNfKQDmaZv': broken.d:(.text._D3std5range10primitives__T5doPutTSQBh6format__T11hasToStringTSQCj8datetime4date9TimeOfDayTaZ9__lambda2MFZ1STaZQDgFNaNbNiNfKQDmaZv[_D3std5range10primitives__T5doPutTSQBh6format__T11hasToStringTSQCj8datetime4date9TimeOfDayTaZ9__lambda2MFZ1STaZQDgFNaNbNiNfKQDmaZv]+0x14): undefined reference to `_D3std6format__T11hasToStringTSQBd8datetime4date9TimeOfDayTaZ9__lambda2MFZ1S3putMFNaNbNiNfaZv' broken.o: In function `_D3std5range10primitives__T5doPutTSQBh6format__T11hasToStringTSQCj8datetime4date9TimeOfDayTaZ9__lambda2MFZ1STxaZQDhFNaNbNiNfKQDnKxaZv': broken.d:(.text._D3std5range10primitives__T5doPutTSQBh6format__T11hasToStringTSQCj8datetime4date9TimeOfDayTaZ9__lambda2MFZ1STxaZQDhFNaNbNiNfKQDnKxaZv[_D3std5range10primitives__T5doPutTSQBh6format__T11hasToStringTSQCj8datetime4date9TimeOfDayTaZ9__lambda2MFZ1STxaZQDhFNaNbNiNfKQDnKxaZv]+0x14): undefined reference to `_D3std6format__T11hasToStringTSQBd8datetime4date9TimeOfDayTaZ9__lambda2MFZ1S3putMFNaNbNiNfaZv' collect2: error: ld returned 1 exit status Error: linker exited with status 1 The missing symbol demangles to this: pure nothrow @nogc @safe void std.format.hasToString!(const(std.datetime.date.TimeOfDay), char).__lambda2().S.put(char) (That __lambda2 is from an isExpression, so it makes sense for it to be missing from the object file.)
Comment #1 by ag0aep6g — 2018-05-18T22:45:25Z
Reduced: ---- void put(R)(R r) { r.put(); } enum hasToString = is(typeof({ static struct S { void put() {} } enum e = is(typeof(put(S.init))); })); static assert(hasToString); void main() {} ----
Comment #2 by sarn — 2018-06-03T23:48:05Z
Because the isExpression code isn't being used at runtime, I've been working around the problem with hacks like this. (Not pretty, but at least it stops the bug from being a blocker.) pragma(mangle, "_D3std6format__T11hasToStringTSQBd8datetime4date9TimeOfDayTaZ9__lambda2MFZ1S3putMFNaNbNiNfaZv") void bug18870kludge1(char c) { import logger = std.experimental.logger; logger.fatal("https://issues.dlang.org/show_bug.cgi?id=18870"); }
Comment #3 by stanislav.blinov — 2021-12-08T23:45:44Z
Both the original and reduced examples seem to link successfully when compiled with dmd 2.098 (with -allinst). Please add any relevant tests and close.