diff options
Diffstat (limited to 'test/CodeGenObjCXX/objc-weak.mm')
| -rw-r--r-- | test/CodeGenObjCXX/objc-weak.mm | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/test/CodeGenObjCXX/objc-weak.mm b/test/CodeGenObjCXX/objc-weak.mm new file mode 100644 index 000000000000..68c2d4611146 --- /dev/null +++ b/test/CodeGenObjCXX/objc-weak.mm @@ -0,0 +1,69 @@ +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -fblocks -fobjc-weak -fobjc-runtime-has-weak -std=c++11 -o - %s | FileCheck %s + +struct A { __weak id x; }; + +id test0() { + A a; + A b = a; + A c(static_cast<A&&>(b)); + a = c; + c = static_cast<A&&>(a); + return c.x; +} + +// Copy Assignment Operator +// CHECK-LABEL: define linkonce_odr dereferenceable({{[0-9]+}}) %struct.A* @_ZN1AaSERKS_( +// CHECK: [[THISADDR:%this.*]] = alloca [[A:.*]]* +// CHECK: [[OBJECTADDR:%.*]] = alloca [[A:.*]]* +// CHECK: [[THIS:%this.*]] = load [[A]]*, [[A]]** [[THISADDR]] +// CHECK: [[OBJECT:%.*]] = load [[A]]*, [[A]]** [[OBJECTADDR]] +// CHECK: [[T0:%.*]] = getelementptr inbounds [[A]], [[A]]* [[OBJECT]], i32 0, i32 0 +// CHECK-NEXT: [[T1:%.*]] = call i8* @objc_loadWeak(i8** [[T0]]) +// CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds [[A]], [[A]]* [[THIS]], i32 0, i32 0 +// CHECK-NEXT: [[T3:%.*]] = call i8* @objc_storeWeak(i8** [[T2]], i8* [[T1]]) + +// Move Assignment Operator +// CHECK-LABEL: define linkonce_odr dereferenceable({{[0-9]+}}) %struct.A* @_ZN1AaSEOS_( +// CHECK: [[THISADDR:%this.*]] = alloca [[A:.*]]* +// CHECK: [[OBJECTADDR:%.*]] = alloca [[A:.*]]* +// CHECK: [[THIS:%this.*]] = load [[A]]*, [[A]]** [[THISADDR]] +// CHECK: [[OBJECT:%.*]] = load [[A]]*, [[A]]** [[OBJECTADDR]] +// CHECK: [[T0:%.*]] = getelementptr inbounds [[A]], [[A]]* [[OBJECT]], i32 0, i32 0 +// CHECK-NEXT: [[T1:%.*]] = call i8* @objc_loadWeak(i8** [[T0]]) +// CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds [[A]], [[A]]* [[THIS]], i32 0, i32 0 +// CHECK-NEXT: [[T3:%.*]] = call i8* @objc_storeWeak(i8** [[T2]], i8* [[T1]]) + +// Default Constructor +// CHECK-LABEL: define linkonce_odr void @_ZN1AC2Ev( +// CHECK: [[THISADDR:%this.*]] = alloca [[A:.*]]* +// CHECK: [[THIS:%this.*]] = load [[A]]*, [[A]]** [[THISADDR]] +// CHECK: [[T0:%.*]] = getelementptr inbounds [[A]], [[A]]* [[THIS]], i32 0, i32 0 +// CHECK-NEXT: store i8* null, i8** [[T0]] + +// Copy Constructor +// CHECK-LABEL: define linkonce_odr void @_ZN1AC2ERKS_( +// CHECK: [[THISADDR:%this.*]] = alloca [[A:.*]]* +// CHECK: [[OBJECTADDR:%.*]] = alloca [[A:.*]]* +// CHECK: [[THIS:%this.*]] = load [[A]]*, [[A]]** [[THISADDR]] +// CHECK: [[T0:%.*]] = getelementptr inbounds [[A]], [[A]]* [[THIS]], i32 0, i32 0 +// CHECK-NEXT: [[OBJECT:%.*]] = load [[A]]*, [[A]]** [[OBJECTADDR]] +// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[A]], [[A]]* [[OBJECT]], i32 0, i32 0 +// CHECK-NEXT: call void @objc_copyWeak(i8** [[T0]], i8** [[T1]]) + +// Move Constructor +// CHECK-LABEL: define linkonce_odr void @_ZN1AC2EOS_( +// CHECK: [[THISADDR:%this.*]] = alloca [[A:.*]]* +// CHECK: [[OBJECTADDR:%.*]] = alloca [[A:.*]]* +// CHECK: [[THIS:%this.*]] = load [[A]]*, [[A]]** [[THISADDR]] +// CHECK: [[T0:%.*]] = getelementptr inbounds [[A]], [[A]]* [[THIS]], i32 0, i32 0 +// CHECK-NEXT: [[OBJECT:%.*]] = load [[A]]*, [[A]]** [[OBJECTADDR]] +// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[A]], [[A]]* [[OBJECT]], i32 0, i32 0 +// CHECK-NEXT: call void @objc_moveWeak(i8** [[T0]], i8** [[T1]]) + +// Destructor +// CHECK-LABEL: define linkonce_odr void @_ZN1AD2Ev( +// CHECK: [[THISADDR:%this.*]] = alloca [[A:.*]]* +// CHECK: [[THIS:%this.*]] = load [[A]]*, [[A]]** [[THISADDR]] +// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[A]], [[A]]* [[THIS]], i32 0, i32 0 +// CHECK-NEXT: call void @objc_destroyWeak(i8** [[T0]]) + |
