@@ -8,6 +8,239 @@ struct OneWord: Error {
8
8
let x = 1
9
9
}
10
10
11
+ struct Impl : P {
12
+ // CHECK: define hidden swiftcc void @"$s16typed_throws_abi4ImplV2f0yySbAA5EmptyVYKF"(i1 %0, ptr swiftself %1, ptr noalias nocapture swifterror dereferenceable(8) %2)
13
+ // CHECK: br i1 %0, label %[[SUCCESS:.*]], label %[[FAIL:.*]]
14
+ // CHECK: [[SUCCESS]]:
15
+ // CHECK: ret void
16
+ // CHECK: [[FAIL]]:
17
+ // CHECK: call swiftcc void @"$s16typed_throws_abi5EmptyVACycfC"()
18
+ // CHECK: [[ERROR_WITNESS:%.*]] = call ptr @"$s16typed_throws_abi5EmptyVACs5ErrorAAWl"() #12
19
+ // CHECK: call swiftcc void @swift_willThrowTyped(ptr noalias undef, ptr getelementptr inbounds (<{ ptr, ptr, i64, ptr }>, ptr @"$s16typed_throws_abi5EmptyVMf", i32 0, i32 2), ptr [[ERROR_WITNESS]])
20
+ // CHECK: store ptr inttoptr (i64 1 to ptr), ptr %2, align 8
21
+ // CHECK: ret void
22
+ // CHECK: }
23
+ func f0( _ b: Bool ) throws ( Empty) {
24
+ guard b else {
25
+ throw Empty ( )
26
+ }
27
+ }
28
+
29
+ // CHECK: define hidden swiftcc i64 @"$s16typed_throws_abi4ImplV2f1ySiSbAA5EmptyVYKF"(i1 %0, ptr swiftself %1, ptr noalias nocapture swifterror dereferenceable(8) %2)
30
+ // CHECK: br i1 %0, label %[[SUCCESS:.*]], label %[[FAIL:.*]]
31
+ // CHECK: [[SUCCESS]]:
32
+ // CHECK: ret i64 1
33
+ // CHECK: [[FAIL]]:
34
+ // CHECK: call swiftcc void @"$s16typed_throws_abi5EmptyVACycfC"()
35
+ // CHECK: [[ERROR_WITNESS:%.*]] = call ptr @"$s16typed_throws_abi5EmptyVACs5ErrorAAWl"() #12
36
+ // CHECK: call swiftcc void @swift_willThrowTyped(ptr noalias undef, ptr getelementptr inbounds (<{ ptr, ptr, i64, ptr }>, ptr @"$s16typed_throws_abi5EmptyVMf", i32 0, i32 2), ptr [[ERROR_WITNESS]])
37
+ // CHECK: store ptr inttoptr (i64 1 to ptr), ptr %2, align 8
38
+ // CHECK: ret i64 undef
39
+ // CHECK: }
40
+ func f1( _ b: Bool ) throws ( Empty) -> Int {
41
+ guard b else {
42
+ throw Empty ( )
43
+ }
44
+ return 1
45
+ }
46
+
47
+ // CHECK: define hidden swiftcc { i64, i64 } @"$s16typed_throws_abi4ImplV2f2ySi_SitSbAA5EmptyVYKF"(i1 %0, ptr swiftself %1, ptr noalias nocapture swifterror dereferenceable(8) %2)
48
+ // CHECK: br i1 %0, label %[[SUCCESS:.*]], label %[[FAIL:.*]]
49
+ // CHECK: [[SUCCESS]]:
50
+ // CHECK: ret { i64, i64 } { i64 1, i64 2 }
51
+ // CHECK: [[FAIL]]:
52
+ // CHECK: call swiftcc void @"$s16typed_throws_abi5EmptyVACycfC"()
53
+ // CHECK: [[ERROR_WITNESS:%.*]] = call ptr @"$s16typed_throws_abi5EmptyVACs5ErrorAAWl"() #12
54
+ // CHECK: call swiftcc void @swift_willThrowTyped(ptr noalias undef, ptr getelementptr inbounds (<{ ptr, ptr, i64, ptr }>, ptr @"$s16typed_throws_abi5EmptyVMf", i32 0, i32 2), ptr [[ERROR_WITNESS]])
55
+ // CHECK: store ptr inttoptr (i64 1 to ptr), ptr %2, align 8
56
+ // CHECK: ret { i64, i64 } undef
57
+ // CHECK: }
58
+ func f2( _ b: Bool ) throws ( Empty) -> ( Int , Int ) {
59
+ guard b else {
60
+ throw Empty ( )
61
+ }
62
+ return ( 1 , 2 )
63
+ }
64
+
65
+ // CHECK: define hidden swiftcc { i64, i64, i64 } @"$s16typed_throws_abi4ImplV2f3ySi_S2itSbAA5EmptyVYKF"(i1 %0, ptr swiftself %1, ptr noalias nocapture swifterror dereferenceable(8) %2)
66
+ // CHECK: br i1 %0, label %[[SUCCESS:.*]], label %[[FAIL:.*]]
67
+ // CHECK: [[SUCCESS]]:
68
+ // CHECK: ret { i64, i64, i64 } { i64 1, i64 2, i64 3 }
69
+ // CHECK: [[FAIL]]:
70
+ // CHECK: call swiftcc void @"$s16typed_throws_abi5EmptyVACycfC"()
71
+ // CHECK: [[ERROR_WITNESS:%.*]] = call ptr @"$s16typed_throws_abi5EmptyVACs5ErrorAAWl"() #12
72
+ // CHECK: call swiftcc void @swift_willThrowTyped(ptr noalias undef, ptr getelementptr inbounds (<{ ptr, ptr, i64, ptr }>, ptr @"$s16typed_throws_abi5EmptyVMf", i32 0, i32 2), ptr [[ERROR_WITNESS]])
73
+ // CHECK: store ptr inttoptr (i64 1 to ptr), ptr %2, align 8
74
+ // CHECK: ret { i64, i64, i64 } undef
75
+ // CHECK: }
76
+ func f3( _ b: Bool ) throws ( Empty) -> ( Int , Int , Int ) {
77
+ guard b else {
78
+ throw Empty ( )
79
+ }
80
+ return ( 1 , 2 , 3 )
81
+ }
82
+
83
+ // CHECK: define hidden swiftcc { i64, i64, i64, i64 } @"$s16typed_throws_abi4ImplV2f4ySi_S3itSbAA5EmptyVYKF"(i1 %0, ptr swiftself %1, ptr noalias nocapture swifterror dereferenceable(8) %2)
84
+ // CHECK: br i1 %0, label %[[SUCCESS:.*]], label %[[FAIL:.*]]
85
+ // CHECK: [[SUCCESS]]:
86
+ // CHECK: ret { i64, i64, i64, i64 } { i64 1, i64 2, i64 3, i64 4 }
87
+ // CHECK: [[FAIL]]:
88
+ // CHECK: call swiftcc void @"$s16typed_throws_abi5EmptyVACycfC"()
89
+ // CHECK: [[ERROR_WITNESS:%.*]] = call ptr @"$s16typed_throws_abi5EmptyVACs5ErrorAAWl"() #12
90
+ // CHECK: call swiftcc void @swift_willThrowTyped(ptr noalias undef, ptr getelementptr inbounds (<{ ptr, ptr, i64, ptr }>, ptr @"$s16typed_throws_abi5EmptyVMf", i32 0, i32 2), ptr [[ERROR_WITNESS]])
91
+ // CHECK: store ptr inttoptr (i64 1 to ptr), ptr %2, align 8
92
+ // CHECK: ret { i64, i64, i64, i64 } undef
93
+ // CHECK: }
94
+ func f4( _ b: Bool ) throws ( Empty) -> ( Int , Int , Int , Int ) {
95
+ guard b else {
96
+ throw Empty ( )
97
+ }
98
+ return ( 1 , 2 , 3 , 4 )
99
+ }
100
+
101
+ // CHECK: define hidden swiftcc void @"$s16typed_throws_abi4ImplV2f5ySi_S4itSbAA5EmptyVYKF"(ptr noalias nocapture sret(<{ %TSi, %TSi, %TSi, %TSi, %TSi }>) %0, i1 %1, ptr swiftself %2, ptr noalias nocapture swifterror dereferenceable(8) %3, ptr %4)
102
+ // CHECK: br i1 %1, label %[[SUCCESS:.*]], label %[[FAIL:.*]]
103
+ // CHECK: [[SUCCESS]]:
104
+ // CHECK: store i64 1, ptr %.elt._value, align 8
105
+ // CHECK: store i64 2, ptr %.elt1._value, align 8
106
+ // CHECK: store i64 3, ptr %.elt2._value, align 8
107
+ // CHECK: store i64 4, ptr %.elt3._value, align 8
108
+ // CHECK: store i64 5, ptr %.elt4._value, align 8
109
+ // CHECK: ret void
110
+ // CHECK: [[FAIL]]:
111
+ // CHECK: call swiftcc void @"$s16typed_throws_abi5EmptyVACycfC"()
112
+ // CHECK: [[ERROR_WITNESS:%.*]] = call ptr @"$s16typed_throws_abi5EmptyVACs5ErrorAAWl"() #12
113
+ // CHECK: call swiftcc void @swift_willThrowTyped(ptr noalias undef, ptr getelementptr inbounds (<{ ptr, ptr, i64, ptr }>, ptr @"$s16typed_throws_abi5EmptyVMf", i32 0, i32 2), ptr [[ERROR_WITNESS]])
114
+ // CHECK: store ptr inttoptr (i64 1 to ptr), ptr %3, align 8
115
+ // CHECK: ret void
116
+ // CHECK: }
117
+ func f5( _ b: Bool ) throws ( Empty) -> ( Int , Int , Int , Int , Int ) {
118
+ guard b else {
119
+ throw Empty ( )
120
+ }
121
+ return ( 1 , 2 , 3 , 4 , 5 )
122
+ }
123
+
124
+ // CHECK: define hidden swiftcc i64 @"$s16typed_throws_abi4ImplV2g0yySbAA7OneWordVYKF"(i1 %0, ptr swiftself %1, ptr noalias nocapture swifterror dereferenceable(8) %2)
125
+ // CHECK: [[ERROR:%.*]] = alloca %T16typed_throws_abi7OneWordV
126
+ // CHECK: br i1 %0, label %[[SUCCESS:.*]], label %[[FAIL:.*]]
127
+ // CHECK: [[SUCCESS]]:
128
+ // CHECK: ret i64 undef
129
+ // CHECK: [[FAIL]]:
130
+ // CHECK: call swiftcc i64 @"$s16typed_throws_abi7OneWordVACycfC"()
131
+ // CHECK: [[ERROR_WITNESS:%.*]] = call ptr @"$s16typed_throws_abi7OneWordVACs5ErrorAAWl"()
132
+ // CHECK: call swiftcc void @swift_willThrowTyped(ptr noalias [[ERROR]], ptr getelementptr inbounds (<{ ptr, ptr, i64, ptr, i32, [4 x i8] }>, ptr @"$s16typed_throws_abi7OneWordVMf", i32 0, i32 2), ptr [[ERROR_WITNESS]])
133
+ // CHECK: store ptr inttoptr (i64 1 to ptr), ptr %2, align 8
134
+ // CHECK: ret i64 {{%.*}}
135
+ // CHECK: }
136
+ func g0( _ b: Bool ) throws ( OneWord) {
137
+ guard b else {
138
+ throw OneWord ( )
139
+ }
140
+ }
141
+
142
+ // CHECK: define hidden swiftcc i64 @"$s16typed_throws_abi4ImplV2g1ySiSbAA7OneWordVYKF"(i1 %0, ptr swiftself %1, ptr noalias nocapture swifterror dereferenceable(8) %2)
143
+ // CHECK: [[ERROR:%.*]] = alloca %T16typed_throws_abi7OneWordV
144
+ // CHECK: br i1 %0, label %[[SUCCESS:.*]], label %[[FAIL:.*]]
145
+ // CHECK: [[SUCCESS]]:
146
+ // CHECK: ret i64 1
147
+ // CHECK: [[FAIL]]:
148
+ // CHECK: call swiftcc i64 @"$s16typed_throws_abi7OneWordVACycfC"()
149
+ // CHECK: [[ERROR_WITNESS:%.*]] = call ptr @"$s16typed_throws_abi7OneWordVACs5ErrorAAWl"()
150
+ // CHECK: call swiftcc void @swift_willThrowTyped(ptr noalias [[ERROR]], ptr getelementptr inbounds (<{ ptr, ptr, i64, ptr, i32, [4 x i8] }>, ptr @"$s16typed_throws_abi7OneWordVMf", i32 0, i32 2), ptr [[ERROR_WITNESS]])
151
+ // CHECK: store ptr inttoptr (i64 1 to ptr), ptr %2, align 8
152
+ // CHECK: ret i64 {{%.*}}
153
+ // CHECK: }
154
+ func g1( _ b: Bool ) throws ( OneWord) -> Int {
155
+ guard b else {
156
+ throw OneWord ( )
157
+ }
158
+ return 1
159
+ }
160
+
161
+ // CHECK: define hidden swiftcc { i64, i64 } @"$s16typed_throws_abi4ImplV2g2ySi_SitSbAA7OneWordVYKF"(i1 %0, ptr swiftself %1, ptr noalias nocapture swifterror dereferenceable(8) %2)
162
+ // CHECK: [[ERROR:%.*]] = alloca %T16typed_throws_abi7OneWordV
163
+ // CHECK: br i1 %0, label %[[SUCCESS:.*]], label %[[FAIL:.*]]
164
+ // CHECK: [[SUCCESS]]:
165
+ // CHECK: ret { i64, i64 } { i64 1, i64 2 }
166
+ // CHECK: [[FAIL]]:
167
+ // CHECK: call swiftcc i64 @"$s16typed_throws_abi7OneWordVACycfC"()
168
+ // CHECK: [[ERROR_WITNESS:%.*]] = call ptr @"$s16typed_throws_abi7OneWordVACs5ErrorAAWl"()
169
+ // CHECK: call swiftcc void @swift_willThrowTyped(ptr noalias [[ERROR]], ptr getelementptr inbounds (<{ ptr, ptr, i64, ptr, i32, [4 x i8] }>, ptr @"$s16typed_throws_abi7OneWordVMf", i32 0, i32 2), ptr [[ERROR_WITNESS]])
170
+ // CHECK: store ptr inttoptr (i64 1 to ptr), ptr %2, align 8
171
+ // CHECK: ret { i64, i64 } {{%.*}}
172
+ // CHECK: }
173
+ func g2( _ b: Bool ) throws ( OneWord) -> ( Int , Int ) {
174
+ guard b else {
175
+ throw OneWord ( )
176
+ }
177
+ return ( 1 , 2 )
178
+ }
179
+
180
+ // CHECK: define hidden swiftcc { i64, i64, i64 } @"$s16typed_throws_abi4ImplV2g3ySi_S2itSbAA7OneWordVYKF"(i1 %0, ptr swiftself %1, ptr noalias nocapture swifterror dereferenceable(8) %2)
181
+ // CHECK: [[ERROR:%.*]] = alloca %T16typed_throws_abi7OneWordV
182
+ // CHECK: br i1 %0, label %[[SUCCESS:.*]], label %[[FAIL:.*]]
183
+ // CHECK: [[SUCCESS]]:
184
+ // CHECK: ret { i64, i64, i64 } { i64 1, i64 2, i64 3 }
185
+ // CHECK: [[FAIL]]:
186
+ // CHECK: call swiftcc i64 @"$s16typed_throws_abi7OneWordVACycfC"()
187
+ // CHECK: [[ERROR_WITNESS:%.*]] = call ptr @"$s16typed_throws_abi7OneWordVACs5ErrorAAWl"()
188
+ // CHECK: call swiftcc void @swift_willThrowTyped(ptr noalias [[ERROR]], ptr getelementptr inbounds (<{ ptr, ptr, i64, ptr, i32, [4 x i8] }>, ptr @"$s16typed_throws_abi7OneWordVMf", i32 0, i32 2), ptr [[ERROR_WITNESS]])
189
+ // CHECK: store ptr inttoptr (i64 1 to ptr), ptr %2, align 8
190
+ // CHECK: ret { i64, i64, i64 } {{%.*}}
191
+ // CHECK: }
192
+ func g3( _ b: Bool ) throws ( OneWord) -> ( Int , Int , Int ) {
193
+ guard b else {
194
+ throw OneWord ( )
195
+ }
196
+ return ( 1 , 2 , 3 )
197
+ }
198
+
199
+ // CHECK: define hidden swiftcc { i64, i64, i64, i64 } @"$s16typed_throws_abi4ImplV2g4ySi_S3itSbAA7OneWordVYKF"(i1 %0, ptr swiftself %1, ptr noalias nocapture swifterror dereferenceable(8) %2)
200
+ // CHECK: [[ERROR:%.*]] = alloca %T16typed_throws_abi7OneWordV
201
+ // CHECK: br i1 %0, label %[[SUCCESS:.*]], label %[[FAIL:.*]]
202
+ // CHECK: [[SUCCESS]]:
203
+ // CHECK: ret { i64, i64, i64, i64 } { i64 1, i64 2, i64 3, i64 4 }
204
+ // CHECK: [[FAIL]]:
205
+ // CHECK: call swiftcc i64 @"$s16typed_throws_abi7OneWordVACycfC"()
206
+ // CHECK: [[ERROR_WITNESS:%.*]] = call ptr @"$s16typed_throws_abi7OneWordVACs5ErrorAAWl"()
207
+ // CHECK: call swiftcc void @swift_willThrowTyped(ptr noalias [[ERROR]], ptr getelementptr inbounds (<{ ptr, ptr, i64, ptr, i32, [4 x i8] }>, ptr @"$s16typed_throws_abi7OneWordVMf", i32 0, i32 2), ptr [[ERROR_WITNESS]])
208
+ // CHECK: store ptr inttoptr (i64 1 to ptr), ptr %2, align 8
209
+ // CHECK: ret { i64, i64, i64, i64 } {{%.*}}
210
+ // CHECK: }
211
+ func g4( _ b: Bool ) throws ( OneWord) -> ( Int , Int , Int , Int ) {
212
+ guard b else {
213
+ throw OneWord ( )
214
+ }
215
+ return ( 1 , 2 , 3 , 4 )
216
+ }
217
+
218
+ // CHECK: define hidden swiftcc void @"$s16typed_throws_abi4ImplV2g5ySi_S4itSbAA7OneWordVYKF"(ptr noalias nocapture sret(<{ %TSi, %TSi, %TSi, %TSi, %TSi }>) %0, i1 %1, ptr swiftself %2, ptr noalias nocapture swifterror dereferenceable(8) %3, ptr %4) #0 {
219
+ // CHECK: entry:
220
+ // CHECK: [[ERROR:%.*]] = alloca %T16typed_throws_abi7OneWordV, align 8
221
+ // CHECK: br i1 %1, label %[[SUCCESS:.*]], label %[[FAIL:.*]]
222
+ // CHECK: [[SUCCESS]]:
223
+ // CHECK: store i64 1, ptr {{%.*}}, align 8
224
+ // CHECK: store i64 2, ptr {{%.*}}, align 8
225
+ // CHECK: store i64 3, ptr {{%.*}}, align 8
226
+ // CHECK: store i64 4, ptr {{%.*}}, align 8
227
+ // CHECK: store i64 5, ptr {{%.*}}, align 8
228
+ // CHECK: ret void
229
+ // CHECK: [[FAIL]]:
230
+ // CHECK: call swiftcc i64 @"$s16typed_throws_abi7OneWordVACycfC"()
231
+ // CHECK: [[ERROR_WITNESS:%.*]] = call ptr @"$s16typed_throws_abi7OneWordVACs5ErrorAAWl"()
232
+ // CHECK: call swiftcc void @swift_willThrowTyped(ptr noalias [[ERROR]], ptr getelementptr inbounds (<{ ptr, ptr, i64, ptr, i32, [4 x i8] }>, ptr @"$s16typed_throws_abi7OneWordVMf", i32 0, i32 2), ptr [[ERROR_WITNESS]])
233
+ // CHECK: store ptr inttoptr (i64 1 to ptr), ptr %3, align 8
234
+ // CHECK: ret void
235
+ // CHECK: }
236
+ func g5( _ b: Bool ) throws ( OneWord) -> ( Int , Int , Int , Int , Int ) {
237
+ guard b else {
238
+ throw OneWord ( )
239
+ }
240
+ return ( 1 , 2 , 3 , 4 , 5 )
241
+ }
242
+ }
243
+
11
244
protocol P {
12
245
// CHECK: define hidden swiftcc void @"$s16typed_throws_abi1PP2f0yySbAA5EmptyVYKFTj"(i1 %0, ptr noalias swiftself %1, ptr noalias nocapture swifterror dereferenceable(8) %2, ptr %3, ptr %4)
13
246
// CHECK: [[ERROR:%.*]] = load ptr, ptr %2
0 commit comments