Geoffrey Keating wrote: > GCC's concept of visibility is very different to that of some other > compilers.
Yes, and that may be a problem. For some features, we want to have GNU semantics that are consistent that across platforms; for others, we want to match other compilers on a particular platform. To be clear, I don't have any objection to the semantics you stated, from the point of view of first principles of language design. But, they do not match existing practice on various systems -- and I consider that a serious problem. In particular, ARM SymbianOS is a system that has specifically defined DLL attributes in terms of ELF visibility. There's no choice about the semantics on that system, including the fact that the first "S" below is a valid class on that system. Fortunately, for: > In respect of this specific example, the compiler should not give any > effect to the attribute on 'f' in: > > struct __attribute__((visibility("hidden"))) S { > void f() __attribute__((visibility("default"))); > } > > because another shared library can define: > > struct __attribute__((visibility("default"))) S { > void f(); > } we can be generous. In particular, we can do what the user asks with the first "S", i.e., give "f" default visibility. There's no inherent problem there. We can then detect that there are two "S::f" when both shared libraries are loaded (if we think that's a useful check), or we can just call it undefined behavior, as it would be if there were no visibility markers in this example, but there were conflicting definitions of "S::f". We could of course issue a warning, or, I guess, an error. I see this as a style issue, so a warning seems better to me, but if Darwin wants to forbid giving member functions more visibility than their containing classes, that's not for me to say. -- Mark Mitchell CodeSourcery [EMAIL PROTECTED] (650) 331-3385 x713