Why is mangling different for separate compilation?

Joakim via Digitalmars-d digitalmars-d at puremagic.com
Fri Feb 26 22:34:19 PST 2016


On Friday, 26 February 2016 at 12:45:35 UTC, Atila Neves wrote:
> foo.d:
> -----
> void main() {
>     import bar;
>     foreach(ut; __traits(getUnitTests, bar)) ut();
> }
> -----
>
> bar.d:
> -----
> unittest { assert(1 == 2); }
> -----
>
>
> # compile all at once
> dmd -unittest foo.d bar.d # fine
>
>
> # compile separately
> dmd -c -unittest foo.d
> dmd -c -unittest bar.d
> dmd foo.o bar.o
> foo.o:foo.d:function _Dmain: error: undefined reference to 
> '_D3bar16__unittestL2_531FZv'
> collect2: error: ld returned 1 exit status
> --- errorlevel 1
>
>
> objdump shows me that bar.o has a '_D3bar14__unittestL2_1FZv' 
> symbol, which is nearly, but not quite, what foo.o is trying to 
> call.
>
> Huh?

As Walter notes, it's because the mangling changes based on 
whether you separately compile the unit tests.  It's why you 
needed to generate the main D source file for unit-threaded too, 
becuase __traits(getUnitTests) gets confused by this same issue 
if the modules containing tests are separately compiled:

https://github.com/atilaneves/unit-threaded/blob/master/source/unit_threaded/runtime.d#L175


More information about the Digitalmars-d mailing list