| // RUN: %clang_cc1 -std=c++14 -fconcepts-ts -x c++ %s -verify |
| // expected-no-diagnostics |
| |
| // Test parsing of the optional requires-clause in a template-declaration. |
| |
| template <typename T> requires true |
| void foo() { } |
| |
| |
| template <typename T> requires !0 |
| struct A { |
| void foo(); |
| struct AA; |
| enum E : int; |
| static int x; |
| |
| template <typename> requires true |
| void Mfoo(); |
| |
| template <typename> requires true |
| struct M; |
| |
| template <typename> requires true |
| static int Mx; |
| |
| template <typename TT> requires true |
| using MQ = M<TT>; |
| }; |
| |
| template <typename T> requires !0 |
| void A<T>::foo() { } |
| |
| template <typename T> requires !0 |
| struct A<T>::AA { }; |
| |
| template <typename T> requires !0 |
| enum A<T>::E : int { E0 }; |
| |
| template <typename T> requires !0 |
| int A<T>::x = 0; |
| |
| template <typename T> requires !0 |
| template <typename> requires true |
| void A<T>::Mfoo() { } |
| |
| template <typename T> requires !0 |
| template <typename> requires true |
| struct A<T>::M { }; |
| |
| template <typename T> requires !0 |
| template <typename> requires true |
| int A<T>::Mx = 0; |
| |
| |
| template <typename T> requires true |
| int x = 0; |
| |
| template <typename T> requires true |
| using Q = A<T>; |
| |
| struct C { |
| template <typename> requires true |
| void Mfoo(); |
| |
| template <typename> requires true |
| struct M; |
| |
| template <typename> requires true |
| static int Mx; |
| |
| template <typename T> requires true |
| using MQ = M<T>; |
| }; |
| |
| template <typename> requires true |
| void C::Mfoo() { } |
| |
| template <typename> requires true |
| struct C::M { }; |
| |
| template <typename> requires true |
| int C::Mx = 0; |