brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.6 KiB · 1de7a03 Raw
70 lines · plain
1// RUN: %clang_cc1 -triple x86_64-apple-darwin11 -emit-llvm -fobjc-arc -o - %s | FileCheck %s2 3id makeObject1() __attribute__((ns_returns_retained));4id makeObject2() __attribute__((ns_returns_retained));5void releaseObject(__attribute__((ns_consumed)) id);6 7// CHECK-LABEL: define{{.*}} void @_Z20basicCorrectnessTestv8void basicCorrectnessTest() {9  // CHECK: [[X:%.*]] = alloca ptr, align 810  // CHECK-NEXT: [[OBJ1:%.*]] = call noundef ptr @_Z11makeObject1v()11  // CHECK-NEXT: store ptr [[OBJ1]], ptr [[X]], align 812  id x = makeObject1();13 14  // CHECK-NEXT: [[OBJ2:%.*]] = call noundef ptr @_Z11makeObject2v()15  // CHECK-NEXT: call void @_Z13releaseObjectP11objc_object(ptr noundef [[OBJ2]])16  releaseObject(makeObject2());17 18  // CHECK-NEXT: call void @llvm.objc.storeStrong(ptr [[X]], ptr null)19  // CHECK-NEXT: ret void20}21 22 23template <typename T>24T makeObjectT1() __attribute__((ns_returns_retained));25template <typename T>26T makeObjectT2() __attribute__((ns_returns_retained));27 28template <typename T>29void releaseObjectT(__attribute__((ns_consumed)) T);30 31// CHECK-LABEL: define{{.*}} void @_Z12templateTestv32void templateTest() {33  // CHECK: [[X:%.*]] = alloca ptr, align 834  // CHECK-NEXT: [[OBJ1:%.*]] = call noundef ptr @_Z12makeObjectT1IU8__strongP11objc_objectET_v()35  // CHECK-NEXT: store ptr [[OBJ1]], ptr [[X]], align 836  id x = makeObjectT1<id>();37 38  // CHECK-NEXT: [[OBJ2:%.*]] = call noundef ptr @_Z12makeObjectT2IU8__strongP11objc_objectET_v()39  // CHECK-NEXT: call void @_Z13releaseObjectP11objc_object(ptr noundef [[OBJ2]])40  releaseObject(makeObjectT2<id>());41 42  // CHECK-NEXT: [[OBJ3:%.*]] = call noundef ptr @_Z11makeObject1v()43  // CHECK-NEXT: call void @_Z14releaseObjectTIU8__strongP11objc_objectEvT_(ptr noundef [[OBJ3]])44  releaseObjectT(makeObject1());45 46  // CHECK-NEXT: call void @llvm.objc.storeStrong(ptr [[X]], ptr null)47  // CHECK-NEXT: ret void48}49 50// PR2788751struct ForwardConsumed {52  ForwardConsumed(__attribute__((ns_consumed)) id x);53};54 55ForwardConsumed::ForwardConsumed(__attribute__((ns_consumed)) id x) {}56 57// CHECK: define{{.*}} void @_ZN15ForwardConsumedC2EP11objc_object(58// CHECK-NOT:  objc_retain59// CHECK:      store ptr %x, ptr [[X:%.*]],60// CHECK-NOT:  [[X]]61// CHECK:      call void @llvm.objc.storeStrong(ptr [[X]], ptr null)62 63// CHECK: define{{.*}} void @_ZN15ForwardConsumedC1EP11objc_object(64// CHECK-NOT:  objc_retain65// CHECK:      store ptr %x, ptr [[X:%.*]],66// CHECK:      [[T0:%.*]] = load ptr, ptr [[X]],67// CHECK-NEXT: store ptr null, ptr [[X]],68// CHECK-NEXT: call void @_ZN15ForwardConsumedC2EP11objc_object({{.*}}, ptr noundef [[T0]])69// CHECK:      call void @llvm.objc.storeStrong(ptr [[X]], ptr null)70