1// RUN:  %clang_cc1 -std=c++14 -fconcepts-ts -fcxx-exceptions -x c++ -verify %s
2
3namespace A {
4  template<typename T> concept bool C1() { return true; }
5
6  template<typename T> concept bool C2 = true;
7}
8
9template<typename T> concept bool C3() { return (throw 0, true); }
10static_assert(noexcept(C3<int>()), "function concept should be treated as if noexcept(true) specified");
11
12template<typename T> concept bool D1(); // expected-error {{function concept declaration must be a definition}}
13
14struct B {
15  template<typename T> concept bool D2() { return true; } // expected-error {{concept declarations may only appear in namespace scope}}
16};
17
18struct C {
19  template<typename T> static concept bool D3 = true; // expected-error {{concept declarations may only appear in namespace scope}}
20};
21
22concept bool D4() { return true; } // expected-error {{'concept' can only appear on the definition of a function template or variable template}}
23
24concept bool D5 = true; // expected-error {{'concept' can only appear on the definition of a function template or variable template}}
25
26template<typename T>
27concept bool D6; // expected-error {{variable concept declaration must be initialized}}
28
29template<typename T>
30concept bool D7() throw(int) { return true; } // expected-error {{function concept cannot have exception specification}}
31
32// Tag
33concept class CC1 {}; // expected-error {{'concept' can only appear on the definition of a function template or variable template}}
34concept struct CS1 {}; // expected-error {{'concept' can only appear on the definition of a function template or variable template}}
35concept union CU1 {}; // expected-error {{'concept' can only appear on the definition of a function template or variable template}}
36concept enum CE1 {}; // expected-error {{'concept' can only appear on the definition of a function template or variable template}}
37template <typename T> concept class TCC1 {}; // expected-error {{'concept' can only appear on the definition of a function template or variable template}}
38template <typename T> concept struct TCS1 {}; // expected-error {{'concept' can only appear on the definition of a function template or variable template}}
39template <typename T> concept union TCU1 {}; // expected-error {{'concept' can only appear on the definition of a function template or variable template}}
40typedef concept int CI; // expected-error {{'concept' can only appear on the definition of a function template or variable template}}
41void fpc(concept int i) {} // expected-error {{'concept' can only appear on the definition of a function template or variable template}}
42
43concept bool; // expected-error {{'concept' can only appear on the definition of a function template or variable template}}
44