diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-06-22 16:12:01 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-06-22 16:12:01 +0000 |
commit | 58df509fc0dc288f6859cd3b61ff980d364baf6d (patch) | |
tree | 83ec8750fc9ef7b24b397a85eab8f3bc37bfbcab /clang/test | |
parent | 08d0f3550a87f04fdd75e118eed163c441e2e494 (diff) | |
download | bcm5719-llvm-58df509fc0dc288f6859cd3b61ff980d364baf6d.tar.gz bcm5719-llvm-58df509fc0dc288f6859cd3b61ff980d364baf6d.zip |
When binding a reference to an Automatic Reference Counting temporary,
retain/release the temporary object appropriately. Previously, we
would only perform the retain/release operations when the reference
would extend the lifetime of the temporary, but this does the wrong
thing across calls.
llvm-svn: 133620
Diffstat (limited to 'clang/test')
-rw-r--r-- | clang/test/CodeGenObjCXX/arc-references.mm | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/clang/test/CodeGenObjCXX/arc-references.mm b/clang/test/CodeGenObjCXX/arc-references.mm index de79176b7e6..b113d80027b 100644 --- a/clang/test/CodeGenObjCXX/arc-references.mm +++ b/clang/test/CodeGenObjCXX/arc-references.mm @@ -1,5 +1,8 @@ // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -fobjc-nonfragile-abi -fblocks -fobjc-arc -O2 -disable-llvm-optzns -o - %s | FileCheck %s +@interface A +@end + id getObject(); void callee(); @@ -44,6 +47,33 @@ void test3() { // CHECK-NEXT: ret void } +// CHECK: define void @_Z5test4RU8__strongP11objc_object +void test4(__strong id &x) { + // CHECK: call i8* @objc_retain + __strong A* const &ar = x; + // CHECK: store i32 17, i32* + int i = 17; + // CHECK: call void @objc_release( + // CHECK: ret void +} + +void sink(__strong A* &&); + +// CHECK: define void @_Z5test5RU8__strongP11objc_object +void test5(__strong id &x) { + // CHECK: [[OBJ_ID:%[a-zA-Z0-9]+]] = call i8* @objc_retain + // CHECK-NEXT: [[OBJ_A:%[a-zA-Z0-9]+]] = bitcast i8* [[OBJ_ID]] to [[A:%[a-zA-Z0-9]+]]* + // CHECK-NEXT: store [[A]]* [[OBJ_A]], [[A]]** [[REFTMP:%[a-zA-Z0-9]+]] + // CHECK-NEXT: call void @_Z4sinkOU8__strongP1A + sink(x); + // CHECK-NEXT: [[OBJ_A:%[a-zA-Z0-9]+]] = load [[A]]** [[REFTMP]] + // CHECK-NEXT: [[OBJ_ID:%[a-zA-Z0-9]+]] = bitcast [[A]]* [[OBJ_A]] to i8* + // CHECK-NEXT: call void @objc_release + // CHECK-NEXT: store i32 17, i32 + int i = 17; + // CHECK-NEXT: ret void +} + // CHECK: define internal void @__cxx_global_var_init( // CHECK: call i8* @_Z9getObjectv // CHECK-NEXT: call i8* @objc_retainAutoreleasedReturnValue |