1*67e74705SXin Li 2*67e74705SXin Li // Support parsing of function concepts and variable concepts 3*67e74705SXin Li 4*67e74705SXin Li // RUN: %clang_cc1 -std=c++14 -fconcepts-ts -x c++ -verify %s 5*67e74705SXin Li 6*67e74705SXin Li template<typename T> concept bool C1 = true; 7*67e74705SXin Li C2()8*67e74705SXin Litemplate<typename T> concept bool C2() { return true; } 9*67e74705SXin Li 10*67e74705SXin Li template<typename T> 11*67e74705SXin Li struct A { typedef bool Boolean; }; 12*67e74705SXin Li 13*67e74705SXin Li template<int N> 14*67e74705SXin Li A<void>::Boolean concept C3(!0); 15*67e74705SXin Li 16*67e74705SXin Li template<typename T, int = 0> C4(void)17*67e74705SXin Liconcept auto C4(void) -> bool { return true; } 18*67e74705SXin Li 19*67e74705SXin Li constexpr int One = 1; 20*67e74705SXin Li 21*67e74705SXin Li template <typename> 22*67e74705SXin Li static concept decltype(!0) C5 { bool(One) }; 23*67e74705SXin Li 24*67e74705SXin Li template<typename T> concept concept bool C6 = true; // expected-warning {{duplicate 'concept' declaration specifier}} 25*67e74705SXin Li C7()26*67e74705SXin Litemplate<typename T> concept concept bool C7() { return true; } // expected-warning {{duplicate 'concept' declaration specifier}} 27*67e74705SXin Li 28*67e74705SXin Li template<concept T> concept bool D1 = true; // expected-error {{unknown type name 'T'}} 29