[Dlang-internal] Separate compilation identifier mess and the bug trail that ensued

Atila Neves atila.neves at gmail.com
Wed Jul 4 22:15:36 UTC 2018


Once upon a time, one could not use __traits(getUnitTests) and 
separate compilation, and it begat 
https://issues.dlang.org/show_bug.cgi?id=16995. The problem was 
that there was a counter being used to name unittests, and it 
varied between running the compiler on all files at once (or in 
groups) versus compiling files separately.

Due to a suggestion in the PR, I emulated what was done for 
naming lambdas and delayed naming the unittest until semantic 
analysis. This begat 
https://issues.dlang.org/show_bug.cgi?id=18097 since now one 
could not longer take the address of a unittest function. Well, 
one could but it wouldn't link because it'd be the wrong name by 
the time semantic was done with it.

I went back and undid the semantic setting of the identifier and 
used the file name in the unittest name instead. That begat 
https://issues.dlang.org/show_bug.cgi?id=18111. The name of the 
file isn't the absolute path, and so depending on how the 
compiler is invoked, one still gets linker errors.

I realised the stupidity of my ways - D already mangles according 
to module, and those names are always the same no matter how one 
compiles. I went back to a simpler time, but without the counter, 
relying on line/column numbers instead. That begat 
https://issues.dlang.org/show_bug.cgi?id=18880. Using `static 
foreach` or mixing in unittests with strings meant that the 
different unittests shared line and column numbers. Oops.

In trying to fix https://issues.dlang.org/show_bug.cgi?id=18868 
Johan got a comment about the bug mentioned above and added a fix 
for that as well. Which breaks __traits(getUnitTests) and 
separate compilation, since it uses a counter to disambiguate 
between identical identifiers. But counters can't and won't work, 
because identifiers don't have fully qualified names until 
semantic, and when they're created they might have the exact same 
identifier as a symbol in a different module. Those don't need to 
be disambiguated of course, but there's no way for the compiler 
to know ahead of time. Chaos ensues.

I've been racking my brain thinking about to solve this. I can't 
use file names or rely on the module name (after the symbol has a 
module attached to it), since that has caused bugs in the past 
and would again. The file name doesn't work unless I somehow 
always get the absolute path. Using the module information means 
that at different points of compilation symbols change names.

Does anyone have a good idea of a way out?


More information about the Dlang-internal mailing list