class-template-decl.cpp 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. // RUN: %clang_cc1 -std=c++2a -x c++ -verify %s
  2. namespace nodiag {
  3. template <typename T> requires bool(T())
  4. struct A;
  5. template <typename U> requires bool(U())
  6. struct A;
  7. } // end namespace nodiag
  8. namespace diag {
  9. template <typename T> requires true // expected-note{{previous template declaration is here}}
  10. struct A;
  11. template <typename T> struct A; // expected-error{{requires clause differs in template redeclaration}}
  12. template <typename T> struct B; // expected-note{{previous template declaration is here}}
  13. template <typename T> requires true // expected-error{{requires clause differs in template redeclaration}}
  14. struct B;
  15. template <typename T> requires true // expected-note{{previous template declaration is here}}
  16. struct C;
  17. template <typename T> requires !0 // expected-error{{requires clause differs in template redeclaration}}
  18. struct C;
  19. } // end namespace diag
  20. namespace nodiag {
  21. struct AA {
  22. template <typename T> requires someFunc(T())
  23. struct A;
  24. };
  25. template <typename U> requires someFunc(U())
  26. struct AA::A { };
  27. struct AAF {
  28. template <typename T> requires someFunc(T())
  29. friend struct AA::A;
  30. };
  31. } // end namespace nodiag
  32. namespace diag {
  33. template <unsigned N>
  34. struct TA {
  35. template <template <unsigned> class TT> requires TT<N>::happy // expected-note {{previous template declaration is here}}
  36. struct A;
  37. template <template <unsigned> class TT> requires TT<N>::happy // expected-note {{previous template declaration is here}}
  38. struct B;
  39. struct AF;
  40. };
  41. template <unsigned N>
  42. template <template <unsigned> class TT> struct TA<N>::A { }; // expected-error{{requires clause differs in template redeclaration}}
  43. template <unsigned N>
  44. template <template <unsigned> class TT> requires TT<N + 1>::happy struct TA<N>::B { }; // expected-error{{requires clause differs in template redeclaration}}
  45. template <unsigned N>
  46. struct TA<N>::AF {
  47. // we do not expect a diagnostic here because the template parameter list is dependent.
  48. template <template <unsigned> class TT> requires TT<N + 0>::happy
  49. friend struct TA::A;
  50. };
  51. } // end namespace diag