1 | // RUN: %clang_cc1 -triple arm64-apple-ios11 -fobjc-arc -emit-llvm -o - %s | FileCheck %s |
2 | |
3 | @class I; |
4 | |
5 | typedef struct { |
6 | I *name; |
7 | } Foo; |
8 | |
9 | typedef struct { |
10 | Foo foo; |
11 | } Bar; |
12 | |
13 | typedef struct { |
14 | Bar bar; |
15 | } Baz; |
16 | |
17 | I *getI(); |
18 | |
19 | void f() { |
20 | Foo foo = {getI()}; |
21 | Bar bar = {foo}; |
22 | Baz baz = {bar}; |
23 | } |
24 | |
25 | // CHECK: define linkonce_odr hidden void @__destructor_8_S_S_s0(i8** %[[DST:.*]]) |
26 | // CHECK: %[[DST_ADDR:.*]] = alloca i8**, align 8 |
27 | // CHECK: store i8** %[[DST]], i8*** %[[DST_ADDR]], align 8 |
28 | // CHECK: %[[V0:.*]] = load i8**, i8*** %[[DST_ADDR]], align 8 |
29 | // CHECK: call void @__destructor_8_S_s0(i8** %[[V0]]) |
30 | // CHECK: ret void |
31 | |
32 | // CHECK: define linkonce_odr hidden void @__destructor_8_S_s0(i8** %[[DST:.*]]) |
33 | // CHECK: %[[DST_ADDR:.*]] = alloca i8**, align 8 |
34 | // CHECK: store i8** %[[DST]], i8*** %[[DST_ADDR]], align 8 |
35 | // CHECK: %[[V0:.*]] = load i8**, i8*** %[[DST_ADDR]], align 8 |
36 | // CHECK: call void @__destructor_8_s0(i8** %[[V0]]) |
37 | // CHECK: ret void |
38 | |
39 | // CHECK: define linkonce_odr hidden void @__destructor_8_s0(i8** %dst) |
40 | // CHECK: %[[DST_ADDR:.*]] = alloca i8**, align 8 |
41 | // CHECK: store i8** %[[DST]], i8*** %[[DST_ADDR]], align 8 |
42 | // CHECK: %[[V0:.*]] = load i8**, i8*** %[[DST_ADDR]], align 8 |
43 | // CHECK: call void @llvm.objc.storeStrong(i8** %[[V0]], i8* null) |
44 | // CHECK: ret void |
45 | |