<div class="gmail_extra"><div class="gmail_quote">On Wed, Apr 25, 2012 at 5:36 PM, Rafael Espíndola <span dir="ltr"><<a href="mailto:rafael.espindola@gmail.com" target="_blank">rafael.espindola@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div id=":9hu">The attached patch makes clang produce an error for cases like<br>
<br>
struct __attribute__((visibility("hidden"))) a;<br>
struct __attribute__((visibility("default"))) b;</div></blockquote></div><br></div><div class="gmail_extra">I assume you mean 'a' in that last line? ;] If so, yea, this looks fine.</div><div class="gmail_extra">
<br></div><div class="gmail_extra">However, regarding the patch:</div><div class="gmail_extra"><br></div><div class="gmail_extra"><div class="gmail_extra">--- a/lib/Sema/SemaDeclAttr.cpp</div><div class="gmail_extra">+++ b/lib/Sema/SemaDeclAttr.cpp</div>
<div class="gmail_extra">@@ -1752,6 +1752,18 @@ static void handleVisibilityAttr(Sema &S, Decl *D, const AttributeList &Attr) {</div><div class="gmail_extra">     return;</div><div class="gmail_extra">   }</div><div class="gmail_extra">
 </div><div class="gmail_extra">+  for (Decl::redecl_iterator I = D->redecls_begin(), E = D->redecls_end(); I != E; ++I) {</div><div class="gmail_extra">+    Decl *OldDecl = *I;</div><div class="gmail_extra">+    VisibilityAttr *OldAttr = OldDecl->getAttr<VisibilityAttr>();</div>
<div class="gmail_extra">+    if (!OldAttr)</div><div class="gmail_extra">+      continue;</div><div class="gmail_extra">+    VisibilityAttr::VisibilityType OldType = OldAttr->getVisibility();</div><div class="gmail_extra">
+    if (OldType != type) {</div><div class="gmail_extra">+      S.Diag(Attr.getLoc(), diag::err_mismatched_visibilit);</div><div class="gmail_extra">+      S.Diag(OldAttr->getLocation(), diag::note_previous_attribute);</div>
<div class="gmail_extra">+      return;</div><div class="gmail_extra">+    }</div><div class="gmail_extra">+  }</div><div><br></div><div>We shouldn't loop over redeclarations here. We should simply have to compare the current visibility with the visibility of the canonical definition, error if different, and discard.</div>
</div>