xref: /llvm-project/clang/test/CodeGenCXX/mangle-requires.cpp (revision 940850066290a484144db80f09e6c19709f5fe49)
1*94085006SRichard Smith // RUN: %clang_cc1 -verify -std=c++2a -fclang-abi-compat=latest -emit-llvm -triple %itanium_abi_triple -o - %s | FileCheck %s
24b163e34SRichard Smith // expected-no-diagnostics
34b163e34SRichard Smith 
44b163e34SRichard Smith template <typename T, int N> concept SmallerThan = sizeof(T) < N;
54b163e34SRichard Smith template <typename T> concept Small = SmallerThan<T, 1000>;
64b163e34SRichard Smith 
74b163e34SRichard Smith template <typename T> struct X { using type = T; };
84b163e34SRichard Smith 
f(int n)94b163e34SRichard Smith template <typename T> void f(int n) requires requires {
104b163e34SRichard Smith   // simple-requirement
114b163e34SRichard Smith   T();
124b163e34SRichard Smith   n;
134b163e34SRichard Smith   n == T();
144b163e34SRichard Smith   // compound-requirement
154b163e34SRichard Smith   {T() + 1} -> Small;
164b163e34SRichard Smith   {T() - 1} noexcept;
174b163e34SRichard Smith   {T() * 2} noexcept -> SmallerThan<1234>;
184b163e34SRichard Smith   // type-requirement
194b163e34SRichard Smith   typename T;
204b163e34SRichard Smith   typename X<T>;
214b163e34SRichard Smith   typename X<T>::type;
224b163e34SRichard Smith   typename X<decltype(n)>;
234b163e34SRichard Smith   // nested-requirement
244b163e34SRichard Smith   requires SmallerThan<T, 256>;
254b163e34SRichard Smith } {}
264b163e34SRichard Smith // CHECK: define {{.*}}@_Z1fIiEviQrqXcvT__EXfp_Xeqfp_cvS0__EXplcvS0__ELi1ER5SmallXmicvS0__ELi1ENXmlcvS0__ELi2ENR11SmallerThanILi1234EETS0_T1XIS0_ETNS3_4typeETS2_IiEQ11SmallerThanIS0_Li256EEE(
274b163e34SRichard Smith template void f<int>(int);
284b163e34SRichard Smith 
g(int n)294b163e34SRichard Smith template <typename T> void g(int n) requires requires (T m) {
304b163e34SRichard Smith   // reference to our parameter vs an enclosing parameter
314b163e34SRichard Smith   n + m;
324b163e34SRichard Smith } {}
334b163e34SRichard Smith // CHECK: define {{.*}}@_Z1gIiEviQrQT__XplfL0p_fp_E(
344b163e34SRichard Smith template void g<int>(int);
35