1*67e74705SXin Li// RUN: %clang_cc1 -triple x86_64-apple-darwin11 -emit-llvm -fobjc-arc -o - %s | FileCheck %s 2*67e74705SXin Li 3*67e74705SXin Liid makeObject1() __attribute__((ns_returns_retained)); 4*67e74705SXin Liid makeObject2() __attribute__((ns_returns_retained)); 5*67e74705SXin Livoid releaseObject(__attribute__((ns_consumed)) id); 6*67e74705SXin Li 7*67e74705SXin Li// CHECK-LABEL: define void @_Z10sanityTestv 8*67e74705SXin Livoid sanityTest() { 9*67e74705SXin Li // CHECK: [[X:%.*]] = alloca i8*, align 8 10*67e74705SXin Li // CHECK-NEXT: [[OBJ1:%.*]] = call i8* @_Z11makeObject1v() 11*67e74705SXin Li // CHECK-NEXT: store i8* [[OBJ1]], i8** [[X]], align 8 12*67e74705SXin Li id x = makeObject1(); 13*67e74705SXin Li 14*67e74705SXin Li // CHECK-NEXT: [[OBJ2:%.*]] = call i8* @_Z11makeObject2v() 15*67e74705SXin Li // CHECK-NEXT: call void @_Z13releaseObjectP11objc_object(i8* [[OBJ2]]) 16*67e74705SXin Li releaseObject(makeObject2()); 17*67e74705SXin Li 18*67e74705SXin Li // CHECK-NEXT: call void @objc_storeStrong(i8** [[X]], i8* null) 19*67e74705SXin Li // CHECK-NEXT: ret void 20*67e74705SXin Li} 21*67e74705SXin Li 22*67e74705SXin Li 23*67e74705SXin Litemplate <typename T> 24*67e74705SXin LiT makeObjectT1() __attribute__((ns_returns_retained)); 25*67e74705SXin Litemplate <typename T> 26*67e74705SXin LiT makeObjectT2() __attribute__((ns_returns_retained)); 27*67e74705SXin Li 28*67e74705SXin Litemplate <typename T> 29*67e74705SXin Livoid releaseObjectT(__attribute__((ns_consumed)) T); 30*67e74705SXin Li 31*67e74705SXin Li// CHECK-LABEL: define void @_Z12templateTestv 32*67e74705SXin Livoid templateTest() { 33*67e74705SXin Li // CHECK: [[X:%.*]] = alloca i8*, align 8 34*67e74705SXin Li // CHECK-NEXT: [[OBJ1:%.*]] = call i8* @_Z12makeObjectT1IU8__strongP11objc_objectET_v() 35*67e74705SXin Li // CHECK-NEXT: store i8* [[OBJ1]], i8** [[X]], align 8 36*67e74705SXin Li id x = makeObjectT1<id>(); 37*67e74705SXin Li 38*67e74705SXin Li // CHECK-NEXT: [[OBJ2:%.*]] = call i8* @_Z12makeObjectT2IU8__strongP11objc_objectET_v() 39*67e74705SXin Li // CHECK-NEXT: call void @_Z13releaseObjectP11objc_object(i8* [[OBJ2]]) 40*67e74705SXin Li releaseObject(makeObjectT2<id>()); 41*67e74705SXin Li 42*67e74705SXin Li // CHECK-NEXT: [[OBJ3:%.*]] = call i8* @_Z11makeObject1v() 43*67e74705SXin Li // CHECK-NEXT: call void @_Z14releaseObjectTIU8__strongP11objc_objectEvT_(i8* [[OBJ3]]) 44*67e74705SXin Li releaseObjectT(makeObject1()); 45*67e74705SXin Li 46*67e74705SXin Li // CHECK-NEXT: call void @objc_storeStrong(i8** [[X]], i8* null) 47*67e74705SXin Li // CHECK-NEXT: ret void 48*67e74705SXin Li} 49