[Issue 13394] invariant fail to link since 2.066 when using separate compilation

via Digitalmars-d-bugs digitalmars-d-bugs at puremagic.com
Thu Aug 28 21:30:38 PDT 2014


https://issues.dlang.org/show_bug.cgi?id=13394

--- Comment #2 from deadalnix <deadalnix at gmail.com> ---
(In reply to Kenji Hara from comment #1)
> Introduced in: https://github.com/D-Programming-Language/dmd/pull/3775
> 
> ====
> 
> When a.d is compiled, compiler instantiates Btpl!A and outputs its invariant
> objcode to a.obj.
> 
> Next b.d is compiled, the `new B` expression instantiates the Btpl!A
> template constructor. It implicitly calls the invariant in post-condition,
> bug Btpl!A is explicitly instantiated in the non-root module (== a module
> which not directly compiled from command line) a. So compiler assumes that
> the Btpl!A.invariant objcode will be provided in linking phase and skips its
> codegen.
> 
> However, currently dmd always adds the inferred function attributes into the
> symbol name of instantiated functions. Therefore, dmd a.d will emit the
> objcode of Btpl!A.invariant with the symbol name:
>   _D1a15__T4BtplTC1a1AZ4Btpl11__invariantMxFNaNbNiNfZv
> 
> But dmd b.d does not invoke semantic3 of Btpl!A.invariant. Then b.obj refer
> the invariant by using the symbol name:
>   _D1a15__T4BtplTC1a1AZ4Btpl11__invariantMxFZv
>   <-- does not contain the inferred attributes NaNbNiNf
> 
> Then link-failure happens.

That is interesting. Do you know why the import alter the behavior of DMD ?

--


More information about the Digitalmars-d-bugs mailing list