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

            Bug ID: 93914
           Summary: invalid definition of explicit specialization accepted
                    with just a warning
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: msebor at gcc dot gnu.org
  Target Milestone: ---

The invalid definition of the explicit specialization of A below is accepted
with just a warning.  It should be rejected not just because it's malformed
(and the meaning is unclear) but also because (assuming it defines an explicit
specialization) the template specialization has already been instantiated by
defining the variable a (same as in the case of B).

$ cat z.C && gcc -O2  -S -Wall z.C
template <class> struct A { };
A<int> a;
template <> struct A<int> A { };   // invalid

template <class> struct B { };
B<int> b;
template <> struct B<int> { };

z.C:3:27: warning: too many template headers for ‘A’ (should be 0)
    3 | template <> struct A<int> A { };   // invalid
      |                           ^
z.C:7:20: error: specialization of ‘B<int>’ after instantiation
    7 | template <> struct B<int> { };
      |                    ^~~~~~
z.C:7:20: error: redefinition of ‘struct B<int>’
z.C:5:25: note: previous definition of ‘struct B<int>’
    5 | template <class> struct B { };
      |                         ^

Reply via email to