brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.3 KiB · 506c5aa Raw
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