libatomic: Handle AVX+CX16 ZHAOXIN like Intel for 16b atomic [PR104688]
[official-gcc.git] / gcc / testsuite / g++.dg / abi / mangle-concepts1.C
blobcb3396b663a09a27a896d33407beea39699b1700
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_" } }
24 void f4(C auto c) {}
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" } }
44 template <class T>
45 requires requires { T();
46                     typename Ref<T>;
47                     requires C<T>;
48                     { +T() } noexcept -> C;
50 void g() {}
51 template void g<int>();
53 // { dg-final { scan-assembler "_Z1hIiQrQT__Xpsfp_EEvv" } }
54 template <class T>
55 requires requires (T t) { +t; }
56 void h() {}
57 template void h<int>();
59 // { dg-final { scan-assembler "_Z3fn1IiEvT_QrQS0__XpsfL0p_Xpsfp_E" } }
60 template <class T>
61 void fn1(T t1)
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> {}
83   };
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>();