10330fba6SSaar Raz // RUN: %clang_cc1 -std=c++2a -x c++ -verify %s 25d98ba60SSaar Raz 35d98ba60SSaar Raz namespace nodiag { 45d98ba60SSaar Raz 5*b65b1f32SSaar Raz template <typename T> requires (bool(T())) 65d98ba60SSaar Raz struct A; 7*b65b1f32SSaar Raz template <typename U> requires (bool(U())) 85d98ba60SSaar Raz struct A; 95d98ba60SSaar Raz 105d98ba60SSaar Raz } // end namespace nodiag 115d98ba60SSaar Raz 125d98ba60SSaar Raz namespace diag { 135d98ba60SSaar Raz 145d98ba60SSaar Raz template <typename T> requires true // expected-note{{previous template declaration is here}} 155d98ba60SSaar Raz struct A; 160330fba6SSaar Raz template <typename T> struct A; // expected-error{{requires clause differs in template redeclaration}} 175d98ba60SSaar Raz 185d98ba60SSaar Raz template <typename T> struct B; // expected-note{{previous template declaration is here}} 190330fba6SSaar Raz template <typename T> requires true // expected-error{{requires clause differs in template redeclaration}} 205d98ba60SSaar Raz struct B; 215d98ba60SSaar Raz 225d98ba60SSaar Raz template <typename T> requires true // expected-note{{previous template declaration is here}} 235d98ba60SSaar Raz struct C; 24*b65b1f32SSaar Raz template <typename T> requires (!0) // expected-error{{requires clause differs in template redeclaration}} 255d98ba60SSaar Raz struct C; 265d98ba60SSaar Raz 275d98ba60SSaar Raz } // end namespace diag 285d98ba60SSaar Raz 295d98ba60SSaar Raz namespace nodiag { 305d98ba60SSaar Raz 315d98ba60SSaar Raz struct AA { 32*b65b1f32SSaar Raz template <typename T> requires (someFunc(T())) 335d98ba60SSaar Raz struct A; 345d98ba60SSaar Raz }; 355d98ba60SSaar Raz 36*b65b1f32SSaar Raz template <typename U> requires (someFunc(U())) 375d98ba60SSaar Raz struct AA::A { }; 385d98ba60SSaar Raz 395d98ba60SSaar Raz struct AAF { 40*b65b1f32SSaar Raz template <typename T> requires (someFunc(T())) 415d98ba60SSaar Raz friend struct AA::A; 425d98ba60SSaar Raz }; 435d98ba60SSaar Raz 445d98ba60SSaar Raz } // end namespace nodiag 455d98ba60SSaar Raz 465d98ba60SSaar Raz namespace diag { 475d98ba60SSaar Raz 485d98ba60SSaar Raz template <unsigned N> 495d98ba60SSaar Raz struct TA { 500330fba6SSaar Raz template <template <unsigned> class TT> requires TT<N>::happy // expected-note {{previous template declaration is here}} 515d98ba60SSaar Raz struct A; 525d98ba60SSaar Raz 530330fba6SSaar Raz template <template <unsigned> class TT> requires TT<N>::happy // expected-note {{previous template declaration is here}} 540330fba6SSaar Raz struct B; 550330fba6SSaar Raz 565d98ba60SSaar Raz struct AF; 575d98ba60SSaar Raz }; 585d98ba60SSaar Raz 595d98ba60SSaar Raz template <unsigned N> 600330fba6SSaar Raz template <template <unsigned> class TT> struct TA<N>::A { }; // expected-error{{requires clause differs in template redeclaration}} 610330fba6SSaar Raz 620330fba6SSaar Raz 630330fba6SSaar Raz template <unsigned N> 640330fba6SSaar Raz template <template <unsigned> class TT> requires TT<N + 1>::happy struct TA<N>::B { }; // expected-error{{requires clause differs in template redeclaration}} 655d98ba60SSaar Raz 665d98ba60SSaar Raz template <unsigned N> 675d98ba60SSaar Raz struct TA<N>::AF { 680330fba6SSaar Raz // we do not expect a diagnostic here because the template parameter list is dependent. 690330fba6SSaar Raz template <template <unsigned> class TT> requires TT<N + 0>::happy 705d98ba60SSaar Raz friend struct TA::A; 715d98ba60SSaar Raz }; 725d98ba60SSaar Raz 735d98ba60SSaar Raz } // end namespace diag 74