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

Jonathan Wakely <redi at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
          Component|libstdc++                   |c++

--- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> ---
This is nothing to do with libstdc++, the problem is that you've using int
rather than std::size_t

using size_t = decltype(sizeof(0));

template<typename T, size_t N>
  struct array 
  {
     T data[N];
  };

template<typename T, int N>
struct MyContainer 
{
   T data[N];
};

template <typename T>
struct B;

template <typename T>
T foo()
{
    return B<T>::bar();
}

template <typename T, int N>
struct B<array<T, N>>
{
  static array<T, N> bar()
  {
      return array<T, N>();
  }
};

template <typename T, int N>
struct B<MyContainer<T, N>>
{
  static MyContainer<T, N> bar()
  {
      return MyContainer<T, N>();
  }
};

int main()
{
    foo<array<float, 4>>(); // incomplete type
    foo<MyContainer<float, 4>>();
}


foo<array<float, 4>> returns B<array<float, (size_t)4>> which doesn't match
your partial specialization of B<array<float, (int)4>>

Clang accepts this, but G++ and EDG reject it for the same reason.

Reply via email to