@@ -1549,6 +1549,128 @@ func callNonMatching_f1(_ b: Bool) -> (Int, Float, Bool, Float) {
1549
1549
}
1550
1550
}
1551
1551
1552
+ // CHECK: define hidden swifttailcc void @"$s16typed_throws_abi20nonMatching_f0_asyncySf_SftSbYaAA7OneWordVYKF"(ptr swiftasync %0, i1 %1)
1553
+ // CHECK: br i1 %1, label %[[SUCCESS:.*]], label %[[ERROR:.*]]
1554
+ // CHECK: [[SUCCESS]]:
1555
+ // CHECK: call i1 (ptr, i1, ...) @llvm.coro.end.async(ptr {{%.*}}, i1 false, ptr @"$s16typed_throws_abi20nonMatching_f0_asyncySf_SftSbYaAA7OneWordVYKF.0.49", ptr {{%.*}}, ptr {{%.*}}, float 1.000000e+00, float 2.000000e+00, i64 undef, ptr null)
1556
+ // CHECK: unreachable
1557
+ // CHECK: 18:
1558
+ // CHECK: [[ERROR_X:%.*]] = load i64, ptr %.x1._value, align 8
1559
+ // CHECK: [[ERROR_RET:%.*]] = insertvalue { float, float, i64 } undef, i64 [[ERROR_X]], 2
1560
+ // CHECK: [[ERROR_RET0:%.*]] = extractvalue { float, float, i64 } [[ERROR_RET]], 0
1561
+ // CHECK: [[ERROR_RET1:%.*]] = extractvalue { float, float, i64 } [[ERROR_RET]], 1
1562
+ // CHECK: [[ERROR_RET2:%.*]] = extractvalue { float, float, i64 } [[ERROR_RET]], 2
1563
+ // CHECK: call i1 (ptr, i1, ...) @llvm.coro.end.async(ptr {{%.*}}, i1 false, ptr @"$s16typed_throws_abi20nonMatching_f0_asyncySf_SftSbYaAA7OneWordVYKF.0", ptr {{%.*}}, ptr {{%.*}}, float [[ERROR_RET0]], float [[ERROR_RET1]], i64 [[ERROR_RET2]], ptr inttoptr (i64 1 to ptr))
1564
+ // CHECK: unreachable
1565
+ // CHECK: }
1566
+ @available ( SwiftStdlib 6 . 0 , * )
1567
+ func nonMatching_f0_async( _ b: Bool ) async throws ( OneWord) -> ( Float , Float ) {
1568
+ guard b else {
1569
+ throw OneWord ( )
1570
+ }
1571
+ return ( 1.0 , 2.0 )
1572
+ }
1573
+
1574
+
1575
+ // CHECK: define hidden swifttailcc void @"$s16typed_throws_abi24callNonMatching_f0_asyncySi_S2ftSbYaF"(ptr swiftasync %0, i1 %1)
1576
+ // CHECK: call { ptr, float, float, i64, ptr } (i32, ptr, ptr, ...) @llvm.coro.suspend.async.sl_p0f32f32i64p0s(i32 1024, ptr {{%.*}}, ptr @__swift_async_resume_project_context, ptr @"$s16typed_throws_abi24callNonMatching_f0_asyncySi_S2ftSbYaF.0", ptr @"$s16typed_throws_abi20nonMatching_f0_asyncySf_SftSbYaAA7OneWordVYKF", ptr {{%.*}}, i1 %1)
1577
+ // CHECK: [[CALL_RES0:%.*]] = extractvalue { float, float, i64 } {{%.*}}, 0
1578
+ // CHECK: [[CALL_RES1:%.*]] = extractvalue { float, float, i64 } {{%.*}}, 1
1579
+ // CHECK: [[CALL_RES2:%.*]] = extractvalue { float, float, i64 } {{%.*}}, 2
1580
+ // CHECK: [[ERROR:%.*]] = extractvalue { ptr, float, float, i64, ptr } {{%.*}}, 4
1581
+ // CHECK: store ptr [[ERROR]], ptr %swifterror, align 8
1582
+ // CHECK: [[ERROR0:%.*]] = load ptr, ptr %swifterror, align 8
1583
+ // CHECK: [[ISERROR:%.*]] = icmp ne ptr [[ERROR0]], null
1584
+ // CHECK: br i1 [[ISERROR]], label %typed.error.load, label %[[SUCCESS:.*]]
1585
+ // CHECK: typed.error.load:
1586
+ // CHECK: br label %[[SET_ERROR:.*]]
1587
+ // CHECK: [[SUCCESS]]:
1588
+ // CHECK: [[SUCCESS_RES0:%.*]] = phi float [ [[CALL_RES0]], %entry ]
1589
+ // CHECK: [[SUCCESS_RES1:%.*]] = phi float [ [[CALL_RES1]], %entry ]
1590
+ // CHECK: br label %[[COMMON_RET:.*]]
1591
+ // CHECK: [[COMMON_RET]]:
1592
+ // CHECK: [[RETVAL0:%.*]] = phi i64 [ [[ERROR_RES0:%.*]], %[[SET_ERROR]] ], [ 1, %[[SUCCESS]] ]
1593
+ // CHECK: [[RETVAL1:%.*]] = phi float [ 0.000000e+00, %[[SET_ERROR]] ], [ [[SUCCESS_RES0]], %[[SUCCESS]] ]
1594
+ // CHECK: [[RETVAL2:%.*]] = phi float [ 0.000000e+00, %[[SET_ERROR]] ], [ [[SUCCESS_RES1]], %[[SUCCESS]] ]
1595
+ // CHECK: %39 = call i1 (ptr, i1, ...) @llvm.coro.end.async(ptr {{%.*}}, i1 false, ptr @"$s16typed_throws_abi24callNonMatching_f0_asyncySi_S2ftSbYaF.0.50", ptr {{%.*}}, ptr {{%.*}}, i64 [[RETVAL0]], float [[RETVAL1]], float [[RETVAL2]])
1596
+ // CHECK: unreachable
1597
+ // CHECK: [[SET_ERROR]]:
1598
+ // CHECK: [[ERROR_RES0]] = phi i64 [ [[CALL_RES2]], %typed.error.load ]
1599
+ // CHECK: store ptr null, ptr %swifterror, align 8
1600
+ // CHECK: br label %[[COMMON_RET]]
1601
+ // CHECK: }
1602
+ @available ( SwiftStdlib 6 . 0 , * )
1603
+ func callNonMatching_f0_async( _ b: Bool ) async -> ( Int , Float , Float ) {
1604
+ do {
1605
+ let res = try await nonMatching_f0_async ( b)
1606
+ return ( 1 , res. 0 , res. 1 )
1607
+ } catch {
1608
+ return ( error. x, 0.0 , 0.0 )
1609
+ }
1610
+ }
1611
+
1612
+ // CHECK: define hidden swifttailcc void @"$s16typed_throws_abi20nonMatching_f1_asyncySf_SbSftSbYaAA7OneWordVYKF"(ptr swiftasync %0, i1 %1)
1613
+ // CHECK: br i1 %1, label %[[SUCCESS:.*]], label %[[ERROR:.*]]
1614
+ // CHECK: [[SUCCESS]]:
1615
+ // CHECK: %17 = call i1 (ptr, i1, ...) @llvm.coro.end.async(ptr {{%.*}}, i1 false, ptr @"$s16typed_throws_abi20nonMatching_f1_asyncySf_SbSftSbYaAA7OneWordVYKF.0.51", ptr {{%.*}}, ptr {{%.*}}, float 1.000000e+00, i64 1, float 2.000000e+00, ptr null)
1616
+ // CHECK: unreachable
1617
+ // CHECK: [[ERROR]]:
1618
+ // CHECK: [[ERROR_X:%.*]] = load i64, ptr %.x1._value, align 8
1619
+ // CHECK: [[ERROR_RET:%.*]] = insertvalue { float, i64, float } undef, i64 [[ERROR_X]], 1
1620
+ // CHECK: [[ERROR_RET0:%.*]] = extractvalue { float, i64, float } [[ERROR_RET]], 0
1621
+ // CHECK: [[ERROR_RET1:%.*]] = extractvalue { float, i64, float } [[ERROR_RET]], 1
1622
+ // CHECK: [[ERROR_RET2:%.*]] = extractvalue { float, i64, float } [[ERROR_RET]], 2
1623
+ // CHECK: call i1 (ptr, i1, ...) @llvm.coro.end.async(ptr {{%.*}}, i1 false, ptr @"$s16typed_throws_abi20nonMatching_f1_asyncySf_SbSftSbYaAA7OneWordVYKF.0", ptr {{%.*}}, ptr {{%.*}}, float [[ERROR_RET0]], i64 [[ERROR_RET1]], float [[ERROR_RET2]], ptr inttoptr (i64 1 to ptr))
1624
+ // CHECK: unreachable
1625
+ // CHECK: }
1626
+ @available ( SwiftStdlib 6 . 0 , * )
1627
+ func nonMatching_f1_async( _ b: Bool ) async throws ( OneWord) -> ( Float , Bool , Float ) {
1628
+ guard b else {
1629
+ throw OneWord ( )
1630
+ }
1631
+ return ( 1.0 , true , 2.0 )
1632
+ }
1633
+
1634
+ // CHECK: define hidden swifttailcc void @"$s16typed_throws_abi24callNonMatching_f1_asyncySi_SfSbSftSbYaF"(ptr swiftasync %0, i1 %1)
1635
+ // CHECK: call { ptr, float, i64, float, ptr } (i32, ptr, ptr, ...) @llvm.coro.suspend.async.sl_p0f32i64f32p0s(i32 1024, ptr {{%.*}}, ptr @__swift_async_resume_project_context, ptr @"$s16typed_throws_abi24callNonMatching_f1_asyncySi_SfSbSftSbYaF.0", ptr @"$s16typed_throws_abi20nonMatching_f1_asyncySf_SbSftSbYaAA7OneWordVYKF", ptr {{%.*}}, i1 %1)
1636
+ // CHECK: [[CALL_RES0:%.*]] = extractvalue { float, i64, float } {{%.*}}, 0
1637
+ // CHECK: [[CALL_RES1:%.*]] = extractvalue { float, i64, float } {{%.*}}, 1
1638
+ // CHECK: [[CALL_RES2:%.*]] = extractvalue { float, i64, float } {{%.*}}, 2
1639
+ // CHECK: [[CALL_RES1_TRUNC:%.*]] = trunc i64 [[CALL_RES1]] to i1
1640
+ // CHECK: [[ERROR:%.*]] = extractvalue { ptr, float, i64, float, ptr } {{%.*}}, 4
1641
+ // CHECK: store ptr [[ERROR]], ptr %swifterror, align 8
1642
+ // CHECK: [[ERROR0:%.*]] = load ptr, ptr %swifterror, align 8
1643
+ // CHECK: [[ISERROR:%.*]] = icmp ne ptr [[ERROR0]], null
1644
+ // CHECK: br i1 [[ISERROR]], label %typed.error.load, label %[[SUCCESS:.*]]
1645
+ // CHECK: typed.error.load:
1646
+ // CHECK: br label %[[SET_ERROR:.*]]
1647
+ // CHECK: [[SUCCESS]]:
1648
+ // CHECK: [[SUCCESS_RES0:%.*]] = phi float [ [[CALL_RES0]], %entry ]
1649
+ // CHECK: [[SUCCESS_RES1:%.*]] = phi i1 [ [[CALL_RES1_TRUNC]], %entry ]
1650
+ // CHECK: [[SUCCESS_RES2:%.*]] = phi float [ [[CALL_RES2]], %entry ]
1651
+ // CHECK: br label %[[COMMON_RET:.*]]
1652
+ // CHECK: [[COMMON_RET]]:
1653
+ // CHECK: [[RETVAL0:%.*]] = phi i64 [ [[ERROR_RES0:%.*]], %[[SET_ERROR]] ], [ 1, %[[SUCCESS]] ]
1654
+ // CHECK: [[RETVAL1:%.*]] = phi float [ 0.000000e+00, %[[SET_ERROR]] ], [ [[SUCCESS_RES0]], %[[SUCCESS]] ]
1655
+ // CHECK: [[RETVAL2:%.*]] = phi i1 [ false, %[[SET_ERROR]] ], [ [[SUCCESS_RES1]], %[[SUCCESS]] ]
1656
+ // CHECK: [[RETVAL3:%.*]] = phi float [ 0.000000e+00, %[[SET_ERROR]] ], [ [[SUCCESS_RES2]], %[[SUCCESS]] ]
1657
+ // CHECK: %43 = call i1 (ptr, i1, ...) @llvm.coro.end.async(ptr {{%.*}}, i1 false, ptr @"$s16typed_throws_abi24callNonMatching_f1_asyncySi_SfSbSftSbYaF.0.52", ptr {{%.*}}, ptr {{%.*}}, i64 [[RETVAL0]], float [[RETVAL1]], i1 [[RETVAL2]], float [[RETVAL3]])
1658
+ // CHECK: unreachable
1659
+ // CHECK: [[SET_ERROR]]:
1660
+ // CHECK: [[ERROR_RES0]] = phi i64 [ [[CALL_RES1]], %typed.error.load ]
1661
+ // CHECK: store ptr null, ptr %swifterror, align 8
1662
+ // CHECK: br label %[[COMMON_RET]]
1663
+ // CHECK: }
1664
+ @available ( SwiftStdlib 6 . 0 , * )
1665
+ func callNonMatching_f1_async( _ b: Bool ) async -> ( Int , Float , Bool , Float ) {
1666
+ do {
1667
+ let res = try await nonMatching_f1_async ( b)
1668
+ return ( 1 , res. 0 , res. 1 , res. 2 )
1669
+ } catch {
1670
+ return ( error. x, 0.0 , false , 0.0 )
1671
+ }
1672
+ }
1673
+
1552
1674
protocol P {
1553
1675
// 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)
1554
1676
// CHECK: [[ERROR:%.*]] = load ptr, ptr %2
0 commit comments