xref: /aosp_15_r20/external/clang/test/CodeGenObjCXX/arc-attrs.mm (revision 67e74705e28f6214e480b399dd47ea732279e315)
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