On Wed, Jun 28, 2006 at 10:24:27PM -0400, Geoffrey Keating wrote:
> Suppose a library template has (my syntax may not be quite right):
>
> template struct foo <class T> __attribute__((visibility("default"))) {
> static T my_var;
> T inc (T x) { return my_var += x; }
> };
>
> The intention is that all foo<T>s share the same my_var. Obviously
> this won't work right if a #pragma on the instantiation overrides the
> visibility.
Right, but it doesn't feel right to me to protect the user from himself.
In this case, the user might say "it hurts when I do that" and we can
reply "then don't do that!"
There might be another case where changing the visibility is exactly
what the user needs to do to solve a problem.
> Right; and I'm not saying that there should be no way to achieve
> this, it's just that people are often unsure or unknowing of what
> pragmas might be in effect, so it might be better if they had to
> explicitly use an attribute. Certainly if someone says
>
> template <> foo<myclass> __attribute__((visibility("hidden")));
>
> then they ought to get what they asked for.
Agreed. We shouldn't try to outsmart the user; it makes sense to
use the most specific information we are given (so an attribute
on a specialization would override an attribute on the template).