cxx-concepts-requires-clause.cpp 1.5 KB

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