// { dg-do compile { target c++20 } } // { dg-additional-options -fabi-compat-version=0 } template concept C = true; template concept C2 = true; template concept D = true; template concept E = true; template concept F = true; template using Ref = T&; // { dg-final { scan-assembler "_Z1fIiQ1CIT_EEvv" } } template requires C void f() {} template void f(); // { dg-final { scan-assembler "_Z2f2ITk1CiEvv" } } template void f2() {} template void f2(); // { dg-final { scan-assembler "_Z2f3IiEvvQ1CIT_E" } } template void f3() requires C {} template void f3(); // { dg-final { scan-assembler "_Z2f4ITk1CiEvT_" } } void f4(C auto c) {} template void f4(int); // ??? The constraints end up out of order in the mangled name, may // need to change the equivalence rule. // { dg-final { scan-assembler "_Z2f5ITk1CicTk1EfTk1FsQ1DIT0_EEvT1_T2_" } } template requires D void f5(E auto c, F auto f) {} template void f5(float,short); // { dg-final { scan-assembler "_Z2f6ITk2C2IiEsEvv" } } template T> void f6() {} template void f6(); // { dg-final { scan-assembler "_ZN1AIiE1fEvQ1CIT_E" } } template struct A { void f() requires C { }; }; template struct A; // { dg-final { scan-assembler "_Z1gIiQrqXcvT__ETRS0_Q1CIS0_EXpscvS0__ENR1CEEvv" } } template requires requires { T(); typename Ref; requires C; { +T() } noexcept -> C; } void g() {} template void g(); // { dg-final { scan-assembler "_Z1hIiQrQT__Xpsfp_EEvv" } } template requires requires (T t) { +t; } void h() {} template void h(); // { dg-final { scan-assembler "_Z3fn1IiEvT_QrQS0__XpsfL0p_Xpsfp_E" } } template void fn1(T t1) requires requires (T t2) { +t1; +t2; } {} template void fn1(int); // { dg-final { scan-assembler "_Z3fn3IiTk2C2IDtfL0p_EEiEvT_T0_" } } template void fn3(T t, C2 auto) {} template void fn3(int, int); // { dg-final { scan-assembler "_Z3fn4IiiEvT_T0_Q2C2IS1_FDTcl3fn3fL0p_fp_EES0_EE" } } template void fn4(T t, U u) requires C2 decltype(fn3(t, u))> {} template void fn4(int, int); // { dg-final { scan-assembler "_Z3fn5ITpTk1CJicfEEvDpT_" } } template void fn5(T...) { } template void fn5(int,char,float); // { dg-final { scan-assembler "_ZN2A2IiE1BIiE1fIiiEEvvQ2C2IT_TL1_0_E" } } template struct A2 { template struct B { template void f() requires C2 {} }; }; template void A2::B::f(); template void f7() {} // { dg-final { scan-assembler "_Z2f7ITnDk1CLi5EEvv" } } template void f7<5>();