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

            Bug ID: 101338
           Summary: Redeclaration of template members in subclass fails
           Product: gcc
           Version: 11.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: josipp at live dot de
  Target Milestone: ---
              Host: macOS 11.4
            Target: x86-64
             Build: Homebrew GCC 11.1.0_1

Using g++ -std=c++20 -Wall -Wextra in every example, this one compiles.
-------------------
struct B
{
    template <int, int> struct Inner;
    template <int i> struct Inner<0, i> {};

    template <int, int> struct Inner;
    template <int i> struct Inner<1, i> {};
}
-------------------
As does this.
-------------------
struct A
{
    template <int, int> struct Inner;
    template <int i> struct Inner<0, i> {}; // Instantiates A::Inner
}

struct B: A
{
    template <int, int> struct Inner; // OK, shadows declaration in A
    template <int i> struct Inner<0, i> {}; // Instantiates B::Inner
}
-------------------
But this one does not, complaining about redeclaration of 'template<int
<anonymous>, int <anonymous> > struct B::Inner':
-------------------
struct A
{
    template <int, int> struct Inner;
    template <int i> struct Inner<0, i> {};
}

struct B: A
{
    template <int, int> struct Inner; // OK, shadows declaration in A
    template <int i> struct Inner<0, i> {};

    template <int, int> struct Inner; // Fail, redeclaration.
}
-------------------
The last example is inconsistent with the first, where the two declarations
happily live side by side together.

Reply via email to