brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.5 KiB · b7938cc Raw
116 lines · plain
1// RUN: %clang_cc1 -std=gnu++98 -I %S/Inputs -triple x86_64-apple-darwin10 -emit-llvm -fblocks -fobjc-arc -fobjc-runtime-has-weak -fexceptions -fobjc-exceptions -fcxx-exceptions -fobjc-arc-exceptions -O2 -disable-llvm-passes -o - %s | FileCheck %s2 3#include "literal-support.h"4 5struct X {6  X();7  ~X();8  operator id() const;9};10 11struct Y {12  Y();13  ~Y();14  operator id() const;15};16 17// CHECK-LABEL: define{{.*}} void @_Z10test_arrayv18void test_array() {19  // CHECK: [[ARR:%[a-zA-Z0-9.]+]] = alloca ptr20  // CHECK: [[OBJECTS:%[a-zA-Z0-9.]+]] = alloca [2 x ptr]21  // CHECK: [[TMPX:%[a-zA-Z0-9.]+]] = alloca %22  // CHECK: [[TMPY:%[a-zA-Z0-9.]+]] = alloca %23 24  // Initializing first element25  // CHECK: call void @llvm.lifetime.start.p0(ptr [[ARR]])26  // CHECK: [[ELEMENT0:%[a-zA-Z0-9.]+]] = getelementptr inbounds [2 x ptr], ptr [[OBJECTS]], i64 0, i64 027  // CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[TMPX]])28  // CHECK-NEXT: call void @_ZN1XC1Ev({{.*}} [[TMPX]])29  // CHECK-NEXT: [[OBJECT0:%[a-zA-Z0-9.]+]] = invoke noundef ptr @_ZNK1XcvP11objc_objectEv{{.*}} [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]30  // CHECK: store ptr [[OBJECT0]], ptr [[ELEMENT0]]31  32  // Initializing the second element33  // CHECK: [[ELEMENT1:%[a-zA-Z0-9.]+]] = getelementptr inbounds [2 x ptr], ptr [[OBJECTS]], i64 0, i64 134  // CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[TMPY]])35  // CHECK-NEXT: invoke void @_ZN1YC1Ev({{.*}} [[TMPY]])36  // CHECK: [[OBJECT1:%[a-zA-Z0-9.]+]] = invoke noundef ptr @_ZNK1YcvP11objc_objectEv{{.*}} [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]37  // CHECK: store ptr [[OBJECT1]], ptr [[ELEMENT1]]38 39  // Build the array40  // CHECK: {{invoke.*@objc_msgSend}}{{.*}} [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]41  id arr = @[ X(), Y() ];42 43  // Destroy temporaries44  // CHECK-NOT: ret void45  // CHECK: call void @llvm.objc.release46  // CHECK-NOT: ret void47  // CHECK: invoke void @_ZN1YD1Ev48  // CHECK-NOT: ret void49  // CHECK: call void @llvm.objc.release50  // CHECK-NEXT: call void @_ZN1XD1Ev51  // CHECK-NOT: ret void52  // CHECK: call void @llvm.objc.release53  // CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[ARR]])54  // CHECK-NEXT: ret void55 56  // Check cleanups57  // CHECK: call void @llvm.objc.release58  // CHECK-NOT: call void @llvm.objc.release59  // CHECK: invoke void @_ZN1YD1Ev60  // CHECK: call void @llvm.objc.release61  // CHECK-NOT: call void @llvm.objc.release62  // CHECK: invoke void @_ZN1XD1Ev63  // CHECK-NOT: call void @llvm.objc.release64  // CHECK: unreachable65}66 67// CHECK-LABEL: define weak_odr void @_Z24test_array_instantiationIiEvv68template<typename T>69void test_array_instantiation() {70  // CHECK: [[ARR:%[a-zA-Z0-9.]+]] = alloca ptr71  // CHECK: [[OBJECTS:%[a-zA-Z0-9.]+]] = alloca [2 x ptr]72 73  // Initializing first element74  // CHECK: call void @llvm.lifetime.start.p0(ptr [[ARR]])75  // CHECK: [[ELEMENT0:%[a-zA-Z0-9.]+]] = getelementptr inbounds [2 x ptr], ptr [[OBJECTS]], i64 0, i64 076  // CHECK: call void @_ZN1XC1Ev77  // CHECK-NEXT: [[OBJECT0:%[a-zA-Z0-9.]+]] = invoke noundef ptr @_ZNK1XcvP11objc_objectEv{{.*}} [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]78  // CHECK: store ptr [[OBJECT0]], ptr [[ELEMENT0]]79  80  // Initializing the second element81  // CHECK: [[ELEMENT1:%[a-zA-Z0-9.]+]] = getelementptr inbounds [2 x ptr], ptr [[OBJECTS]], i64 0, i64 182  // CHECK: invoke void @_ZN1YC1Ev83  // CHECK: [[OBJECT1:%[a-zA-Z0-9.]+]] = invoke noundef ptr @_ZNK1YcvP11objc_objectEv{{.*}} [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]84  // CHECK: store ptr [[OBJECT1]], ptr [[ELEMENT1]]85 86  // Build the array87  // CHECK: {{invoke.*@objc_msgSend}}{{.*}} [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]88  id arr = @[ X(), Y() ];89 90  // Destroy temporaries91  // CHECK-NOT: ret void92  // CHECK: call void @llvm.objc.release93  // CHECK-NOT: ret void94  // CHECK: invoke void @_ZN1YD1Ev95  // CHECK-NOT: ret void96  // CHECK: call void @llvm.objc.release97  // CHECK-NEXT: call void @_ZN1XD1Ev98  // CHECK-NOT: ret void99  // CHECK: call void @llvm.objc.release100  // CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[ARR]])101  // CHECK-NEXT: ret void102 103  // Check cleanups104  // CHECK: call void @llvm.objc.release105  // CHECK-NOT: call void @llvm.objc.release106  // CHECK: invoke void @_ZN1YD1Ev107  // CHECK: call void @llvm.objc.release108  // CHECK-NOT: call void @llvm.objc.release109  // CHECK: invoke void @_ZN1XD1Ev110  // CHECK-NOT: call void @llvm.objc.release111  // CHECK: unreachable112}113 114template void test_array_instantiation<int>();115 116