brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.3 KiB · c3fc90e Raw
97 lines · cpp
1// RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++11 -emit-llvm -fblocks -o - %s | FileCheck %s2 3struct S {4  int a[4];5  S(int *, int * __attribute__((noescape)));6  S &operator=(int * __attribute__((noescape)));7  void m0(int *, int * __attribute__((noescape)));8  virtual void vm1(int *, int * __attribute__((noescape)));9};10 11// CHECK: define{{.*}} void @_ZN1SC2EPiS0_(ptr {{.*}}, {{.*}}, {{.*}} noundef captures(none) {{%.*}})12// CHECK: define{{.*}} void @_ZN1SC1EPiS0_(ptr {{.*}}, {{.*}}, {{.*}} noundef captures(none) {{%.*}}) {{.*}} {13// CHECK: call void @_ZN1SC2EPiS0_(ptr {{.*}}, {{.*}}, {{.*}} captures(none) {{.*}})14 15S::S(int *, int * __attribute__((noescape))) {}16 17// CHECK: define {{.*}} ptr @_ZN1SaSEPi(ptr {{.*}}, {{.*}} noundef captures(none) {{%.*}})18S &S::operator=(int * __attribute__((noescape))) { return *this; }19 20// CHECK: define{{.*}} void @_ZN1S2m0EPiS0_(ptr {{.*}}, {{.*}} noundef captures(none) {{%.*}})21void S::m0(int *, int * __attribute__((noescape))) {}22 23// CHECK: define{{.*}} void @_ZN1S3vm1EPiS0_(ptr {{.*}}, {{.*}} noundef captures(none) {{%.*}})24void S::vm1(int *, int * __attribute__((noescape))) {}25 26// CHECK-LABEL: define{{.*}} void @_Z5test0P1SPiS1_(27// CHECK: call void @_ZN1SC1EPiS0_(ptr {{.*}}, {{.*}}, {{.*}} noundef captures(none) {{.*}})28// CHECK: call {{.*}} ptr @_ZN1SaSEPi(ptr {{.*}}, {{.*}} noundef captures(none) {{.*}})29// CHECK: call void @_ZN1S2m0EPiS0_(ptr {{.*}}, {{.*}}, {{.*}} noundef captures(none) {{.*}})30// CHECK: call void {{.*}}(ptr {{.*}}, {{.*}}, {{.*}} noundef captures(none) {{.*}})31void test0(S *s, int *p0, int *p1) {32  S t(p0, p1);33  t = p1;34  s->m0(p0, p1);35  s->vm1(p0, p1);36}37 38namespace std {39  typedef decltype(sizeof(0)) size_t;40}41 42// CHECK: define {{.*}} @_ZnwmPv({{.*}}, {{.*}} captures(none) {{.*}})43void *operator new(std::size_t, void * __attribute__((noescape)) p) {44  return p;45}46 47// CHECK-LABEL: define{{.*}} ptr @_Z5test1Pv(48// CHECK: %call = call {{.*}} @_ZnwmPv({{.*}}, {{.*}} captures(none) {{.*}})49void *test1(void *p0) {50  return ::operator new(16, p0);51}52 53// CHECK-LABEL: define{{.*}} void @_Z5test2PiS_(54// CHECK: call void @"_ZZ5test2PiS_ENK3$_0clES_S_"({{.*}}, {{.*}}, {{.*}} captures(none) {{.*}})55// CHECK: define internal void @"_ZZ5test2PiS_ENK3$_0clES_S_"({{.*}}, {{.*}}, {{.*}} noundef captures(none) {{%.*}})56void test2(int *p0, int *p1) {57  auto t = [](int *, int * __attribute__((noescape))){};58  t(p0, p1);59}60 61// CHECK-LABEL: define{{.*}} void @_Z5test3PFvU8noescapePiES_(62// CHECK: call void {{.*}}(ptr noundef captures(none) {{.*}})63typedef void (*NoEscapeFunc)(__attribute__((noescape)) int *);64 65void test3(NoEscapeFunc f, int *p) {66  f(p);67}68 69namespace TestByref {70 71struct S {72  S();73  ~S();74  S(const S &);75  int a;76};77 78typedef void (^BlockTy)(void);79S &getS();80void noescapefunc(__attribute__((noescape)) BlockTy);81 82// Check that __block variables with reference types are handled correctly.83 84// CHECK: define{{.*}} void @_ZN9TestByref4testEv(85// CHECK: %[[X:.*]] = alloca ptr, align 886// CHECK: %[[BLOCK:.*]] = alloca <{ ptr, i32, i32, ptr, ptr, ptr }>, align 887// CHECK: %[[BLOCK_CAPTURED:.*]] = getelementptr inbounds nuw <{ ptr, i32, i32, ptr, ptr, ptr }>, ptr %[[BLOCK]], i32 0, i32 588// CHECK: %[[V0:.*]] = load ptr, ptr %[[X]], align 889// CHECK: store ptr %[[V0]], ptr %[[BLOCK_CAPTURED]], align 890 91void test() {92  __block S &x = getS();93  noescapefunc(^{ (void)x; });94}95 96}97