Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

GCC/Clang disagree on constrained partial template specialization with out-of-line member definition [duplicate]

The following code attempts to partially specialize a class using a concept and add a method to the specialization, but it is rejected by clang 11.0.0:

#include <concepts>

template <typename T> // note: previous template declaration is here
struct S {};

template <std::integral T>
struct S<T>
{
    void f();
};

template <std::integral T> // error: type constraint differs in template redeclaration
void S<T>::f()
{
}

clang gives the error message:

<source>:14:16: error: type constraint differs in template redeclaration
template <std::integral T>
               ^
<source>:3:11: note: previous template declaration is here
template <typename T>

(see https://godbolt.org/z/Wv1ojK). Why is this code wrong? Or is this a bug in clang? (FWIW, this code is accepted by gcc trunk and by MSVC 19.28, although that's no guarantee of correctness.)

like image 474
Nathan Reed Avatar asked Nov 15 '22 03:11

Nathan Reed


1 Answers

This is definitely a CLANG bug. It is already filed - #48020.

like image 155
NutCracker Avatar answered Dec 06 '22 16:12

NutCracker