@@ -19,13 +19,17 @@ fn members_from_base_class_are_available_in_subclasses() {
19
19
END_FUNCTION_BLOCK
20
20
"# ,
21
21
) ;
22
- insta:: assert_snapshot!( result, @r### "
22
+ insta:: assert_snapshot!( result, @r#"
23
23
; ModuleID = '<internal>'
24
24
source_filename = "<internal>"
25
25
26
+ %__vtable_foo = type {}
27
+ %__vtable_bar = type { %__vtable_foo }
26
28
%foo = type { i16, [81 x i8], [11 x [81 x i8]] }
27
29
%bar = type { %foo }
28
30
31
+ @____vtable_foo__init = constant %__vtable_foo zeroinitializer
32
+ @____vtable_bar__init = constant %__vtable_bar zeroinitializer
29
33
@__foo__init = constant %foo zeroinitializer
30
34
@__bar__init = constant %bar zeroinitializer
31
35
@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 0, void ()* @__init___Test, i8* null }]
@@ -44,6 +48,23 @@ fn members_from_base_class_are_available_in_subclasses() {
44
48
ret void
45
49
}
46
50
51
+ define void @__init___vtable_foo(%__vtable_foo* %0) {
52
+ entry:
53
+ %self = alloca %__vtable_foo*, align 8
54
+ store %__vtable_foo* %0, %__vtable_foo** %self, align 8
55
+ ret void
56
+ }
57
+
58
+ define void @__init___vtable_bar(%__vtable_bar* %0) {
59
+ entry:
60
+ %self = alloca %__vtable_bar*, align 8
61
+ store %__vtable_bar* %0, %__vtable_bar** %self, align 8
62
+ %deref = load %__vtable_bar*, %__vtable_bar** %self, align 8
63
+ %__vtable_foo = getelementptr inbounds %__vtable_bar, %__vtable_bar* %deref, i32 0, i32 0
64
+ call void @__init___vtable_foo(%__vtable_foo* %__vtable_foo)
65
+ ret void
66
+ }
67
+
47
68
define void @__init_foo(%foo* %0) {
48
69
entry:
49
70
%self = alloca %foo*, align 8
@@ -65,7 +86,7 @@ fn members_from_base_class_are_available_in_subclasses() {
65
86
entry:
66
87
ret void
67
88
}
68
- "### ) ;
89
+ "# ) ;
69
90
}
70
91
71
92
#[ test]
@@ -91,14 +112,20 @@ fn write_to_parent_variable_qualified_access() {
91
112
" ,
92
113
) ;
93
114
94
- insta:: assert_snapshot!( res, @r### "
115
+ insta:: assert_snapshot!( res, @r#"
95
116
; ModuleID = '<internal>'
96
117
source_filename = "<internal>"
97
118
119
+ %__vtable_fb = type {}
120
+ %__vtable_fb2 = type { %__vtable_fb }
121
+ %__vtable_foo = type {}
98
122
%fb2 = type { %fb }
99
123
%fb = type { i16, i16 }
100
124
%foo = type { %fb2 }
101
125
126
+ @____vtable_fb__init = constant %__vtable_fb zeroinitializer
127
+ @____vtable_fb2__init = constant %__vtable_fb2 zeroinitializer
128
+ @____vtable_foo__init = constant %__vtable_foo zeroinitializer
102
129
@__fb2__init = constant %fb2 zeroinitializer
103
130
@__fb__init = constant %fb zeroinitializer
104
131
@__foo__init = constant %foo zeroinitializer
@@ -126,6 +153,30 @@ fn write_to_parent_variable_qualified_access() {
126
153
ret void
127
154
}
128
155
156
+ define void @__init___vtable_fb(%__vtable_fb* %0) {
157
+ entry:
158
+ %self = alloca %__vtable_fb*, align 8
159
+ store %__vtable_fb* %0, %__vtable_fb** %self, align 8
160
+ ret void
161
+ }
162
+
163
+ define void @__init___vtable_fb2(%__vtable_fb2* %0) {
164
+ entry:
165
+ %self = alloca %__vtable_fb2*, align 8
166
+ store %__vtable_fb2* %0, %__vtable_fb2** %self, align 8
167
+ %deref = load %__vtable_fb2*, %__vtable_fb2** %self, align 8
168
+ %__vtable_fb = getelementptr inbounds %__vtable_fb2, %__vtable_fb2* %deref, i32 0, i32 0
169
+ call void @__init___vtable_fb(%__vtable_fb* %__vtable_fb)
170
+ ret void
171
+ }
172
+
173
+ define void @__init___vtable_foo(%__vtable_foo* %0) {
174
+ entry:
175
+ %self = alloca %__vtable_foo*, align 8
176
+ store %__vtable_foo* %0, %__vtable_foo** %self, align 8
177
+ ret void
178
+ }
179
+
129
180
define void @__init_fb2(%fb2* %0) {
130
181
entry:
131
182
%self = alloca %fb2*, align 8
@@ -157,7 +208,7 @@ fn write_to_parent_variable_qualified_access() {
157
208
entry:
158
209
ret void
159
210
}
160
- "### ) ;
211
+ "# ) ;
161
212
}
162
213
163
214
#[ test]
@@ -191,11 +242,15 @@ fn write_to_parent_variable_in_instance() {
191
242
; ModuleID = '<internal>'
192
243
source_filename = "<internal>"
193
244
245
+ %__vtable_foo = type { i32* }
246
+ %__vtable_bar = type { %__vtable_foo }
194
247
%bar = type { %foo }
195
248
%foo = type { [81 x i8] }
196
249
197
250
@utf08_literal_0 = private unnamed_addr constant [6 x i8] c"hello\00"
198
251
@utf08_literal_1 = private unnamed_addr constant [6 x i8] c"world\00"
252
+ @____vtable_foo__init = constant %__vtable_foo zeroinitializer
253
+ @____vtable_bar__init = constant %__vtable_bar zeroinitializer
199
254
@__bar__init = constant %bar zeroinitializer
200
255
@__foo__init = constant %foo zeroinitializer
201
256
@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 0, void ()* @__init___Test, i8* null }]
@@ -247,6 +302,23 @@ fn write_to_parent_variable_in_instance() {
247
302
; Function Attrs: argmemonly nofree nounwind willreturn
248
303
declare void @llvm.memcpy.p0i8.p0i8.i64(i8* noalias nocapture writeonly, i8* noalias nocapture readonly, i64, i1 immarg) #0
249
304
305
+ define void @__init___vtable_foo(%__vtable_foo* %0) {
306
+ entry:
307
+ %self = alloca %__vtable_foo*, align 8
308
+ store %__vtable_foo* %0, %__vtable_foo** %self, align 8
309
+ ret void
310
+ }
311
+
312
+ define void @__init___vtable_bar(%__vtable_bar* %0) {
313
+ entry:
314
+ %self = alloca %__vtable_bar*, align 8
315
+ store %__vtable_bar* %0, %__vtable_bar** %self, align 8
316
+ %deref = load %__vtable_bar*, %__vtable_bar** %self, align 8
317
+ %__vtable_foo = getelementptr inbounds %__vtable_bar, %__vtable_bar* %deref, i32 0, i32 0
318
+ call void @__init___vtable_foo(%__vtable_foo* %__vtable_foo)
319
+ ret void
320
+ }
321
+
250
322
define void @__init_bar(%bar* %0) {
251
323
entry:
252
324
%self = alloca %bar*, align 8
@@ -310,14 +382,20 @@ fn array_in_parent_generated() {
310
382
END_FUNCTION
311
383
"# ,
312
384
) ;
313
- insta:: assert_snapshot!( result, @r### "
385
+ insta:: assert_snapshot!( result, @r#"
314
386
; ModuleID = '<internal>'
315
387
source_filename = "<internal>"
316
388
389
+ %__vtable_grandparent = type {}
390
+ %__vtable_parent = type { %__vtable_grandparent }
391
+ %__vtable_child = type { %__vtable_parent }
317
392
%child = type { %parent, [11 x i16] }
318
393
%parent = type { %grandparent, [11 x i16], i16 }
319
394
%grandparent = type { [6 x i16], i16 }
320
395
396
+ @____vtable_grandparent__init = constant %__vtable_grandparent zeroinitializer
397
+ @____vtable_parent__init = constant %__vtable_parent zeroinitializer
398
+ @____vtable_child__init = constant %__vtable_child zeroinitializer
321
399
@__child__init = constant %child zeroinitializer
322
400
@__parent__init = constant %parent zeroinitializer
323
401
@__grandparent__init = constant %grandparent zeroinitializer
@@ -380,6 +458,33 @@ fn array_in_parent_generated() {
380
458
; Function Attrs: argmemonly nofree nounwind willreturn writeonly
381
459
declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i1 immarg) #0
382
460
461
+ define void @__init___vtable_grandparent(%__vtable_grandparent* %0) {
462
+ entry:
463
+ %self = alloca %__vtable_grandparent*, align 8
464
+ store %__vtable_grandparent* %0, %__vtable_grandparent** %self, align 8
465
+ ret void
466
+ }
467
+
468
+ define void @__init___vtable_parent(%__vtable_parent* %0) {
469
+ entry:
470
+ %self = alloca %__vtable_parent*, align 8
471
+ store %__vtable_parent* %0, %__vtable_parent** %self, align 8
472
+ %deref = load %__vtable_parent*, %__vtable_parent** %self, align 8
473
+ %__vtable_grandparent = getelementptr inbounds %__vtable_parent, %__vtable_parent* %deref, i32 0, i32 0
474
+ call void @__init___vtable_grandparent(%__vtable_grandparent* %__vtable_grandparent)
475
+ ret void
476
+ }
477
+
478
+ define void @__init___vtable_child(%__vtable_child* %0) {
479
+ entry:
480
+ %self = alloca %__vtable_child*, align 8
481
+ store %__vtable_child* %0, %__vtable_child** %self, align 8
482
+ %deref = load %__vtable_child*, %__vtable_child** %self, align 8
483
+ %__vtable_parent = getelementptr inbounds %__vtable_child, %__vtable_child* %deref, i32 0, i32 0
484
+ call void @__init___vtable_parent(%__vtable_parent* %__vtable_parent)
485
+ ret void
486
+ }
487
+
383
488
define void @__init_child(%child* %0) {
384
489
entry:
385
490
%self = alloca %child*, align 8
@@ -413,7 +518,7 @@ fn array_in_parent_generated() {
413
518
}
414
519
415
520
attributes #0 = { argmemonly nofree nounwind willreturn writeonly }
416
- "### ) ;
521
+ "# ) ;
417
522
}
418
523
419
524
#[ test]
@@ -443,14 +548,20 @@ fn complex_array_access_generated() {
443
548
"# ,
444
549
) ;
445
550
446
- insta:: assert_snapshot!( result, @r### "
551
+ insta:: assert_snapshot!( result, @r#"
447
552
; ModuleID = '<internal>'
448
553
source_filename = "<internal>"
449
554
555
+ %__vtable_grandparent = type {}
556
+ %__vtable_parent = type { %__vtable_grandparent }
557
+ %__vtable_child = type { %__vtable_parent }
450
558
%parent = type { %grandparent, [11 x i16], i16 }
451
559
%grandparent = type { [6 x i16], i16 }
452
560
%child = type { %parent, [11 x i16] }
453
561
562
+ @____vtable_grandparent__init = constant %__vtable_grandparent zeroinitializer
563
+ @____vtable_parent__init = constant %__vtable_parent zeroinitializer
564
+ @____vtable_child__init = constant %__vtable_child zeroinitializer
454
565
@__parent__init = constant %parent zeroinitializer
455
566
@__grandparent__init = constant %grandparent zeroinitializer
456
567
@__child__init = constant %child zeroinitializer
@@ -502,6 +613,33 @@ fn complex_array_access_generated() {
502
613
ret void
503
614
}
504
615
616
+ define void @__init___vtable_grandparent(%__vtable_grandparent* %0) {
617
+ entry:
618
+ %self = alloca %__vtable_grandparent*, align 8
619
+ store %__vtable_grandparent* %0, %__vtable_grandparent** %self, align 8
620
+ ret void
621
+ }
622
+
623
+ define void @__init___vtable_parent(%__vtable_parent* %0) {
624
+ entry:
625
+ %self = alloca %__vtable_parent*, align 8
626
+ store %__vtable_parent* %0, %__vtable_parent** %self, align 8
627
+ %deref = load %__vtable_parent*, %__vtable_parent** %self, align 8
628
+ %__vtable_grandparent = getelementptr inbounds %__vtable_parent, %__vtable_parent* %deref, i32 0, i32 0
629
+ call void @__init___vtable_grandparent(%__vtable_grandparent* %__vtable_grandparent)
630
+ ret void
631
+ }
632
+
633
+ define void @__init___vtable_child(%__vtable_child* %0) {
634
+ entry:
635
+ %self = alloca %__vtable_child*, align 8
636
+ store %__vtable_child* %0, %__vtable_child** %self, align 8
637
+ %deref = load %__vtable_child*, %__vtable_child** %self, align 8
638
+ %__vtable_parent = getelementptr inbounds %__vtable_child, %__vtable_child* %deref, i32 0, i32 0
639
+ call void @__init___vtable_parent(%__vtable_parent* %__vtable_parent)
640
+ ret void
641
+ }
642
+
505
643
define void @__init_parent(%parent* %0) {
506
644
entry:
507
645
%self = alloca %parent*, align 8
@@ -533,7 +671,7 @@ fn complex_array_access_generated() {
533
671
entry:
534
672
ret void
535
673
}
536
- "### ) ;
674
+ "# ) ;
537
675
}
538
676
539
677
#[ test]
0 commit comments