1*67e74705SXin Li // RUN: %clang_cc1 -std=c++14 -fconcepts-ts -x c++ %s -verify 2*67e74705SXin Li // expected-no-diagnostics 3*67e74705SXin Li 4*67e74705SXin Li // Test parsing of the optional requires-clause in a template-declaration. 5*67e74705SXin Li 6*67e74705SXin Li template <typename T> requires true foo()7*67e74705SXin Livoid foo() { } 8*67e74705SXin Li 9*67e74705SXin Li 10*67e74705SXin Li template <typename T> requires !0 11*67e74705SXin Li struct A { 12*67e74705SXin Li void foo(); 13*67e74705SXin Li struct AA; 14*67e74705SXin Li enum E : int; 15*67e74705SXin Li static int x; 16*67e74705SXin Li 17*67e74705SXin Li template <typename> requires true 18*67e74705SXin Li void Mfoo(); 19*67e74705SXin Li 20*67e74705SXin Li template <typename> requires true 21*67e74705SXin Li struct M; 22*67e74705SXin Li 23*67e74705SXin Li template <typename> requires true 24*67e74705SXin Li static int Mx; 25*67e74705SXin Li 26*67e74705SXin Li template <typename TT> requires true 27*67e74705SXin Li using MQ = M<TT>; 28*67e74705SXin Li }; 29*67e74705SXin Li 30*67e74705SXin Li template <typename T> requires !0 31*67e74705SXin Li void A<T>::foo() { } 32*67e74705SXin Li 33*67e74705SXin Li template <typename T> requires !0 34*67e74705SXin Li struct A<T>::AA { }; 35*67e74705SXin Li 36*67e74705SXin Li template <typename T> requires !0 37*67e74705SXin Li enum A<T>::E : int { E0 }; 38*67e74705SXin Li 39*67e74705SXin Li template <typename T> requires !0 40*67e74705SXin Li int A<T>::x = 0; 41*67e74705SXin Li 42*67e74705SXin Li template <typename T> requires !0 43*67e74705SXin Li template <typename> requires true 44*67e74705SXin Li void A<T>::Mfoo() { } 45*67e74705SXin Li 46*67e74705SXin Li template <typename T> requires !0 47*67e74705SXin Li template <typename> requires true 48*67e74705SXin Li struct A<T>::M { }; 49*67e74705SXin Li 50*67e74705SXin Li template <typename T> requires !0 51*67e74705SXin Li template <typename> requires true 52*67e74705SXin Li int A<T>::Mx = 0; 53*67e74705SXin Li 54*67e74705SXin Li 55*67e74705SXin Li template <typename T> requires true 56*67e74705SXin Li int x = 0; 57*67e74705SXin Li 58*67e74705SXin Li template <typename T> requires true 59*67e74705SXin Li using Q = A<T>; 60*67e74705SXin Li 61*67e74705SXin Li struct C { 62*67e74705SXin Li template <typename> requires true 63*67e74705SXin Li void Mfoo(); 64*67e74705SXin Li 65*67e74705SXin Li template <typename> requires true 66*67e74705SXin Li struct M; 67*67e74705SXin Li 68*67e74705SXin Li template <typename> requires true 69*67e74705SXin Li static int Mx; 70*67e74705SXin Li 71*67e74705SXin Li template <typename T> requires true 72*67e74705SXin Li using MQ = M<T>; 73*67e74705SXin Li }; 74*67e74705SXin Li 75*67e74705SXin Li template <typename> requires true Mfoo()76*67e74705SXin Livoid C::Mfoo() { } 77*67e74705SXin Li 78*67e74705SXin Li template <typename> requires true 79*67e74705SXin Li struct C::M { }; 80*67e74705SXin Li 81*67e74705SXin Li template <typename> requires true 82*67e74705SXin Li int C::Mx = 0; 83