<html>
    <head>
      <base href="https://bugs.llvm.org/">
    </head>
    <body><table border="1" cellspacing="0" cellpadding="8">
        <tr>
          <th>Bug ID</th>
          <td><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - Dllexport on template instantiations has no effect in MinGW mode"
   href="https://bugs.llvm.org/show_bug.cgi?id=40256">40256</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>Dllexport on template instantiations has no effect in MinGW mode
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>clang
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>trunk
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>PC
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>All
          </td>
        </tr>

        <tr>
          <th>Status</th>
          <td>NEW
          </td>
        </tr>

        <tr>
          <th>Severity</th>
          <td>enhancement
          </td>
        </tr>

        <tr>
          <th>Priority</th>
          <td>P
          </td>
        </tr>

        <tr>
          <th>Component</th>
          <td>C++
          </td>
        </tr>

        <tr>
          <th>Assignee</th>
          <td>unassignedclangbugs@nondot.org
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>martin@martin.st
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>blitzrakete@gmail.com, compnerd@compnerd.org, david.majnemer@gmail.com, dgregor@apple.com, erik.pilkington@gmail.com, llvm-bugs@lists.llvm.org, richard-llvm@metafoo.co.uk, rnk@google.com, smeenai@fb.com
          </td>
        </tr></table>
      <p>
        <div>
        <pre>The following code snippet instantiates a template and dllexports the generated
symbols, when built in MSVC mode:


template<class T> class MyClass {
public:
  MyClass(int a);

private:  
  T val;
};  

template<class T> MyClass<T>::MyClass(int a) {
  val = a;
}

extern template class MyClass<int>;

template class __declspec(dllexport) MyClass<int>;


When built in MinGW mode, it doesn't produce any export directives, but it
doesn't when built with GCC either, and GCC warns:

dllexport.cpp:15:38: warning: type attributes ignored after type is already
defined [-Wattributes]
 template class __declspec(dllexport) MyClass<int>;

GCC does, however, produce export directives if the dllexport attribute is on
the template instantiation declaration:

extern template class __declspec(dllexport) MyClass<int>;
template class MyClass<int>;

The same also works when specified on the original template declaration. Clang
in MinGW mode, however, doesn't take the dllexport attribute into account in
any of the variants, and never produces export directives for the template
instantiation.</pre>
        </div>
      </p>


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

      <ul>
          <li>You are on the CC list for the bug.</li>
      </ul>
    </body>
</html>