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 Smithtemplate <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 Smithtemplate <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