1 | // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -fblocks -fobjc-weak -fobjc-runtime-has-weak -std=c++11 -o - %s | FileCheck %s |
2 | |
3 | struct A { __weak id x; }; |
4 | |
5 | id test0() { |
6 | A a; |
7 | A b = a; |
8 | A c(static_cast<A&&>(b)); |
9 | a = c; |
10 | c = static_cast<A&&>(a); |
11 | return c.x; |
12 | } |
13 | |
14 | // Copy Assignment Operator |
15 | // CHECK-LABEL: define linkonce_odr dereferenceable({{[0-9]+}}) %struct.A* @_ZN1AaSERKS_( |
16 | // CHECK: [[THISADDR:%this.*]] = alloca [[A:.*]]* |
17 | // CHECK: [[OBJECTADDR:%.*]] = alloca [[A:.*]]* |
18 | // CHECK: [[THIS:%this.*]] = load [[A]]*, [[A]]** [[THISADDR]] |
19 | // CHECK: [[OBJECT:%.*]] = load [[A]]*, [[A]]** [[OBJECTADDR]] |
20 | // CHECK: [[T0:%.*]] = getelementptr inbounds [[A]], [[A]]* [[OBJECT]], i32 0, i32 0 |
21 | // CHECK-NEXT: [[T1:%.*]] = call i8* @llvm.objc.loadWeak(i8** [[T0]]) |
22 | // CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds [[A]], [[A]]* [[THIS]], i32 0, i32 0 |
23 | // CHECK-NEXT: [[T3:%.*]] = call i8* @llvm.objc.storeWeak(i8** [[T2]], i8* [[T1]]) |
24 | |
25 | // Move Assignment Operator |
26 | // CHECK-LABEL: define linkonce_odr dereferenceable({{[0-9]+}}) %struct.A* @_ZN1AaSEOS_( |
27 | // CHECK: [[THISADDR:%this.*]] = alloca [[A:.*]]* |
28 | // CHECK: [[OBJECTADDR:%.*]] = alloca [[A:.*]]* |
29 | // CHECK: [[THIS:%this.*]] = load [[A]]*, [[A]]** [[THISADDR]] |
30 | // CHECK: [[OBJECT:%.*]] = load [[A]]*, [[A]]** [[OBJECTADDR]] |
31 | // CHECK: [[T0:%.*]] = getelementptr inbounds [[A]], [[A]]* [[OBJECT]], i32 0, i32 0 |
32 | // CHECK-NEXT: [[T1:%.*]] = call i8* @llvm.objc.loadWeak(i8** [[T0]]) |
33 | // CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds [[A]], [[A]]* [[THIS]], i32 0, i32 0 |
34 | // CHECK-NEXT: [[T3:%.*]] = call i8* @llvm.objc.storeWeak(i8** [[T2]], i8* [[T1]]) |
35 | |
36 | // Default Constructor |
37 | // CHECK-LABEL: define linkonce_odr void @_ZN1AC2Ev( |
38 | // CHECK: [[THISADDR:%this.*]] = alloca [[A:.*]]* |
39 | // CHECK: [[THIS:%this.*]] = load [[A]]*, [[A]]** [[THISADDR]] |
40 | // CHECK: [[T0:%.*]] = getelementptr inbounds [[A]], [[A]]* [[THIS]], i32 0, i32 0 |
41 | // CHECK-NEXT: store i8* null, i8** [[T0]] |
42 | |
43 | // Copy Constructor |
44 | // CHECK-LABEL: define linkonce_odr void @_ZN1AC2ERKS_( |
45 | // CHECK: [[THISADDR:%this.*]] = alloca [[A:.*]]* |
46 | // CHECK: [[OBJECTADDR:%.*]] = alloca [[A:.*]]* |
47 | // CHECK: [[THIS:%this.*]] = load [[A]]*, [[A]]** [[THISADDR]] |
48 | // CHECK: [[T0:%.*]] = getelementptr inbounds [[A]], [[A]]* [[THIS]], i32 0, i32 0 |
49 | // CHECK-NEXT: [[OBJECT:%.*]] = load [[A]]*, [[A]]** [[OBJECTADDR]] |
50 | // CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[A]], [[A]]* [[OBJECT]], i32 0, i32 0 |
51 | // CHECK-NEXT: call void @llvm.objc.copyWeak(i8** [[T0]], i8** [[T1]]) |
52 | |
53 | // Move Constructor |
54 | // CHECK-LABEL: define linkonce_odr void @_ZN1AC2EOS_( |
55 | // CHECK: [[THISADDR:%this.*]] = alloca [[A:.*]]* |
56 | // CHECK: [[OBJECTADDR:%.*]] = alloca [[A:.*]]* |
57 | // CHECK: [[THIS:%this.*]] = load [[A]]*, [[A]]** [[THISADDR]] |
58 | // CHECK: [[T0:%.*]] = getelementptr inbounds [[A]], [[A]]* [[THIS]], i32 0, i32 0 |
59 | // CHECK-NEXT: [[OBJECT:%.*]] = load [[A]]*, [[A]]** [[OBJECTADDR]] |
60 | // CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[A]], [[A]]* [[OBJECT]], i32 0, i32 0 |
61 | // CHECK-NEXT: call void @llvm.objc.moveWeak(i8** [[T0]], i8** [[T1]]) |
62 | |
63 | // Destructor |
64 | // CHECK-LABEL: define linkonce_odr void @_ZN1AD2Ev( |
65 | // CHECK: [[THISADDR:%this.*]] = alloca [[A:.*]]* |
66 | // CHECK: [[THIS:%this.*]] = load [[A]]*, [[A]]** [[THISADDR]] |
67 | // CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[A]], [[A]]* [[THIS]], i32 0, i32 0 |
68 | // CHECK-NEXT: call void @llvm.objc.destroyWeak(i8** [[T0]]) |
69 | |
70 | |