Skip to content

Commit e62cab2

Browse files
committed
[IRGen] Add synchronous typed throws implementation to typed_throws_abi.swift test
Adding some tests cases for direct return of typed errors in synchronous functions.
1 parent 60afdd3 commit e62cab2

File tree

1 file changed

+233
-0
lines changed

1 file changed

+233
-0
lines changed

test/IRGen/typed_throws_abi.swift

Lines changed: 233 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,239 @@ struct OneWord: Error {
88
let x = 1
99
}
1010

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+
11244
protocol P {
12245
// 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)
13246
// CHECK: [[ERROR:%.*]] = load ptr, ptr %2

0 commit comments

Comments
 (0)