1*5d98ba60SSaar Raz // RUN: %clang_cc1 -std=c++14 -fconcepts-ts -x c++ -verify %s 2*5d98ba60SSaar Raz 3*5d98ba60SSaar Raz namespace nodiag { 4*5d98ba60SSaar Raz 5*5d98ba60SSaar Raz template <typename T> requires bool(T()) 6*5d98ba60SSaar Raz struct A; 7*5d98ba60SSaar Raz template <typename U> requires bool(U()) 8*5d98ba60SSaar Raz struct A; 9*5d98ba60SSaar Raz 10*5d98ba60SSaar Raz } // end namespace nodiag 11*5d98ba60SSaar Raz 12*5d98ba60SSaar Raz namespace diag { 13*5d98ba60SSaar Raz 14*5d98ba60SSaar Raz template <typename T> requires true // expected-note{{previous template declaration is here}} 15*5d98ba60SSaar Raz struct A; 16*5d98ba60SSaar Raz template <typename T> struct A; // expected-error{{associated constraints differ in template redeclaration}} 17*5d98ba60SSaar Raz 18*5d98ba60SSaar Raz template <typename T> struct B; // expected-note{{previous template declaration is here}} 19*5d98ba60SSaar Raz template <typename T> requires true // expected-error{{associated constraints differ in template redeclaration}} 20*5d98ba60SSaar Raz struct B; 21*5d98ba60SSaar Raz 22*5d98ba60SSaar Raz template <typename T> requires true // expected-note{{previous template declaration is here}} 23*5d98ba60SSaar Raz struct C; 24*5d98ba60SSaar Raz template <typename T> requires !0 // expected-error{{associated constraints differ in template redeclaration}} 25*5d98ba60SSaar Raz struct C; 26*5d98ba60SSaar Raz 27*5d98ba60SSaar Raz } // end namespace diag 28*5d98ba60SSaar Raz 29*5d98ba60SSaar Raz namespace nodiag { 30*5d98ba60SSaar Raz 31*5d98ba60SSaar Raz struct AA { 32*5d98ba60SSaar Raz template <typename T> requires someFunc(T()) 33*5d98ba60SSaar Raz struct A; 34*5d98ba60SSaar Raz }; 35*5d98ba60SSaar Raz 36*5d98ba60SSaar Raz template <typename T> requires someFunc(T()) 37*5d98ba60SSaar Raz struct AA::A { }; 38*5d98ba60SSaar Raz 39*5d98ba60SSaar Raz struct AAF { 40*5d98ba60SSaar Raz template <typename T> requires someFunc(T()) 41*5d98ba60SSaar Raz friend struct AA::A; 42*5d98ba60SSaar Raz }; 43*5d98ba60SSaar Raz 44*5d98ba60SSaar Raz } // end namespace nodiag 45*5d98ba60SSaar Raz 46*5d98ba60SSaar Raz namespace diag { 47*5d98ba60SSaar Raz 48*5d98ba60SSaar Raz template <unsigned N> 49*5d98ba60SSaar Raz struct TA { 50*5d98ba60SSaar Raz template <template <unsigned> class TT> requires TT<N>::happy // expected-note 2{{previous template declaration is here}} 51*5d98ba60SSaar Raz struct A; 52*5d98ba60SSaar Raz 53*5d98ba60SSaar Raz struct AF; 54*5d98ba60SSaar Raz }; 55*5d98ba60SSaar Raz 56*5d98ba60SSaar Raz template <unsigned N> 57*5d98ba60SSaar Raz template <template <unsigned> class TT> struct TA<N>::A { }; // expected-error{{associated constraints differ in template redeclaration}} 58*5d98ba60SSaar Raz 59*5d98ba60SSaar Raz template <unsigned N> 60*5d98ba60SSaar Raz struct TA<N>::AF { 61*5d98ba60SSaar Raz template <template <unsigned> class TT> requires TT<N + 0>::happy // expected-error{{associated constraints differ in template redeclaration}} 62*5d98ba60SSaar Raz friend struct TA::A; 63*5d98ba60SSaar Raz }; 64*5d98ba60SSaar Raz 65*5d98ba60SSaar Raz } // end namespace diag 66