xref: /llvm-project/clang/test/CXX/temp/temp.constr/temp.constr.decl/class-template-decl.cpp (revision b65b1f322bd88513586a4539d2b5f18aeb698f3f)
10330fba6SSaar Raz // RUN: %clang_cc1 -std=c++2a -x c++ -verify %s
25d98ba60SSaar Raz 
35d98ba60SSaar Raz namespace nodiag {
45d98ba60SSaar Raz 
5*b65b1f32SSaar Raz template <typename T> requires (bool(T()))
65d98ba60SSaar Raz struct A;
7*b65b1f32SSaar Raz template <typename U> requires (bool(U()))
85d98ba60SSaar Raz struct A;
95d98ba60SSaar Raz 
105d98ba60SSaar Raz } // end namespace nodiag
115d98ba60SSaar Raz 
125d98ba60SSaar Raz namespace diag {
135d98ba60SSaar Raz 
145d98ba60SSaar Raz template <typename T> requires true // expected-note{{previous template declaration is here}}
155d98ba60SSaar Raz struct A;
160330fba6SSaar Raz template <typename T> struct A; // expected-error{{requires clause differs in template redeclaration}}
175d98ba60SSaar Raz 
185d98ba60SSaar Raz template <typename T> struct B; // expected-note{{previous template declaration is here}}
190330fba6SSaar Raz template <typename T> requires true // expected-error{{requires clause differs in template redeclaration}}
205d98ba60SSaar Raz struct B;
215d98ba60SSaar Raz 
225d98ba60SSaar Raz template <typename T> requires true // expected-note{{previous template declaration is here}}
235d98ba60SSaar Raz struct C;
24*b65b1f32SSaar Raz template <typename T> requires (!0) // expected-error{{requires clause differs in template redeclaration}}
255d98ba60SSaar Raz struct C;
265d98ba60SSaar Raz 
275d98ba60SSaar Raz } // end namespace diag
285d98ba60SSaar Raz 
295d98ba60SSaar Raz namespace nodiag {
305d98ba60SSaar Raz 
315d98ba60SSaar Raz struct AA {
32*b65b1f32SSaar Raz   template <typename T> requires (someFunc(T()))
335d98ba60SSaar Raz   struct A;
345d98ba60SSaar Raz };
355d98ba60SSaar Raz 
36*b65b1f32SSaar Raz template <typename U> requires (someFunc(U()))
375d98ba60SSaar Raz struct AA::A { };
385d98ba60SSaar Raz 
395d98ba60SSaar Raz struct AAF {
40*b65b1f32SSaar Raz   template <typename T> requires (someFunc(T()))
415d98ba60SSaar Raz   friend struct AA::A;
425d98ba60SSaar Raz };
435d98ba60SSaar Raz 
445d98ba60SSaar Raz } // end namespace nodiag
455d98ba60SSaar Raz 
465d98ba60SSaar Raz namespace diag {
475d98ba60SSaar Raz 
485d98ba60SSaar Raz template <unsigned N>
495d98ba60SSaar Raz struct TA {
500330fba6SSaar Raz   template <template <unsigned> class TT> requires TT<N>::happy // expected-note {{previous template declaration is here}}
515d98ba60SSaar Raz   struct A;
525d98ba60SSaar Raz 
530330fba6SSaar Raz   template <template <unsigned> class TT> requires TT<N>::happy // expected-note {{previous template declaration is here}}
540330fba6SSaar Raz   struct B;
550330fba6SSaar Raz 
565d98ba60SSaar Raz   struct AF;
575d98ba60SSaar Raz };
585d98ba60SSaar Raz 
595d98ba60SSaar Raz template <unsigned N>
600330fba6SSaar Raz template <template <unsigned> class TT> struct TA<N>::A { }; // expected-error{{requires clause differs in template redeclaration}}
610330fba6SSaar Raz 
620330fba6SSaar Raz 
630330fba6SSaar Raz template <unsigned N>
640330fba6SSaar Raz template <template <unsigned> class TT> requires TT<N + 1>::happy struct TA<N>::B { }; // expected-error{{requires clause differs in template redeclaration}}
655d98ba60SSaar Raz 
665d98ba60SSaar Raz template <unsigned N>
675d98ba60SSaar Raz struct TA<N>::AF {
680330fba6SSaar Raz   // we do not expect a diagnostic here because the template parameter list is dependent.
690330fba6SSaar Raz   template <template <unsigned> class TT> requires TT<N + 0>::happy
705d98ba60SSaar Raz   friend struct TA::A;
715d98ba60SSaar Raz };
725d98ba60SSaar Raz 
735d98ba60SSaar Raz } // end namespace diag
74