// RUN: %clang_cc1 -std=c++20 -verify %s template concept D = true; template struct A { // expected-note {{defined here}} template void f() requires V; template<> void f(); template void g(); template requires V struct B; // expected-note@-2 {{previous template declaration is here}} template requires V struct B; template<> struct B; template struct C; // expected-note@-2 {{previous template declaration is here}} template struct C; template requires V static int x; // expected-note@-2 {{previous template declaration is here}} template requires V static int x; template<> int x; template static int y; // expected-note@-2 {{previous template declaration is here}} template static int y; }; template template void A::f() requires V { } template template void A::g() { } template template requires V struct A::B { }; template template requires V struct A::B { }; template template requires V struct A::B { }; template template struct A::C { }; template template struct A::C { }; template template requires V int A::x = 0; template template requires V int A::x = 0; template template requires V int A::x = 0; template template int A::y = 0; template template int A::y = 0; // FIXME: This should be accepted. template<> template void A::f() requires V; // expected-error@-1 {{out-of-line declaration of 'f' does not match any declaration in 'A'}} template<> template<> void A::f(); template<> template<> void A::f(); template<> template void A::g(); // FIXME: This should be accepted. template<> template requires V struct A::B; // expected-error@-2 {{requires clause differs in template redeclaration}} template<> template<> struct A::B; template<> template<> struct A::B; template<> template requires V struct A::B; template<> template requires V struct A::B; // FIXME: This should be accepted. template<> template struct A::C; // expected-error@-2 {{type constraint differs in template redeclaration}} template<> template struct A::C; template<> template struct A::C; // FIXME: This should be accepted. template<> template requires V int A::x; // expected-error@-2 {{requires clause differs in template redeclaration}} template<> template<> int A::x; template<> template<> int A::x; template<> template requires V int A::x; template<> template requires V int A::x; // FIXME: This should be accepted. template<> template int A::y; // expected-error@-2 {{type constraint differs in template redeclaration}} template<> template int A::y; template<> template int A::y;