File tree Expand file tree Collapse file tree 3 files changed +39
-4
lines changed Expand file tree Collapse file tree 3 files changed +39
-4
lines changed Original file line number Diff line number Diff line change @@ -110,6 +110,10 @@ struct ExistentialLayout {
110
110
// / Zero or more primary associated type requirements from a
111
111
// / ParameterizedProtocolType
112
112
ArrayRef<Type> sameTypeRequirements;
113
+
114
+ // / Existentials allow a relaxed notion of \c ValueDecl::isObjC
115
+ // / that includes `Sendable` protocol.
116
+ static bool isObjCProtocol (ProtocolDecl *P);
113
117
};
114
118
115
119
}
Original file line number Diff line number Diff line change @@ -342,7 +342,7 @@ ExistentialLayout::ExistentialLayout(CanProtocolType type) {
342
342
343
343
hasExplicitAnyObject = false ;
344
344
hasInverseCopyable = false ;
345
- containsNonObjCProtocol = !protoDecl-> isObjC ( );
345
+ containsNonObjCProtocol = !isObjCProtocol (protoDecl );
346
346
containsParameterized = false ;
347
347
348
348
protocols.push_back (protoDecl);
@@ -392,9 +392,7 @@ ExistentialLayout::ExistentialLayout(CanProtocolCompositionType type) {
392
392
protoDecl = parameterized->getProtocol ();
393
393
containsParameterized = true ;
394
394
}
395
- containsNonObjCProtocol |=
396
- !protoDecl->isObjC () &&
397
- !protoDecl->isSpecificProtocol (KnownProtocolKind::Sendable);
395
+ containsNonObjCProtocol |= !isObjCProtocol (protoDecl);
398
396
protocols.push_back (protoDecl);
399
397
}
400
398
}
@@ -405,6 +403,10 @@ ExistentialLayout::ExistentialLayout(CanParameterizedProtocolType type)
405
403
containsParameterized = true ;
406
404
}
407
405
406
+ bool ExistentialLayout::isObjCProtocol (ProtocolDecl *P) {
407
+ return P->isObjC () || P->isSpecificProtocol (KnownProtocolKind::Sendable);
408
+ }
409
+
408
410
ExistentialLayout TypeBase::getExistentialLayout () {
409
411
return getCanonicalType ().getExistentialLayout ();
410
412
}
Original file line number Diff line number Diff line change
1
+ // RUN: %empty-directory(%t)
2
+ // RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -typecheck %s -parse-as-library -emit-objc-header-path %t/swift.h
3
+ // RUN: %FileCheck %s < %t/swift.h
4
+
5
+ // REQUIRES: concurrency
6
+ // REQUIRES: asserts
7
+ // REQUIRES: objc_interop
8
+
9
+ import Foundation
10
+
11
+ @objc public protocol P { }
12
+
13
+ @objc public class Klass : NSObject {
14
+ // CHECK: - (void)test1:(NSDictionary<NSString *, id> * _Nonnull)_;
15
+ @objc public func test1( _: [ String : any Sendable ] ) { }
16
+ // CHECK: - (void)test2:(NSDictionary<NSString *, id <P>> * _Nonnull)_;
17
+ @objc public func test2( _: [ String : any P & Sendable ] ) { }
18
+ }
19
+
20
+ @objc public protocol Q {
21
+ // CHECK: - (NSArray<NSDictionary<NSString *, id> *> * _Nonnull)data1 SWIFT_WARN_UNUSED_RESULT;
22
+ func data1( ) -> [ [ String : any Sendable ] ]
23
+ // CHECK: - (NSArray<id> * _Nullable)data2 SWIFT_WARN_UNUSED_RESULT;
24
+ func data2( ) -> [ any Sendable ] ?
25
+ // CHECK: - (void)data3:(id _Nonnull)_;
26
+ func data3( _: any Sendable )
27
+ // CHECK: - (void)data4:(id _Nullable)_;
28
+ func data4( _: ( any Sendable ) ? )
29
+ }
You can’t perform that action at this time.
0 commit comments