--- Comment #3 from Martin Sebor <msebor at gcc dot> ---
This is another one of those cases where implementations diverge:

Clang and ICC silently accept the program in comment #0 and give an error for
the one in comment #1.
GCC issues -Wattributes for both.
MSVC silently accepts the program in comment #1 but gives a warning when the
alignment specified on the specialization is different than on the primary.

MSVC doesn't understand visibility attributes but it does accept __declspec
dllexport and dllimport.  It allows the example in comment #0 with __declspec
(dllimport) and also with the primary declared dllexport and the instantiation
declared dllimport.  That makes sense because both declarations would typically
appear this way in a library header and an explicit instantiation directive
declared dllexport in some source file of the library.  The C++ constraint that
"no attribute-specifier-seq shall appertain to an explicit instantiation"
disallows this use case (one of the main uses cases in Windows class template

GCC for i686-pc-cygwin also issues a warning for this modified test case and so
is incompatible with MSVC:

$ cat pr81764.C && i686-pc-cygwin-g++ -S -Wall pr81764.C
template<typename ...> class g;

template<typename ...T>
class __declspec (dllexport) g
    g() = default;

    static int f(int x)
        return g<>::yyy::u(x); // g<> instantiated here

    struct yyy
        static int u(int x){
            return x+ sizeof...(T);

extern template class __declspec (dllimport) g<>; 
template class  g<>;
pr81764.C:22:46: warning: type attributes ignored after type is already defined
 extern template class __declspec (dllimport) g<>;

Reply via email to