<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1252">
</head>
<body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">
Hi David,
<div><br>
</div>
<div>Thanks for the answers! The whole reason I'm trying to use this warning is to detect possible RTTI problems with shared libraries (see <a href="http://gcc.gnu.org/faq.html#dso" style="font-family: Arial, sans-serif; font-size: 13px; ">http://gcc.gnu.org/faq.html#dso</a><span style="font-family: Arial, sans-serif; font-size: 13px; ">).</span></div>
<div><br>
<div>
<div>On Aug 30, 2012, at 6:00 PM, David Blaikie <<a href="mailto:dblaikie@gmail.com">dblaikie@gmail.com</a>></div>
<div> wrote:</div>
<br class="Apple-interchange-newline">
<blockquote type="cite">On Thu, Aug 30, 2012 at 8:50 AM, Somorjai, Akos<br>
<<a href="mailto:ASomorjai@graphisoft.com">ASomorjai@graphisoft.com</a>> wrote:<br>
<blockquote type="cite">Hi all,<br>
<br>
I'm currently experimenting with clang 3.1 (from Xcode 4.4 package on OS X<br>
10.7), and I turned on the warning mentioned above. Most of the time it<br>
gives the correct warning, but in some situations I'd need some<br>
clarification:<br>
<br>
classes defined in .cpp files — is the compiler warns me because<br>
theoretically I can add this .cpp file into two separate modules/frameworks?<br>
</blockquote>
<br>
If the class is defined in an anonymous namespace then I believe we<br>
can probably avoid emitting this as weak. (and/or just avoid the<br>
warning at least - what it's meant to warn about (unnecessary overhead<br>
of emitting the same vtable into multiple TUs & the link-time overhead<br>
of having to deduplicate them all) isn't relevant when it's guaranteed<br>
to be only in one TU)<br>
</blockquote>
So, your suggestion is to have an anonymous namespace around these classes? I'll give it a try.</div>
<div><br>
<blockquote type="cite"><br>
<blockquote type="cite">pure virtual interface classes — is the warning necessary here?<br>
</blockquote>
<br>
Technically, yes (ish) - even pure virtual interface classes have to<br>
have vtables (ABI requirement - there's well defined (failure)<br>
behavior if you  call a pure virtual function). It might be debatable<br>
as to what solution users should employ in this situation & whether or<br>
not it's worthwhile/actionable to provide this warning - for those<br>
willing to use this warning at all, I guess it might be worthwhile.<br>
</blockquote>
OK. So in this case I'll have to fall back to add a default implementation in a source file, and add that source file to the module/shared library. Which kind of kills the whole pure virtual interface stuff...<br>
<blockquote type="cite"><br>
<blockquote type="cite">classes which are not exported from a module, so marked with<br>
__attribute__((hidden))?<br>
</blockquote>
<br>
I'm not especially familiar with the visibility attributes, sorry. But<br>
if I understand you correctly when you say 'module' you mean exporting<br>
from, say, a shared library or executable? Yes, the warning is still<br>
relevant there - the 'weakness' of the vtable symbol is only an issue<br>
for compile/link time performance, it should have no effect on runtime<br>
as far as I understand it.<br>
</blockquote>
We use several modules (shared libraries, frameworks).</div>
<div>The hidden attributes marks a class invisible for the executable or other modules, and the compiler knows about this, as it is a language feature. So it can also be a compile time issue.</div>
<div><br>
<blockquote type="cite"><br>
<blockquote type="cite">Also, classes whose parent class is exported from a<br>
module, but the derived class is not? — is the warning necessary here?<br>
</blockquote>
<br>
I don't believe derived classes enter into the rationale for this warning.<br>
<br>
(that being said - this warning exists for a fairly specific use case<br>
& may not be something you need. (even LLVM has a style requirement<br>
for this but isn't anywhere near clean enough to turn the warning on<br>
in its builds))<br>
<br>
- David<br>
</blockquote>
</div>
<br>
</div>
</body>
</html>