@@ -13,6 +13,11 @@ import Builtin
13
13
// Declarations //
14
14
//////////////////
15
15
16
+ enum Optional<T> {
17
+ case some(T)
18
+ case nome
19
+ }
20
+
16
21
struct TrivialStruct {
17
22
var f1: Builtin.Int32
18
23
var f2: Builtin.Int32
@@ -23,6 +28,11 @@ struct NonTrivialStructWithTrivialField {
23
28
var payload: Builtin.Int32
24
29
}
25
30
31
+ struct TupleContainingNonTrivialStruct {
32
+ var t: (Builtin.NativeObject, Builtin.NativeObject)
33
+ var opt: Optional<Builtin.NativeObject>
34
+ }
35
+
26
36
////////////////
27
37
// Test Cases //
28
38
////////////////
@@ -70,3 +80,24 @@ bb0(%0 : $Builtin.NativeObject):
70
80
%9999 = tuple()
71
81
return %9999 : $()
72
82
}
83
+
84
+ /////////////////////
85
+ // Aggregate Tests //
86
+ /////////////////////
87
+
88
+ // These tests make sure that we properly handle @owned forwarding of multiple
89
+ // levels of aggregate.
90
+
91
+ sil @owned_aggregates_simple : $@convention(thin) (@owned Builtin.NativeObject, @owned Builtin.NativeObject) -> (@owned (Builtin.NativeObject, Builtin.NativeObject)) {
92
+ bb0(%0 : $Builtin.NativeObject, %1 : $Builtin.NativeObject):
93
+ %2 = tuple(%0 : $Builtin.NativeObject, %1 : $Builtin.NativeObject)
94
+ return %2 : $(Builtin.NativeObject, Builtin.NativeObject)
95
+ }
96
+
97
+ sil @multiple_level_owned_aggregates : $@convention(thin) (@owned Builtin.NativeObject, @owned Builtin.NativeObject, @owned Builtin.NativeObject) -> (@owned TupleContainingNonTrivialStruct) {
98
+ bb0(%0 : $Builtin.NativeObject, %1 : $Builtin.NativeObject, %2 : $Builtin.NativeObject):
99
+ %3 = tuple(%0 : $Builtin.NativeObject, %1 : $Builtin.NativeObject)
100
+ %4 = enum $Optional<Builtin.NativeObject>, #Optional.some!enumelt.1, %2 : $Builtin.NativeObject
101
+ %5 = struct $TupleContainingNonTrivialStruct(%3 : $(Builtin.NativeObject, Builtin.NativeObject), %4 : $Optional<Builtin.NativeObject>)
102
+ return %5 : $TupleContainingNonTrivialStruct
103
+ }
0 commit comments