<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 --- - hidden or not?"
   href="http://llvm.org/bugs/show_bug.cgi?id=16187">16187</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>hidden or not?
          </td>
        </tr>

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

        <tr>
          <th>Version</th>
          <td>unspecified
          </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>normal
          </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>rafael.espindola@gmail.com
          </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>Given

template <typename T>
struct __attribute__((visibility("default"))) bar {
  static void zed() {}
};
class foo;
template struct bar<foo>;
class __attribute__((visibility("default"))) foo;
template struct bar<foo*>;

we produce a hidden _ZN3barI3fooE3zedEv and a default _ZN3barIP3fooE3zedEv,
meaning that foo is both hidden and default at different points in the file :-(

In addition to the fuzzy semantics, this has the disadvantage of being really
expensive since we cannot cache visibilities if we want to get this result.

gcc seems to do all the linkage computation at the end and produces two default
symbols. Implementing this in clang would be fairly hard since we construct
llvm as we go.

if we are careful to not compute the visibility before it is needed and record
the location when it is first computed, we should be able to 'cache' the
visibility again and produce an error when an attribute is added to a decl
whose visibility was already used (like in the example above).</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>