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