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