https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61718
Bug ID: 61718 Summary: Visibility issue with template class Product: gcc Version: 4.8.3 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: goughost at yahoo dot com.cn With this code snippet:: #pragma GCC visibility push(hidden) #define YYY_VIS ??? #define XXX_VIS ??? class YYY_VIS YYY; template <typename T> class XXX_VIS XXX { void func() { return; } }; template class XXX<YYY *>; Compiling with different definitions of XXX_VIS and YYY_VIS, results in the following table:: XXX_VIS YYY_VIS func visibility when compiled default default visible default <nothing> hidden <nothing> default hidden <nothing> <nothing> hidden Here, ``default`` is short for ``__attribute__((visibility("default")))``, and ``<nothing>`` means empty macro. What is the rational behind the 2nd row in the table? My expection is that ``func`` is visible when ``XXX`` is declared visible, no matter what YYY is.