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

            Bug ID: 116981
           Summary: wrongly accepted non-more-specialized partial
                    specialization of class template member for an
                    instantiated enclosing template
           Product: gcc
           Version: 14.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: ing.russomauro at gmail dot com
  Target Milestone: ---

The following code is refused by clang 19.1 and msvc 19.40, but accepted by gcc
14.2

template<class T1> class A {
public:
        template<class T2> class B {
        public:
                void func();
        };
};

// template class A3<char>; regardless of the instantiation of A<char> is
explicit or implicit.

template<> template<class T2> struct A<char>::B<T2>{ void func2(); };


The point is that the last line is defining a partial specialization, which is
not more specialized compared to the primary template whose declaration is
instantiated for A<char> as from the primary template of A.

As additional detail, by trying to use A<char>::B<int>, gcc ignores that
specialization and prefers the primary template, being able to invoke func()
and not func2().

Reply via email to