http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55347



             Bug #: 55347

           Summary: Specialized member of class template prevents

                    visibility setting

    Classification: Unclassified

           Product: gcc

           Version: 4.8.0

            Status: UNCONFIRMED

          Severity: normal

          Priority: P3

         Component: c++

        AssignedTo: unassig...@gcc.gnu.org

        ReportedBy: l...@mit.edu





Compiling this code:



--- cut here ---

template<typename T>

class A

{

  void func() {}

};



//#pragma GCC visibility push(default) -- no effect



template<> void A<int>::func() {}  // This causes a problem

template class __attribute__((visibility("default"))) A<int>;



//#pragma GCC visibility pop

--- cut here ---



results in:



template_visibility.cc:10:55: warning: type attributes ignored after type is

already defined [-Wattributes]



The emitted code ends up hidden.



This is a minor issue in C++98 (I'm not sure why you'd want to do this), but

it's an actual problem in C++11: extern templates behave the same way.



I think that gcc's behavior is consistent, but there should be a way to

override the visibility of a particular class template specialization *without

instantiating/defining it*, then specialize a member, then instantiate the

template.

Reply via email to