https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71154

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |RESOLVED
         Resolution|---                         |INVALID

--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
(In reply to James Abbatiello from comment #1)
> Created attachment 38502 [details]
> Too simple patch

This patch is wrong as you are modifying more than just about visibility
attribute.

> Trying to apply attributes (like visibility("default")) to an
> explicit template instantiation does not work if the type has
> been previously mentioned in the translation unit.

This is correct GCC behavior.  Because it has to apply to the first time the
type is used.

Here is why:
I it applies after declaration, then some other types need to be changed too. 
The ones which use that type.
For an example:
template <typename T>
class C
{
    void foo();
};

class D
{
  C<int> a;
};

template class __attribute__((visibility("hidden"))) C<int>;

---- CUT -----
If attributes applies at the end, then D gets hidden visibility and you need to
redo that type.  So this is the reason why attributes can't apply after they
have been declared.

Reply via email to