Home | History | Annotate | Download | only in dcl.spec.concept
      1 // RUN:  %clang_cc1 -std=c++14 -fconcepts-ts -fcxx-exceptions -x c++ -verify %s
      2 
      3 namespace A {
      4   template<typename T> concept bool C1() { return true; }
      5 
      6   template<typename T> concept bool C2 = true;
      7 }
      8 
      9 template<typename T> concept bool C3() { return (throw 0, true); }
     10 static_assert(noexcept(C3<int>()), "function concept should be treated as if noexcept(true) specified");
     11 
     12 template<typename T> concept bool D1(); // expected-error {{function concept declaration must be a definition}}
     13 
     14 struct B {
     15   template<typename T> concept bool D2() { return true; } // expected-error {{concept declarations may only appear in namespace scope}}
     16 };
     17 
     18 struct C {
     19   template<typename T> static concept bool D3 = true; // expected-error {{concept declarations may only appear in namespace scope}}
     20 };
     21 
     22 concept bool D4() { return true; } // expected-error {{'concept' can only appear on the definition of a function template or variable template}}
     23 
     24 concept bool D5 = true; // expected-error {{'concept' can only appear on the definition of a function template or variable template}}
     25 
     26 template<typename T>
     27 concept bool D6; // expected-error {{variable concept declaration must be initialized}}
     28 
     29 template<typename T>
     30 concept bool D7() throw(int) { return true; } // expected-error {{function concept cannot have exception specification}}
     31 
     32 // Tag
     33 concept class CC1 {}; // expected-error {{'concept' can only appear on the definition of a function template or variable template}}
     34 concept struct CS1 {}; // expected-error {{'concept' can only appear on the definition of a function template or variable template}}
     35 concept union CU1 {}; // expected-error {{'concept' can only appear on the definition of a function template or variable template}}
     36 concept enum CE1 {}; // expected-error {{'concept' can only appear on the definition of a function template or variable template}}
     37 template <typename T> concept class TCC1 {}; // expected-error {{'concept' can only appear on the definition of a function template or variable template}}
     38 template <typename T> concept struct TCS1 {}; // expected-error {{'concept' can only appear on the definition of a function template or variable template}}
     39 template <typename T> concept union TCU1 {}; // expected-error {{'concept' can only appear on the definition of a function template or variable template}}
     40 typedef concept int CI; // expected-error {{'concept' can only appear on the definition of a function template or variable template}}
     41 void fpc(concept int i) {} // expected-error {{'concept' can only appear on the definition of a function template or variable template}}
     42 
     43 concept bool; // expected-error {{'concept' can only appear on the definition of a function template or variable template}}
     44 
     45 template <typename T> concept bool VCEI{ true };
     46 template concept bool VCEI<int>; // expected-error {{'concept' cannot be applied on an explicit instantiation}}
     47 extern template concept bool VCEI<int>; // expected-error {{'concept' cannot be applied on an explicit instantiation}}
     48 
     49 template <typename T> concept bool VCPS{ true };
     50 template <typename T> concept bool VCPS<T *>{ true }; // expected-error {{'concept' cannot be applied on an partial specialization}}
     51 
     52 template <typename T> concept bool VCES{ true };
     53 template <> concept bool VCES<int>{ true }; // expected-error {{'concept' cannot be applied on an explicit specialization}}
     54 
     55 template <typename T> concept bool FCEI() { return true; }
     56 template concept bool FCEI<int>(); // expected-error {{'concept' cannot be applied on an explicit instantiation}}
     57 extern template concept bool FCEI<int>(); // expected-error {{'concept' cannot be applied on an explicit instantiation}}
     58 
     59 template <typename T> concept bool FCES() { return true; }
     60 template <> concept bool FCES<bool>() { return true; } // expected-error {{'concept' cannot be applied on an explicit specialization}}
     61