1*67c608a9SSaar Raz // RUN: %clang_cc1 -std=c++2a -x c++ -verify %s 25d98ba60SSaar Raz 35d98ba60SSaar Raz namespace nodiag { 45d98ba60SSaar Raz 5b65b1f32SSaar Raz template <typename T> requires (bool(T())) 65d98ba60SSaar Raz struct A; 7b65b1f32SSaar Raz template <typename U> requires (bool(U())) 85d98ba60SSaar Raz struct A; 95d98ba60SSaar Raz 10ff1e0fceSSaar Raz template<typename T> 11ff1e0fceSSaar Raz concept C1 = true; 12ff1e0fceSSaar Raz 13ff1e0fceSSaar Raz template <C1 T> requires (bool(T())) 14ff1e0fceSSaar Raz struct B; 15ff1e0fceSSaar Raz template <C1 U> requires (bool(U())) 16ff1e0fceSSaar Raz struct B; 17ff1e0fceSSaar Raz 185d98ba60SSaar Raz } // end namespace nodiag 195d98ba60SSaar Raz 205d98ba60SSaar Raz namespace diag { 215d98ba60SSaar Raz 225d98ba60SSaar Raz template <typename T> requires true // expected-note{{previous template declaration is here}} 235d98ba60SSaar Raz struct A; 240330fba6SSaar Raz template <typename T> struct A; // expected-error{{requires clause differs in template redeclaration}} 255d98ba60SSaar Raz 265d98ba60SSaar Raz template <typename T> struct B; // expected-note{{previous template declaration is here}} 270330fba6SSaar Raz template <typename T> requires true // expected-error{{requires clause differs in template redeclaration}} 285d98ba60SSaar Raz struct B; 295d98ba60SSaar Raz 305d98ba60SSaar Raz template <typename T> requires true // expected-note{{previous template declaration is here}} 315d98ba60SSaar Raz struct C; 32b65b1f32SSaar Raz template <typename T> requires (!0) // expected-error{{requires clause differs in template redeclaration}} 335d98ba60SSaar Raz struct C; 345d98ba60SSaar Raz 35ff1e0fceSSaar Raz template<typename T> 36ff1e0fceSSaar Raz concept C1 = true; 37ff1e0fceSSaar Raz 38ff1e0fceSSaar Raz template <C1 T> // expected-note{{previous template declaration is here}} 39ff1e0fceSSaar Raz struct D; 40ff1e0fceSSaar Raz template <typename T> requires C1<T> // expected-error{{type constraint differs in template redeclaration}} 41ff1e0fceSSaar Raz struct D; 42ff1e0fceSSaar Raz 435d98ba60SSaar Raz } // end namespace diag 445d98ba60SSaar Raz 455d98ba60SSaar Raz namespace nodiag { 465d98ba60SSaar Raz 475d98ba60SSaar Raz struct AA { 48b65b1f32SSaar Raz template <typename T> requires (someFunc(T())) 495d98ba60SSaar Raz struct A; 505d98ba60SSaar Raz }; 515d98ba60SSaar Raz 52b65b1f32SSaar Raz template <typename U> requires (someFunc(U())) 535d98ba60SSaar Raz struct AA::A { }; 545d98ba60SSaar Raz 555d98ba60SSaar Raz struct AAF { 56b65b1f32SSaar Raz template <typename T> requires (someFunc(T())) 575d98ba60SSaar Raz friend struct AA::A; 585d98ba60SSaar Raz }; 595d98ba60SSaar Raz 605d98ba60SSaar Raz } // end namespace nodiag 615d98ba60SSaar Raz 625d98ba60SSaar Raz namespace diag { 635d98ba60SSaar Raz 645d98ba60SSaar Raz template <unsigned N> 655d98ba60SSaar Raz struct TA { 660330fba6SSaar Raz template <template <unsigned> class TT> requires TT<N>::happy // expected-note {{previous template declaration is here}} 675d98ba60SSaar Raz struct A; 685d98ba60SSaar Raz 690330fba6SSaar Raz template <template <unsigned> class TT> requires TT<N>::happy // expected-note {{previous template declaration is here}} 700330fba6SSaar Raz struct B; 710330fba6SSaar Raz 725d98ba60SSaar Raz struct AF; 735d98ba60SSaar Raz }; 745d98ba60SSaar Raz 755d98ba60SSaar Raz template <unsigned N> 760330fba6SSaar Raz template <template <unsigned> class TT> struct TA<N>::A { }; // expected-error{{requires clause differs in template redeclaration}} 770330fba6SSaar Raz 780330fba6SSaar Raz 790330fba6SSaar Raz template <unsigned N> 800330fba6SSaar Raz template <template <unsigned> class TT> requires TT<N + 1>::happy struct TA<N>::B { }; // expected-error{{requires clause differs in template redeclaration}} 815d98ba60SSaar Raz 825d98ba60SSaar Raz template <unsigned N> 835d98ba60SSaar Raz struct TA<N>::AF { 840330fba6SSaar Raz // we do not expect a diagnostic here because the template parameter list is dependent. 850330fba6SSaar Raz template <template <unsigned> class TT> requires TT<N + 0>::happy 865d98ba60SSaar Raz friend struct TA::A; 875d98ba60SSaar Raz }; 885d98ba60SSaar Raz 895d98ba60SSaar Raz } // end namespace diag 90