<html>
    <head>
      <base href="http://bugzilla.gdcproject.org/">
    </head>
    <body><span class="vcard"><a class="email" href="mailto:johannespfau@gmail.com" title="Johannes Pfau <johannespfau@gmail.com>"> <span class="fn">Johannes Pfau</span></a>
</span> changed
          <a class="bz_bug_link 
          bz_status_ASSIGNED "
   title="ASSIGNED - unittests not linked unless module is imported"
   href="http://bugzilla.gdcproject.org/show_bug.cgi?id=199">bug 199</a>
          <br>
             <table border="1" cellspacing="0" cellpadding="8">
          <tr>
            <th>What</th>
            <th>Removed</th>
            <th>Added</th>
          </tr>

         <tr>
           <td style="text-align:right;">Status</td>
           <td>NEW
           </td>
           <td>ASSIGNED
           </td>
         </tr>

         <tr>
           <td style="text-align:right;">CC</td>
           <td>
                
           </td>
           <td>johannespfau@gmail.com
           </td>
         </tr></table>
      <p>
        <div>
            <b><a class="bz_bug_link 
          bz_status_ASSIGNED "
   title="ASSIGNED - unittests not linked unless module is imported"
   href="http://bugzilla.gdcproject.org/show_bug.cgi?id=199#c1">Comment # 1</a>
              on <a class="bz_bug_link 
          bz_status_ASSIGNED "
   title="ASSIGNED - unittests not linked unless module is imported"
   href="http://bugzilla.gdcproject.org/show_bug.cgi?id=199">bug 199</a>
              from <span class="vcard"><a class="email" href="mailto:johannespfau@gmail.com" title="Johannes Pfau <johannespfau@gmail.com>"> <span class="fn">Johannes Pfau</span></a>
</span></b>
        <pre>I think we can't fix this. Does this work with DMD or LDC?

The problem is this: We already build the ModuleInfo chain by emitting one c
constructor per module. This means all unittests are referenced by ModuleInfos
which are referenced by c constructors which are always kept in the executable
by linker scripts. This enures that, as long as you link all objects
explicitly, all unittests will be linked in, even without explicitly importing
modules.

However, this does not work for code in static libraries because c constructors
in static libraries do not work:
<a href="http://stackoverflow.com/questions/1202494/why-doesnt-attribute-constructor-work-in-a-static-library">http://stackoverflow.com/questions/1202494/why-doesnt-attribute-constructor-work-in-a-static-library</a>

The linker only looks at object files in static libraries if it searches an
undefined symbol. If all symbols are defined, it does not search the object
files.

Now you want this to work without imports in your main application. But how
could gdc know, when compiling the main applications which additional modules
might exists in a static library? If we know module X exists we can add an
reference to force the linker. But in your case we explicitly do not know about
additional modules so we can't add a reference.

You can use the same workarounds C++ uses though:
<a href="http://stackoverflow.com/a/4767951/471401">http://stackoverflow.com/a/4767951/471401</a>
Use it with GDC like this:
gdc -funittest main.d -Wl,--whole-archive libtest.a -Wl,--no-whole-archive</pre>
        </div>
      </p>


      <hr>
      <span>You are receiving this mail because:</span>

      <ul>
          <li>You are watching all bug changes.</li>
      </ul>
    </body>
</html>