brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.2 KiB · fedf858 Raw
115 lines · plain
1// RUN: %clang_cc1 -triple x86_64-apple-macosx10.13.0 -fobjc-arc -fblocks -Wno-objc-root-class -O0 %s -emit-llvm -o - | FileCheck %s2// RUN: %clang_cc1 -triple x86_64-apple-macosx10.13.0 -fobjc-arc -fblocks -Wno-objc-root-class -O0 -xobjective-c++ -std=c++11 %s -emit-llvm -o - | FileCheck %s --check-prefix CHECKXX3 4#define EXT_RET __attribute__((objc_externally_retained))5 6@interface ObjTy @end7 8ObjTy *global;9 10#if __cplusplus11// Suppress name mangling in C++ mode for the sake of check lines.12extern "C" void param(ObjTy *p);13extern "C" void local();14extern "C" void in_init();15extern "C" void anchor();16extern "C" void block_capture(ObjTy *);17extern "C" void esc(void (^)());18extern "C" void escp(void (^)(ObjTy *));19extern "C" void block_param();20#endif21 22void param(ObjTy *p) EXT_RET {23  // CHECK-LABEL: define{{.*}} void @param24  // CHECK-NOT: llvm.objc.25  // CHECK: ret26}27 28void local(void) {29  EXT_RET ObjTy *local = global;30  // CHECK-LABEL: define{{.*}} void @local31  // CHECK-NOT: llvm.objc.32  // CHECK: ret33}34 35void in_init(void) {36  // Test that we do the right thing when a variable appears in it's own37  // initializer. Here, we release the value stored in 'wat' after overwriting38  // it, in case it was somehow set to point to a non-null object while it's39  // initializer is being evaluated.40  EXT_RET ObjTy *wat = 0 ? wat : global;41 42  // CHECK-LABEL: define{{.*}} void @in_init43  // CHECK: [[WAT:%.*]] = alloca44  // CHECK-NEXT: store {{.*}} null, {{.*}} [[WAT]]45  // CHECK-NEXT: [[GLOBAL:%.*]] = load {{.*}} @global46  // CHECK-NEXT: [[WAT_LOAD:%.*]] = load {{.*}} [[WAT]]47  // CHECK-NEXT: store {{.*}} [[GLOBAL]], {{.*}} [[WAT]]48  // CHECK-NEXT: call void @llvm.objc.release(ptr [[WAT_LOAD]])49 50  // CHECK-NOT: llvm.objc.51  // CHECK: ret52}53 54void esc(void (^)(void));55 56void block_capture(ObjTy *obj) EXT_RET {57  esc(^{ (void)obj; });58 59  // CHECK-LABEL: define{{.*}} void @block_capture60  // CHECK-NOT: llvm.objc.61  // CHECK: call ptr @llvm.objc.retain62  // CHECK-NOT: llvm.objc.63  // CHECK: call void @esc64  // CHECK-NOT: llvm.objc.65  // CHECK: call void @llvm.objc.storeStrong({{.*}} null)66  // CHECK-NOT: llvm.objc.67  // CHECK: ret68 69  // CHECK-LABEL: define {{.*}} void @__copy_helper_block_70  // CHECK-NOT: llvm.objc.71  // CHECK: llvm.objc.storeStrong72  // CHECK-NOT: llvm.objc.73  // CHECK: ret74 75  // CHECK-LABEL: define {{.*}} void @__destroy_helper_block_76  // CHECK-NOT: llvm.objc.77  // CHECK: llvm.objc.storeStrong({{.*}} null)78  // CHECK-NOT: llvm.objc.79  // CHECK: ret80}81 82void escp(void (^)(ObjTy *));83 84void block_param(void) {85  escp(^(ObjTy *p) EXT_RET {});86 87  // CHECK-LABEL: define internal void @__block_param_block_invoke88  // CHECK-NOT: llvm.objc.89  // CHECK: ret90}91 92@interface Inter93-(void)m1: (ObjTy *)w;94@end95 96@implementation Inter97-(void)m1: (ObjTy *) w EXT_RET {98  // CHECK-LABEL: define internal void @"\01-[Inter m1:]"99  // CHECK-NOT: llvm.objc.100  // CHECK: ret101}102-(void)m2: (ObjTy *) w EXT_RET {103  // CHECK-LABEL: define internal void @"\01-[Inter m2:]"104  // CHECK-NOT: llvm.objc.105  // CHECK: ret106}107@end108 109#if __cplusplus110// Verify that the decltype(p) is resolved before 'p' is made implicitly const.111__attribute__((objc_externally_retained))112void foo(ObjTy *p, decltype(p) *) {}113// CHECKXX: _Z3fooP5ObjTyPU8__strongS0_114#endif115