Skip to content

Commit 4d6a517

Browse files
committed
cannot use guard let taskExecutor since we'd infinite recurse
1 parent 210a3e0 commit 4d6a517

File tree

3 files changed

+38
-37
lines changed

3 files changed

+38
-37
lines changed

stdlib/public/Concurrency/Task+TaskExecutor.swift

Lines changed: 36 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -232,11 +232,6 @@ extension Task where Failure == Never {
232232
priority: TaskPriority? = nil,
233233
operation: sending @escaping () async -> Success
234234
) {
235-
guard let taskExecutor else {
236-
self = Self.init(name: name, priority: priority, operation: operation)
237-
return
238-
}
239-
240235
// Set up the job flags for a new task.
241236
let flags = taskCreateFlags(
242237
priority: priority,
@@ -269,15 +264,21 @@ extension Task where Failure == Never {
269264
initialTaskExecutorConsuming: taskExecutor,
270265
operation: operation).0
271266
}
272-
#endif // $BuiltinCreateAsyncTaskOwnedTaskExecutor
273-
274-
if task == nil {
267+
#else // $BuiltinCreateAsyncTaskOwnedTaskExecutor
268+
if task == nil, let taskExecutor {
275269
let executorBuiltin: Builtin.Executor =
276270
taskExecutor.asUnownedTaskExecutor().executor
277271
task = Builtin.createAsyncTaskWithExecutor(
278272
flags, executorBuiltin, operation).0
279273
}
274+
#endif // $BuiltinCreateAsyncTaskOwnedTaskExecutor
275+
276+
if task == nil {
277+
assert(taskExecutor == nil)
278+
task = Builtin.createAsyncTask(flags, operation).0
279+
}
280280

281+
assert(task != nil, "Task must have been initialized by now")
281282
self._task = task!
282283
}
283284
}
@@ -320,11 +321,6 @@ extension Task where Failure == Error {
320321
priority: TaskPriority? = nil,
321322
operation: sending @escaping () async throws -> Success
322323
) {
323-
guard let taskExecutor else {
324-
self = Self.init(name: name, priority: priority, operation: operation)
325-
return
326-
}
327-
328324
// Set up the job flags for a new task.
329325
let flags = taskCreateFlags(
330326
priority: priority,
@@ -357,15 +353,21 @@ extension Task where Failure == Error {
357353
initialTaskExecutorConsuming: taskExecutor,
358354
operation: operation).0
359355
}
360-
#endif // $BuiltinCreateAsyncTaskOwnedTaskExecutor
361-
362-
if task == nil {
356+
#else // $BuiltinCreateAsyncTaskOwnedTaskExecutor
357+
if task == nil, let taskExecutor {
363358
let executorBuiltin: Builtin.Executor =
364359
taskExecutor.asUnownedTaskExecutor().executor
365360
task = Builtin.createAsyncTaskWithExecutor(
366361
flags, executorBuiltin, operation).0
367362
}
363+
#endif // $BuiltinCreateAsyncTaskOwnedTaskExecutor
364+
365+
if task == nil {
366+
assert(taskExecutor == nil)
367+
task = Builtin.createAsyncTask(flags, operation).0
368+
}
368369

370+
assert(task != nil, "Task must have been initialized by now")
369371
self._task = task!
370372
}
371373
}
@@ -407,10 +409,6 @@ extension Task where Failure == Never {
407409
priority: TaskPriority? = nil,
408410
operation: sending @escaping () async -> Success
409411
) -> Task<Success, Failure> {
410-
guard let taskExecutor else {
411-
return Self.detached(name: name, priority: priority, operation: operation)
412-
}
413-
414412
// Set up the job flags for a new task.
415413
let flags = taskCreateFlags(
416414
priority: priority,
@@ -443,15 +441,21 @@ extension Task where Failure == Never {
443441
initialTaskExecutorConsuming: taskExecutor,
444442
operation: operation).0
445443
}
446-
#endif // $BuiltinCreateAsyncTaskOwnedTaskExecutor
447-
448-
if task == nil {
444+
#else // $BuiltinCreateAsyncTaskOwnedTaskExecutor
445+
if task == nil, let taskExecutor {
449446
let executorBuiltin: Builtin.Executor =
450447
taskExecutor.asUnownedTaskExecutor().executor
451448
task = Builtin.createAsyncTaskWithExecutor(
452449
flags, executorBuiltin, operation).0
453450
}
451+
#endif // $BuiltinCreateAsyncTaskOwnedTaskExecutor
452+
453+
if task == nil {
454+
assert(taskExecutor == nil)
455+
task = Builtin.createAsyncTask(flags, operation).0
456+
}
454457

458+
assert(task != nil, "Task must have been initialized by now")
455459
return Task(task!)
456460
}
457461
}
@@ -525,21 +529,18 @@ extension Task where Failure == Error {
525529
initialTaskExecutorConsuming: taskExecutor,
526530
operation: operation).0
527531
}
532+
#else // $BuiltinCreateAsyncTaskOwnedTaskExecutor
533+
if task == nil, let taskExecutor {
534+
let executorBuiltin: Builtin.Executor =
535+
taskExecutor.asUnownedTaskExecutor().executor
536+
task = Builtin.createAsyncTaskWithExecutor(
537+
flags, executorBuiltin, operation).0
538+
}
528539
#endif // $BuiltinCreateAsyncTaskOwnedTaskExecutor
529540

530541
if task == nil {
531-
if let taskExecutor {
532-
let executorBuiltin: Builtin.Executor =
533-
taskExecutor.asUnownedTaskExecutor().executor
534-
task = Builtin.createAsyncTaskWithExecutor(
535-
flags, executorBuiltin, operation).0
536-
} else {
537-
assert(taskExecutor == nil)
538-
task = Builtin.createTask(
539-
flags: flags,
540-
// no initialSerialExecutor since not isolated(any)
541-
operation: operation).0
542-
}
542+
assert(taskExecutor == nil)
543+
task = Builtin.createAsyncTask(flags, operation).0
543544
}
544545

545546
return Task(task!)

test/Concurrency/transfernonsendable.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1767,7 +1767,7 @@ extension MyActor {
17671767
_ = sc
17681768

17691769
Task { // expected-tns-warning {{sending value of non-Sendable type '() async -> ()' risks causing data races}}
1770-
// expected-tns-note @-1 {{Passing value of non-Sendable type '() async -> ()' as a 'sending' argument to initializer 'init(name:priority:operation:)' risks causing races in between local and caller code}}
1770+
// expected-tns-note @-1 {{Passing value of non-Sendable type '() async -> ()' as a 'sending' argument to initializer 'init(priority:operation:)' risks causing races in between local and caller code}}
17711771
_ = sc
17721772
}
17731773

test/Concurrency/transfernonsendable_typed_errors.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ extension MyActor {
6060
_ = sc
6161

6262
Task { // expected-error {{sending value of non-Sendable type '() async -> ()' risks causing data races}}
63-
// expected-note @-1 {{Passing value of non-Sendable type '() async -> ()' as a 'sending' argument to initializer 'init(name:priority:operation:)' risks causing races in between local and caller code}}
63+
// expected-note @-1 {{Passing value of non-Sendable type '() async -> ()' as a 'sending' argument to initializer 'init(priority:operation:)' risks causing races in between local and caller code}}
6464
_ = sc
6565
}
6666

0 commit comments

Comments
 (0)