<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 --- - wrong linkage for function template instantiated with type with internal or no linkage"
   href="http://llvm.org/bugs/show_bug.cgi?id=15930">15930</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>wrong linkage for function template instantiated with type with internal or no linkage
          </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>Linux
          </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>C++11
          </td>
        </tr>

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

        <tr>
          <th>Reporter</th>
          <td>richard-llvm@metafoo.co.uk
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>dgregor@apple.com, llvmbugs@cs.uiuc.edu
          </td>
        </tr>

        <tr>
          <th>Classification</th>
          <td>Unclassified
          </td>
        </tr></table>
      <p>
        <div>
        <pre>When a function template is instantiated with a type that has internal or no
linkage, we incorrectly give that function internal linkage. For instance:

  template<typename T> void *f(T) { static int n; return &n; }
  inline void *g() { struct S {} s; return f(s); }

Suppose this code appears in two translation units. The 'struct S' inside 'g'
is required to be treated as the same type in both translation units, even
though it has no linkage (by [basic.def.odr]p6, we are required to act as if
there were only one definition of 'g' in the program). So the two
instantiations of f<S> must produce the same function, and must share a static
local 'n'.

Clang incorrectly emits f<S> and f<S>::n as internal symbols for this code.</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>