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

            Bug ID: 119343
           Summary: No SFINAE for deleted explicit specializations
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: herring at lanl dot gov
  Target Milestone: ---

GCC trunk produces a hard error instead of SFINAE for the explicit
specialization in the example below <https://godbolt.org/z/4ovcrhbnG>.  f is
included for comparison; every compiler (except perhaps NVC++) does something
different here, but I don't see any reason why SFINAE wouldn't apply in both
cases.

#include<type_traits>

struct X {
  static void f()=delete;
  template<int> static void g();
};
template<> void X::g<0>()=delete;
struct Y {
  static void f();
  template<int> static void g();
};

template<class T,class=void>
struct has_f : std::false_type {};
template<class T>
struct has_f<T,decltype(void(T::f))> : std::true_type {};

static_assert(!has_f<X>::value);
static_assert(has_f<Y>::value);

template<class T,class=void>
struct has_g0 : std::false_type {};
template<class T>
struct has_g0<T,decltype(void(T::template g<0>))> : std::true_type {};

static_assert(!has_g0<X>::value);
static_assert(has_g0<Y>::value);

Reply via email to