xref: /llvm-project/clang/test/CXX/temp/temp.constr/temp.constr.decl/class-template-decl.cpp (revision 0330fba6e16db9b5d2079313646f93485c5ccf39)
1 // RUN: %clang_cc1 -std=c++2a -x c++ -verify %s
2 
3 namespace nodiag {
4 
5 template <typename T> requires bool(T())
6 struct A;
7 template <typename U> requires bool(U())
8 struct A;
9 
10 } // end namespace nodiag
11 
12 namespace diag {
13 
14 template <typename T> requires true // expected-note{{previous template declaration is here}}
15 struct A;
16 template <typename T> struct A; // expected-error{{requires clause differs in template redeclaration}}
17 
18 template <typename T> struct B; // expected-note{{previous template declaration is here}}
19 template <typename T> requires true // expected-error{{requires clause differs in template redeclaration}}
20 struct B;
21 
22 template <typename T> requires true // expected-note{{previous template declaration is here}}
23 struct C;
24 template <typename T> requires !0 // expected-error{{requires clause differs in template redeclaration}}
25 struct C;
26 
27 } // end namespace diag
28 
29 namespace nodiag {
30 
31 struct AA {
32   template <typename T> requires someFunc(T())
33   struct A;
34 };
35 
36 template <typename U> requires someFunc(U())
37 struct AA::A { };
38 
39 struct AAF {
40   template <typename T> requires someFunc(T())
41   friend struct AA::A;
42 };
43 
44 } // end namespace nodiag
45 
46 namespace diag {
47 
48 template <unsigned N>
49 struct TA {
50   template <template <unsigned> class TT> requires TT<N>::happy // expected-note {{previous template declaration is here}}
51   struct A;
52 
53   template <template <unsigned> class TT> requires TT<N>::happy // expected-note {{previous template declaration is here}}
54   struct B;
55 
56   struct AF;
57 };
58 
59 template <unsigned N>
60 template <template <unsigned> class TT> struct TA<N>::A { }; // expected-error{{requires clause differs in template redeclaration}}
61 
62 
63 template <unsigned N>
64 template <template <unsigned> class TT> requires TT<N + 1>::happy struct TA<N>::B { }; // expected-error{{requires clause differs in template redeclaration}}
65 
66 template <unsigned N>
67 struct TA<N>::AF {
68   // we do not expect a diagnostic here because the template parameter list is dependent.
69   template <template <unsigned> class TT> requires TT<N + 0>::happy
70   friend struct TA::A;
71 };
72 
73 } // end namespace diag
74