48 lines · cpp
1// RUN: %clang_cc1 -verify -std=c++2a -fclang-abi-compat=latest -emit-llvm -triple %itanium_abi_triple -o - %s | FileCheck %s2// expected-no-diagnostics3 4template <typename T, int N> concept SmallerThan = sizeof(T) < N;5template <typename T> concept Small = SmallerThan<T, 1000>;6 7template <typename T> struct X { using type = T; };8 9template <typename T> void f(int n) requires requires {10 // simple-requirement11 T();12 n;13 n == T();14 // compound-requirement15 {T() + 1} -> Small;16 {T() - 1} noexcept;17 {T() * 2} noexcept -> SmallerThan<1234>;18 // type-requirement19 typename T;20 typename X<T>;21 typename X<T>::type;22 typename X<decltype(n)>;23 // nested-requirement24 requires SmallerThan<T, 256>;25} {}26// CHECK: define {{.*}}@_Z1fIiEviQrqXcvT__EXfp_Xeqfp_cvS0__EXplcvS0__ELi1ER5SmallXmicvS0__ELi1ENXmlcvS0__ELi2ENR11SmallerThanILi1234EETS0_T1XIS0_ETNS3_4typeETS2_IiEQ11SmallerThanIS0_Li256EEE(27template void f<int>(int);28 29template <typename T> void g(int n) requires requires (T m) {30 // reference to our parameter vs an enclosing parameter31 n + m;32} {}33// CHECK: define {{.*}}@_Z1gIiEviQrQT__XplfL0p_fp_E(34template void g<int>(int);35 36 37namespace GH147650 {38 39template <int> int b;40template <int b>41void f()42 requires requires { [] { (void)b; }; } {}43void test() {44 f<42>();45}46// CHECK-LABEL:define {{.*}} void @"_ZN8GH1476501fILi42EEEvvQrqXLNS_3$_0EEE"()47}48