1 // { dg-do compile { target c++20 } }
2 // { dg-additional-options -fabi-compat-version=0 }
4 template <class T> concept C = true;
5 template <class T, class U> concept C2 = true;
6 template <class T> concept D = true;
7 template <class T> concept E = true;
8 template <class T> concept F = true;
9 template <class T> using Ref = T&;
11 // { dg-final { scan-assembler "_Z1fIiQ1CIT_EEvv" } }
12 template <class T> requires C<T> void f() {}
13 template void f<int>();
15 // { dg-final { scan-assembler "_Z2f2ITk1CiEvv" } }
16 template <C T> void f2() {}
17 template void f2<int>();
19 // { dg-final { scan-assembler "_Z2f3IiEvvQ1CIT_E" } }
20 template <class T> void f3() requires C<T> {}
21 template void f3<int>();
23 // { dg-final { scan-assembler "_Z2f4ITk1CiEvT_" } }
25 template void f4(int);
27 // ??? The constraints end up out of order in the mangled name, may
28 // need to change the equivalence rule.
29 // { dg-final { scan-assembler "_Z2f5ITk1CicTk1EfTk1FsQ1DIT0_EEvT1_T2_" } }
30 template <C T, class U> requires D<U> void f5(E auto c, F auto f) {}
31 template void f5<int,char>(float,short);
33 // { dg-final { scan-assembler "_Z2f6ITk2C2IiEsEvv" } }
34 template <C2<int> T> void f6() {}
35 template void f6<short>();
37 // { dg-final { scan-assembler "_ZN1AIiE1fEvQ1CIT_E" } }
38 template <class T> struct A {
39 void f() requires C<T> { };
41 template struct A<int>;
43 // { dg-final { scan-assembler "_Z1gIiQrqXcvT__ETRS0_Q1CIS0_EXpscvS0__ENR1CEEvv" } }
45 requires requires { T();
48 { +T() } noexcept -> C;
51 template void g<int>();
53 // { dg-final { scan-assembler "_Z1hIiQrQT__Xpsfp_EEvv" } }
55 requires requires (T t) { +t; }
57 template void h<int>();
59 // { dg-final { scan-assembler "_Z3fn1IiEvT_QrQS0__XpsfL0p_Xpsfp_E" } }
62 requires requires (T t2) { +t1; +t2; }
64 template void fn1<int>(int);
66 // { dg-final { scan-assembler "_Z3fn3IiTk2C2IDtfL0p_EEiEvT_T0_" } }
67 template<typename T> void fn3(T t, C2<decltype(t)> auto) {}
68 template void fn3(int, int);
70 // { dg-final { scan-assembler "_Z3fn4IiiEvT_T0_Q2C2IS1_FDTcl3fn3fL0p_fp_EES0_EE" } }
71 template<typename T, typename U> void fn4(T t, U u)
72 requires C2<U, auto (T u) -> decltype(fn3(t, u))> {}
73 template void fn4(int, int);
75 // { dg-final { scan-assembler "_Z3fn5ITpTk1CJicfEEvDpT_" } }
76 template<C... T> void fn5(T...) { }
77 template void fn5(int,char,float);
79 // { dg-final { scan-assembler "_ZN2A2IiE1BIiE1fIiiEEvvQ2C2IT_TL1_0_E" } }
80 template <class T> struct A2 {
81 template <class X> struct B {
82 template <class U, class V> void f() requires C2<T,V> {}
85 template void A2<int>::B<int>::f<int,int>();
87 template<C auto N> void f7() {}
88 // { dg-final { scan-assembler "_Z2f7ITnDk1CLi5EEvv" } }
89 template void f7<5>();