Skip to content

Commit ce84893

Browse files
authored
Merge pull request #60112 from DougGregor/disable-sendable-completion-handlers-5.7
2 parents cb9aaaa + 76010c5 commit ce84893

File tree

8 files changed

+31
-31
lines changed

8 files changed

+31
-31
lines changed

lib/ClangImporter/ImportType.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2850,7 +2850,7 @@ ImportedType ClangImporter::Implementation::importMethodParamsAndReturnType(
28502850
importType(paramTy, importKind, paramAddDiag,
28512851
allowNSUIntegerAsIntInParam, Bridgeability::Full,
28522852
getImportTypeAttrs(param, /*isParam=*/true,
2853-
/*sendableByDefault=*/paramIsCompletionHandler),
2853+
/*sendableByDefault=*/false),
28542854
optionalityOfParam,
28552855
/*resugarNSErrorPointer=*/!paramIsError,
28562856
completionHandlerErrorParamIndex);

test/Concurrency/objc_async_overload.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,22 +34,22 @@ func asyncWithAwait() async {
3434
// completion handler's implicit `@Sendable` isn't respected.
3535
extension Delegate {
3636
nonisolated func makeRequest(_ req: Request??, completionHandler: (() -> Void)? = nil) {
37-
// expected-note@-1 {{parameter 'completionHandler' is implicitly non-sendable}}
37+
// expected-DISABLED-note@-1 {{parameter 'completionHandler' is implicitly non-sendable}}
3838
if let req = (req ?? nil) {
3939
makeRequest1(req, completionHandler: completionHandler)
40-
// expected-warning@-1 {{passing non-sendable parameter 'completionHandler' to function expecting a @Sendable closure}}
40+
// expected-DISABLED-warning@-1 {{passing non-sendable parameter 'completionHandler' to function expecting a @Sendable closure}}
4141
}
4242
}
4343
}
4444

4545
@MainActor class C {
4646
func finish() { }
47-
// expected-note@-1 {{calls to instance method 'finish()' from outside of its actor context are implicitly asynchronous}}
47+
// expected-DISABLED-note@-1 {{calls to instance method 'finish()' from outside of its actor context are implicitly asynchronous}}
4848

4949
func handle(_ req: Request, with delegate: Delegate) {
5050
delegate.makeRequest1(req) {
5151
self.finish()
52-
// expected-warning@-1 {{call to main actor-isolated instance method 'finish()' in a synchronous nonisolated context; this is an error in Swift 6}}
52+
// expected-DISABLED-warning@-1 {{call to main actor-isolated instance method 'finish()' in a synchronous nonisolated context; this is an error in Swift 6}}
5353
}
5454
}
5555
}

test/IDE/print_clang_objc_async.swift

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ import _Concurrency
1010
// CHECK-LABEL: class SlowServer : NSObject, ServiceProvider {
1111

1212
// CHECK: @available(*, renamed: "doSomethingSlow(_:)")
13-
// CHECK-NEXT: func doSomethingSlow(_ operation: String, completionHandler handler: @escaping @Sendable (Int) -> Void)
13+
// CHECK-NEXT: func doSomethingSlow(_ operation: String, completionHandler handler: @escaping (Int) -> Void)
1414
// CHECK-NEXT: @discardableResult
1515
// CHECK-NEXT: func doSomethingSlow(_ operation: String) async -> Int
1616

1717
// CHECK: @available(*, renamed: "doSomethingDangerous(_:)")
18-
// CHECK-NEXT: func doSomethingDangerous(_ operation: String, completionHandler handler: (@Sendable (String?, Error?) -> Void)? = nil)
18+
// CHECK-NEXT: func doSomethingDangerous(_ operation: String, completionHandler handler: ((String?, Error?) -> Void)? = nil)
1919
// CHECK-NEXT: @discardableResult
2020
// CHECK-NEXT: func doSomethingDangerous(_ operation: String) async throws -> String
2121

@@ -25,37 +25,37 @@ import _Concurrency
2525
// CHECK-NEXT: func doSomethingReckless(_ operation: String) async throws -> String
2626

2727
// CHECK: @available(*, renamed: "checkAvailability()")
28-
// CHECK-NEXT: func checkAvailability(completionHandler: @escaping @Sendable (Bool) -> Void)
28+
// CHECK-NEXT: func checkAvailability(completionHandler: @escaping (Bool) -> Void)
2929
// CHECK-NEXT: @discardableResult
3030
// CHECK-NEXT: func checkAvailability() async -> Bool
3131

3232
// CHECK: @available(*, renamed: "anotherExample()")
33-
// CHECK-NEXT: func anotherExample(completionBlock block: @escaping @Sendable (String) -> Void)
33+
// CHECK-NEXT: func anotherExample(completionBlock block: @escaping (String) -> Void)
3434
// CHECK-NEXT: @discardableResult
3535
// CHECK-NEXT: func anotherExample() async -> String
3636

3737
// CHECK: @available(*, renamed: "finalExample()")
38-
// CHECK-NEXT: func finalExampleWithReply(to block: @escaping @Sendable (String) -> Void)
38+
// CHECK-NEXT: func finalExampleWithReply(to block: @escaping (String) -> Void)
3939
// CHECK-NEXT: @discardableResult
4040
// CHECK-NEXT: func finalExample() async -> String
4141

4242
// CHECK: @available(*, renamed: "replyingOperation(_:)")
43-
// CHECK-NEXT: func replyingOperation(_ operation: String, replyTo block: @escaping @Sendable (String) -> Void)
43+
// CHECK-NEXT: func replyingOperation(_ operation: String, replyTo block: @escaping (String) -> Void)
4444
// CHECK-NEXT: @discardableResult
4545
// CHECK-NEXT: func replyingOperation(_ operation: String) async -> String
4646

4747
// CHECK: @available(*, renamed: "findAnswer()")
48-
// CHECK-NEXT: func findAnswer(completionHandler handler: @escaping @Sendable (String?, Error?) -> Void)
48+
// CHECK-NEXT: func findAnswer(completionHandler handler: @escaping (String?, Error?) -> Void)
4949
// CHECK-NEXT: @discardableResult
5050
// CHECK-NEXT: func findAnswer() async throws -> String
5151

5252
// CHECK: @available(*, renamed: "findAnswerFailingly()")
53-
// CHECK-NEXT: func findAnswerFailingly(completionHandler handler: @escaping @Sendable (String?, Error?) -> Void) throws
53+
// CHECK-NEXT: func findAnswerFailingly(completionHandler handler: @escaping (String?, Error?) -> Void) throws
5454
// CHECK-NEXT: @discardableResult
5555
// CHECK-NEXT: func findAnswerFailingly() async throws -> String
5656

5757
// CHECK: @available(*, renamed: "findQAndA()")
58-
// CHECK-NEXT: func findQAndA(completionHandler handler: @escaping @Sendable (String?, String?, Error?) -> Void)
58+
// CHECK-NEXT: func findQAndA(completionHandler handler: @escaping (String?, String?, Error?) -> Void)
5959
// CHECK-NEXT: @discardableResult
6060
// CHECK-NEXT: func findQAndA() async throws -> (String?, String)
6161

@@ -65,7 +65,7 @@ import _Concurrency
6565
// CHECK-NEXT: func findQuestionableAnswers() async throws -> (String, String?)
6666

6767
// CHECK: @available(*, renamed: "findAnswerableQuestions()")
68-
// CHECK-NEXT: func findAnswerableQuestions(completionHandler handler: @escaping @Sendable (String?, String?, Error?) -> Void)
68+
// CHECK-NEXT: func findAnswerableQuestions(completionHandler handler: @escaping NonsendableCompletionHandler)
6969
// CHECK-NEXT: @discardableResult
7070
// CHECK-NEXT: func findAnswerableQuestions() async throws -> (String, String?)
7171

@@ -75,11 +75,11 @@ import _Concurrency
7575
// CHECK-NEXT: func findUnanswerableQuestions() async throws -> (String, String?)
7676

7777
// CHECK: @available(*, renamed: "doSomethingFun(_:)")
78-
// CHECK-NEXT: func doSomethingFun(_ operation: String, then completionHandler: @escaping @Sendable () -> Void)
78+
// CHECK-NEXT: func doSomethingFun(_ operation: String, then completionHandler: @escaping () -> Void)
7979
// CHECK-NEXT: func doSomethingFun(_ operation: String) async
8080

8181
// CHECK: @available(*, renamed: "doSomethingConflicted(_:)")
82-
// CHECK-NEXT: func doSomethingConflicted(_ operation: String, completionHandler handler: @escaping @Sendable (Int) -> Void)
82+
// CHECK-NEXT: func doSomethingConflicted(_ operation: String, completionHandler handler: @escaping (Int) -> Void)
8383
// CHECK-NEXT: @discardableResult
8484
// CHECK-NEXT: func doSomethingConflicted(_ operation: String) async -> Int
8585
// CHECK-NEXT: @discardableResult
@@ -94,7 +94,7 @@ import _Concurrency
9494
// CHECK-NEXT: func runOnMainThread() async -> String
9595

9696
// CHECK: @available(*, renamed: "asyncImportSame(_:)")
97-
// CHECK-NEXT: func asyncImportSame(_ operation: String, completionHandler handler: @escaping @Sendable (Int) -> Void)
97+
// CHECK-NEXT: func asyncImportSame(_ operation: String, completionHandler handler: @escaping (Int) -> Void)
9898
// CHECK-NEXT: @discardableResult
9999
// CHECK-NEXT: func asyncImportSame(_ operation: String) async -> Int
100100
// CHECK-NEXT: func asyncImportSame(_ operation: String, replyTo handler: @escaping (Int) -> Void)

test/IDE/print_clang_objc_effectful_properties.swift

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,27 +8,27 @@
88

99
// CHECK-LABEL: class EffProps : NSObject {
1010
// CHECK: @available(*, renamed: "getter:doggo()")
11-
// CHECK-NEXT: func getDogWithCompletion(_ completionHandler: @escaping @Sendable (NSObject) -> Void)
11+
// CHECK-NEXT: func getDogWithCompletion(_ completionHandler: @escaping (NSObject) -> Void)
1212
// CHECK: var doggo: NSObject { get async }
1313

1414
// CHECK: @available(*, renamed: "getter:catto()")
15-
// CHECK-NEXT: func obtainCat(_ completionHandler: @escaping @Sendable (NSObject?, Error?) -> Void)
15+
// CHECK-NEXT: func obtainCat(_ completionHandler: @escaping (NSObject?, Error?) -> Void)
1616
// CHECK-NEXT: var catto: NSObject? { get async throws }
1717

1818
// CHECK: @available(*, renamed: "getter:available()")
19-
// CHECK-NEXT: func checkAvailability(completionHandler: @escaping @Sendable (Bool) -> Void)
19+
// CHECK-NEXT: func checkAvailability(completionHandler: @escaping (Bool) -> Void)
2020
// CHECK-NEXT: var available: Bool { get async }
2121
// CHECK-NEXT: @available(swift, obsoleted: 3, renamed: "checkAvailability(completionHandler:)")
22-
// CHECK-NEXT: func checkAvailabilityWithCompletionHandler(_ completionHandler: @escaping @Sendable (Bool) -> Void)
22+
// CHECK-NEXT: func checkAvailabilityWithCompletionHandler(_ completionHandler: @escaping (Bool) -> Void)
2323

2424
// CHECK: @available(*, renamed: "getter:touch()")
25-
// CHECK-NEXT: func returnNothing(completion completionHandler: @escaping @Sendable () -> Void)
25+
// CHECK-NEXT: func returnNothing(completion completionHandler: @escaping () -> Void)
2626
// CHECK-NEXT: var touch: Void { get async }
2727
// CHECK-NEXT: @available(swift, obsoleted: 3, renamed: "returnNothing(completion:)")
28-
// CHECK-NEXT: func returnNothingWithCompletion(_ completionHandler: @escaping @Sendable () -> Void)
28+
// CHECK-NEXT: func returnNothingWithCompletion(_ completionHandler: @escaping () -> Void)
2929

3030
// CHECK: @available(*, renamed: "getter:fromNullableHandler()")
31-
// CHECK-NEXT: func nullableHandler(_ completion: (@Sendable (String) -> Void)? = nil)
31+
// CHECK-NEXT: func nullableHandler(_ completion: ((String) -> Void)? = nil)
3232
// CHECK-NEXT: var fromNullableHandler: String { get async }
3333

3434
// CHECK: @available(*, renamed: "getter:mainDogProp()")

test/IDE/print_objc_concurrency_interface.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import _Concurrency
1313

1414
// rdar://76685011: Make sure we don't print implicit @available in generated interfaces.
1515
// CHECK-NOT: @available
16-
// CHECK: func doSomethingSlow(_ operation: String, completionHandler handler: @escaping @Sendable (Int) -> Void)
16+
// CHECK: func doSomethingSlow(_ operation: String, completionHandler handler: @escaping (Int) -> Void)
1717
// CHECK: func doSomethingSlow(_ operation: String) async -> Int
1818

1919
// NEGATIVE-NOT: @Sendable{{.+}}class

test/IDE/print_omit_needless_words.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,8 @@
8787
// CHECK-FOUNDATION-NEXT: case binary
8888

8989
// Note: Make sure initialisms work in various places
90-
// CHECK-FOUNDATION: open(_: URL!, completionHandler: (@Sendable (Bool) -> Void)!)
91-
// CHECK-FOUNDATION: open(_: NSGUID!, completionHandler: (@Sendable (Bool) -> Void)!)
90+
// CHECK-FOUNDATION: open(_: URL!, completionHandler: ((Bool) -> Void)!)
91+
// CHECK-FOUNDATION: open(_: NSGUID!, completionHandler: ((Bool) -> Void)!)
9292

9393
// Note: property name stripping property type.
9494
// CHECK-FOUNDATION: var uppercased: String
@@ -137,7 +137,7 @@
137137
// CHECK-FOUNDATION: func enumerateObjects(options: NSEnumerationOptions = [], using: ((Any?, Int, UnsafeMutablePointer<ObjCBool>?) -> Void)!)
138138

139139
// Note: WithBlock -> body, nullable closures default to nil.
140-
// CHECK-FOUNDATION: func enumerateObjectsRandomly(block: (@Sendable (Any?, Int, UnsafeMutablePointer<ObjCBool>?) -> Void)? = nil)
140+
// CHECK-FOUNDATION: func enumerateObjectsRandomly(block: ((Any?, Int, UnsafeMutablePointer<ObjCBool>?) -> Void)? = nil)
141141

142142
// Note: id<Proto> treated as "Proto".
143143
// CHECK-FOUNDATION: func doSomething(with: NSCopying)

test/SourceKit/DocSupport/doc_objc_concurrency.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,6 @@
1717
// Especially if the @available was implicitly added to an imported Clang decl
1818
// (rdar://76685011).
1919

20-
// OBJC-DOC: key.fully_annotated_decl: "<decl.function.method.instance><syntaxtype.keyword>func</syntaxtype.keyword> <decl.name>method</decl.name>(<decl.var.parameter><decl.var.parameter.argument_label>withHandler</decl.var.parameter.argument_label> <decl.var.parameter.name>operation</decl.var.parameter.name>: <decl.var.parameter.type><ref.struct usr=\"s:SS\">String</ref.struct>!</decl.var.parameter.type></decl.var.parameter>, <decl.var.parameter><decl.var.parameter.argument_label>completionHandler</decl.var.parameter.argument_label> <decl.var.parameter.name>handler</decl.var.parameter.name>: <decl.var.parameter.type>(<syntaxtype.attribute.builtin><syntaxtype.attribute.name>@Sendable</syntaxtype.attribute.name></syntaxtype.attribute.builtin> (<decl.var.parameter><decl.var.parameter.type><ref.struct usr=\"s:Si\">Int</ref.struct></decl.var.parameter.type></decl.var.parameter>) -&gt; <decl.function.returntype><ref.typealias usr=\"s:s4Voida\">Void</ref.typealias></decl.function.returntype>)!</decl.var.parameter.type></decl.var.parameter>)</decl.function.method.instance>"
20+
// OBJC-DOC: key.fully_annotated_decl: "<decl.function.method.instance><syntaxtype.keyword>func</syntaxtype.keyword> <decl.name>method</decl.name>(<decl.var.parameter><decl.var.parameter.argument_label>withHandler</decl.var.parameter.argument_label> <decl.var.parameter.name>operation</decl.var.parameter.name>: <decl.var.parameter.type><ref.struct usr=\"s:SS\">String</ref.struct>!</decl.var.parameter.type></decl.var.parameter>, <decl.var.parameter><decl.var.parameter.argument_label>completionHandler</decl.var.parameter.argument_label> <decl.var.parameter.name>handler</decl.var.parameter.name>: <decl.var.parameter.type>((<decl.var.parameter><decl.var.parameter.type><ref.struct usr=\"s:Si\">Int</ref.struct></decl.var.parameter.type></decl.var.parameter>) -&gt; <decl.function.returntype><ref.typealias usr=\"s:s4Voida\">Void</ref.typealias></decl.function.returntype>)!</decl.var.parameter.type></decl.var.parameter>)</decl.function.method.instance>"
2121

2222
// OBJC-DOC: key.fully_annotated_decl: "<decl.function.method.instance><syntaxtype.keyword>func</syntaxtype.keyword> <decl.name>method</decl.name>(<decl.var.parameter><decl.var.parameter.argument_label>withHandler</decl.var.parameter.argument_label> <decl.var.parameter.name>operation</decl.var.parameter.name>: <decl.var.parameter.type><ref.struct usr=\"s:SS\">String</ref.struct>!</decl.var.parameter.type></decl.var.parameter>) <syntaxtype.keyword>async</syntaxtype.keyword> -&gt; <decl.function.returntype><ref.struct usr=\"s:Si\">Int</ref.struct></decl.function.returntype></decl.function.method.instance>"

test/SourceKit/InterfaceGen/gen_objc_concurrency.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
// But don't print @available if it was implicitly added to an imported Clang decl (rdar://76685011).
2020
// OBJC-GEN-INTERFACE-LABEL: class ClassWithHandlerMethod {
2121
// OBJC-GEN-INTERFACE-NOT: @available
22-
// OBJC-GEN-INTERFACE: func method(withHandler operation: String!, completionHandler handler: (@Sendable (Int) -> Void)!)
22+
// OBJC-GEN-INTERFACE: func method(withHandler operation: String!, completionHandler handler: ((Int) -> Void)!)
2323
// OBJC-GEN-INTERFACE: func method(withHandler operation: String!) async -> Int
2424

2525
// OBJC-GEN-INTERFACE: @MainActor open func mainActorMethod()

0 commit comments

Comments
 (0)