<html>
    <head>
      <base href="http://llvm.org/bugs/" />
    </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 --- - explicit instantiation with dll attribute of class template with different dll attribute triggers assert"
   href="http://llvm.org/bugs/show_bug.cgi?id=20137">20137</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>explicit instantiation with dll attribute of class template with different dll attribute triggers assert
          </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>Windows NT
          </td>
        </tr>

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

        <tr>
          <th>Severity</th>
          <td>normal
          </td>
        </tr>

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

        <tr>
          <th>Component</th>
          <td>-New Bugs
          </td>
        </tr>

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

        <tr>
          <th>Reporter</th>
          <td>hans@chromium.org
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>llvmbugs@cs.uiuc.edu
          </td>
        </tr>

        <tr>
          <th>Classification</th>
          <td>Unclassified
          </td>
        </tr></table>
      <p>
        <div>
        <pre>Consider the following code:

  template <typename T> struct __declspec(dllimport) S { T f() { return T(); }
};
  template struct __declspec(dllexport) S<int>;

I think there are two problems here:

We inherit the DLL attribute to the template members once the template
declaration is complete. So S::f gets marked dllimport too early. We might want
to delay running checkDLLAttributes() until instantiation.

When we instantiate S, we merge the dll attributes from the pattern (dllimport)
and the instantiation (dllexport), and end up with S<int> having both
attributes, causing the assert. I think that if the instantiation has an
attribute, that should take precedence.</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>