File tree Expand file tree Collapse file tree 4 files changed +24
-7
lines changed
test/decl/protocol/conforms Expand file tree Collapse file tree 4 files changed +24
-7
lines changed Original file line number Diff line number Diff line change @@ -708,14 +708,9 @@ static Expr *removeErasureToExistentialError(Expr *expr) {
708
708
709
709
return expr;
710
710
}
711
+ }
711
712
712
- // / Determine whether the given function uses typed throws in a manner
713
- // / than is structurally similar to 'rethrows', e.g.,
714
- // /
715
- // / \code
716
- // / func map<T, E>(_ body: (Element) throws(E) -> T) throws(E) -> [T]
717
- // / \endcode
718
- static bool isRethrowLikeTypedThrows (AbstractFunctionDecl *func) {
713
+ bool swift::isRethrowLikeTypedThrows (AbstractFunctionDecl *func) {
719
714
// This notion is only for compatibility in Swift 5 and is disabled
720
715
// when FullTypedThrows is enabled.
721
716
ASTContext &ctx = func->getASTContext ();
@@ -762,6 +757,8 @@ static bool isRethrowLikeTypedThrows(AbstractFunctionDecl *func) {
762
757
return true ;
763
758
}
764
759
760
+ namespace {
761
+
765
762
// / Determine whether the given rethrows context is only allowed to be
766
763
// / rethrowing because of the historically-rethrowing behavior of
767
764
// / AsyncSequence and AsyncIteratorProtocol.
Original file line number Diff line number Diff line change @@ -45,6 +45,14 @@ enum class ThrownErrorSubtyping {
45
45
ThrownErrorSubtyping compareThrownErrorsForSubtyping (
46
46
Type subThrownError, Type superThrownError, DeclContext *dc);
47
47
48
+ // / Determine whether the given function uses typed throws in a manner
49
+ // / that is structurally similar to 'rethrows', e.g.,
50
+ // /
51
+ // / \code
52
+ // / func map<T, E>(_ body: (Element) throws(E) -> T) throws(E) -> [T]
53
+ // / \endcode
54
+ bool isRethrowLikeTypedThrows (AbstractFunctionDecl *func);
55
+
48
56
}
49
57
50
58
#endif // SWIFT_SEMA_TYPECHECKEFFECTS_H
Original file line number Diff line number Diff line change @@ -603,6 +603,11 @@ RequirementMatch swift::matchWitness(
603
603
}
604
604
605
605
case PolymorphicEffectKind::Always:
606
+ // If the witness is using typed throws in a manner that looks
607
+ // like rethrows, allow it.
608
+ if (isRethrowLikeTypedThrows (funcWitness))
609
+ break ;
610
+
606
611
return RequirementMatch (witness, MatchKind::RethrowsConflict);
607
612
}
608
613
}
Original file line number Diff line number Diff line change @@ -69,3 +69,10 @@ func testAssociatedTypes() {
69
69
func assocFailureType< T: FailureAssociatedType > ( _ value: T , _ error: T . Failure ) throws ( T. Failure) {
70
70
throw error
71
71
}
72
+
73
+ // Allow a typed-throws version of a function to witness a rethrowing function.
74
+ public protocol HasRethrowingMap : Sequence {
75
+ func map< T> ( _ transform: ( Element ) throws -> T ) rethrows -> [ T ]
76
+ }
77
+
78
+ extension Array : HasRethrowingMap { }
You can’t perform that action at this time.
0 commit comments