Skip to content

Commit 2c7e62a

Browse files
ktosotshortli
authored andcommitted
Prevent potential for condfail with owned task executor parameter
While the new parameter is added in a compatible way where code which does not refer to it will get a defaulted nil value; since we refer to a new parameter name in source, we need to guard it with a language feature -- as old compilers will not have this new name available. This should prevent a potential condfail issue.
1 parent 1d20b96 commit 2c7e62a

File tree

3 files changed

+49
-78
lines changed

3 files changed

+49
-78
lines changed

include/swift/Basic/Features.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ LANGUAGE_FEATURE(BuiltinBuildTaskExecutorRef, 0, "TaskExecutor-building builtins
150150
BASELINE_LANGUAGE_FEATURE(BuiltinBuildExecutor, 0, "Executor-building builtins")
151151
LANGUAGE_FEATURE(BuiltinBuildComplexEqualityExecutor, 0, "Executor-building for 'complexEquality executor' builtins")
152152
BASELINE_LANGUAGE_FEATURE(BuiltinBuildMainExecutor, 0, "MainActor executor building builtin")
153+
BASELINE_LANGUAGE_FEATURE(BuiltinCreateAsyncTaskOwnedTaskExecutor, 0, "Task create with owned TaskExecutor")
153154
BASELINE_LANGUAGE_FEATURE(BuiltinCreateAsyncTaskInGroup, 0, "Task create in task group builtin with extra flags")
154155
LANGUAGE_FEATURE(BuiltinCreateAsyncTaskInGroupWithExecutor, 0, "Task create in task group builtin with extra flags")
155156
LANGUAGE_FEATURE(BuiltinCreateAsyncDiscardingTaskInGroup, 0, "Task create in discarding task group builtin, accounting for the Void return type")

stdlib/public/Concurrency/Task+TaskExecutor.swift

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -229,23 +229,23 @@ extension Task where Failure == Never {
229229
self = Self.init(priority: priority, operation: operation)
230230
return
231231
}
232-
#if $BuiltinCreateAsyncTaskWithExecutor && $BuiltinCreateTask
233232
// Set up the job flags for a new task.
234233
let flags = taskCreateFlags(
235234
priority: priority, isChildTask: false, copyTaskLocals: true,
236235
inheritContext: true, enqueueJob: true,
237236
addPendingGroupTaskUnconditionally: false,
238237
isDiscardingTask: false)
239238

239+
#if $BuiltinCreateAsyncTaskOwnedTaskExecutor
240240
let (task, _) = Builtin.createTask(
241241
flags: flags,
242242
initialTaskExecutorConsuming: taskExecutor,
243243
operation: operation)
244244

245245
self._task = task
246-
#else
247-
fatalError("Unsupported Swift compiler, missing support for BuiltinCreateAsyncTaskWithExecutor or $BuiltinCreateTask")
248-
#endif
246+
#else
247+
fatalError("Unsupported Swift compiler, missing support for BuiltinCreateAsyncTaskOwnedTaskExecutor")
248+
#endif
249249
}
250250
}
251251

@@ -289,23 +289,23 @@ extension Task where Failure == Error {
289289
self = Self.init(priority: priority, operation: operation)
290290
return
291291
}
292-
#if $BuiltinCreateAsyncTaskWithExecutor && $BuiltinCreateTask
293292
// Set up the job flags for a new task.
294293
let flags = taskCreateFlags(
295294
priority: priority, isChildTask: false, copyTaskLocals: true,
296295
inheritContext: true, enqueueJob: true,
297296
addPendingGroupTaskUnconditionally: false,
298297
isDiscardingTask: false)
299298

299+
#if $BuiltinCreateAsyncTaskOwnedTaskExecutor
300300
let (task, _) = Builtin.createTask(
301301
flags: flags,
302302
initialTaskExecutorConsuming: taskExecutor,
303303
operation: operation)
304304

305305
self._task = task
306-
#else
307-
fatalError("Unsupported Swift compiler, missing support for BuiltinCreateAsyncTaskWithExecutor or $BuiltinCreateTask")
308-
#endif
306+
#else
307+
fatalError("Unsupported Swift compiler, missing support for BuiltinCreateAsyncTaskOwnedTaskExecutor")
308+
#endif
309309
}
310310
}
311311

@@ -347,24 +347,24 @@ extension Task where Failure == Never {
347347
guard let taskExecutor else {
348348
return Self.detached(priority: priority, operation: operation)
349349
}
350-
#if $BuiltinCreateAsyncTaskWithExecutor && $BuiltinCreateTask
351350
// Set up the job flags for a new task.
352351
let flags = taskCreateFlags(
353352
priority: priority, isChildTask: false, copyTaskLocals: false,
354353
inheritContext: false, enqueueJob: true,
355354
addPendingGroupTaskUnconditionally: false,
356355
isDiscardingTask: false)
357356

357+
#if $BuiltinCreateAsyncTaskOwnedTaskExecutor
358358
let (task, _) = Builtin.createTask(
359359
flags: flags,
360360
// initialTaskExecutor: executorBuiltin, deprecated
361361
initialTaskExecutorConsuming: taskExecutor,
362362
operation: operation)
363363

364364
return Task(task)
365-
#else
366-
fatalError("Unsupported Swift compiler, missing support for BuiltinCreateAsyncTaskWithExecutor or $BuiltinCreateTask")
367-
#endif
365+
#else
366+
fatalError("Unsupported Swift compiler, missing support for BuiltinCreateAsyncTaskOwnedTaskExecutor")
367+
#endif
368368
}
369369
}
370370

@@ -406,23 +406,23 @@ extension Task where Failure == Error {
406406
guard let taskExecutor else {
407407
return Self.detached(priority: priority, operation: operation)
408408
}
409-
#if $BuiltinCreateAsyncTaskWithExecutor && $BuiltinCreateTask
410409
// Set up the job flags for a new task.
411410
let flags = taskCreateFlags(
412411
priority: priority, isChildTask: false, copyTaskLocals: false,
413412
inheritContext: false, enqueueJob: true,
414413
addPendingGroupTaskUnconditionally: false,
415414
isDiscardingTask: false)
416415

416+
#if $BuiltinCreateAsyncTaskOwnedTaskExecutor
417417
let (task, _) = Builtin.createTask(
418418
flags: flags,
419419
initialTaskExecutorConsuming: taskExecutor,
420420
operation: operation)
421421

422422
return Task(task)
423-
#else
424-
fatalError("Unsupported Swift compiler, missing support for BuiltinCreateAsyncTaskWithExecutor or $BuiltinCreateTask")
425-
#endif
423+
#else
424+
fatalError("Unsupported Swift compiler, missing support for BuiltinCreateAsyncTaskOwnedTaskExecutor")
425+
#endif
426426
}
427427
}
428428

stdlib/public/Concurrency/TaskGroup+TaskExecutor.swift

Lines changed: 32 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -52,17 +52,15 @@ extension TaskGroup {
5252
let builtinSerialExecutor =
5353
Builtin.extractFunctionIsolation(operation)?.unownedExecutor.executor
5454

55+
#if $BuiltinCreateAsyncTaskOwnedTaskExecutor
5556
_ = Builtin.createTask(flags: flags,
5657
initialSerialExecutor: builtinSerialExecutor,
5758
taskGroup: _group,
5859
initialTaskExecutorConsuming: taskExecutor,
5960
operation: operation)
60-
#else
61-
_ = Builtin.createAsyncTaskInGroupWithExecutor(flags, _group, executorBuiltin, operation)
62-
#endif
63-
#else
64-
fatalError("Unsupported Swift compiler")
65-
#endif
61+
#else
62+
fatalError("Unsupported Swift compiler, missing support for BuiltinCreateAsyncTaskOwnedTaskExecutor")
63+
#endif
6664
}
6765

6866
/// Adds a child task to the group and enqueue it on the specified executor, unless the group has been canceled.
@@ -89,7 +87,6 @@ extension TaskGroup {
8987
guard let taskExecutor else {
9088
return self.addTaskUnlessCancelled(priority: priority, operation: operation)
9189
}
92-
#if $BuiltinCreateAsyncTaskInGroupWithExecutor
9390
let canAdd = _taskGroupAddPendingTask(group: _group, unconditionally: false)
9491

9592
guard canAdd else {
@@ -103,22 +100,19 @@ extension TaskGroup {
103100
isDiscardingTask: false)
104101

105102
// Create the task in this group with an executor preference.
106-
#if $BuiltinCreateTask
107103
let builtinSerialExecutor =
108104
Builtin.extractFunctionIsolation(operation)?.unownedExecutor.executor
109105

106+
#if $BuiltinCreateAsyncTaskOwnedTaskExecutor
110107
_ = Builtin.createTask(flags: flags,
111108
initialSerialExecutor: builtinSerialExecutor,
112109
taskGroup: _group,
113110
initialTaskExecutorConsuming: taskExecutor,
114111
operation: operation)
115-
#else
116-
_ = Builtin.createAsyncTaskInGroupWithExecutor(flags, _group, executorBuiltin, operation)
117-
#endif
118112
return true
119-
#else
120-
fatalError("Unsupported Swift compiler")
121-
#endif
113+
#else
114+
fatalError("Unsupported Swift compiler, missing support for BuiltinCreateAsyncTaskOwnedTaskExecutor")
115+
#endif
122116
}
123117
}
124118

@@ -149,29 +143,25 @@ extension ThrowingTaskGroup {
149143
guard let taskExecutor else {
150144
return self.addTask(priority: priority, operation: operation)
151145
}
152-
#if $BuiltinCreateAsyncTaskInGroupWithExecutor
153146
let flags = taskCreateFlags(
154147
priority: priority, isChildTask: true, copyTaskLocals: false,
155148
inheritContext: false, enqueueJob: true,
156149
addPendingGroupTaskUnconditionally: true,
157150
isDiscardingTask: false)
158151

159152
// Create the task in this group with an executor preference.
160-
#if $BuiltinCreateTask
161153
let builtinSerialExecutor =
162154
Builtin.extractFunctionIsolation(operation)?.unownedExecutor.executor
163155

156+
#if $BuiltinCreateAsyncTaskOwnedTaskExecutor
164157
_ = Builtin.createTask(flags: flags,
165158
initialSerialExecutor: builtinSerialExecutor,
166159
taskGroup: _group,
167160
initialTaskExecutorConsuming: taskExecutor,
168161
operation: operation)
169-
#else
170-
_ = Builtin.createAsyncTaskInGroupWithExecutor(flags, _group, executorBuiltin, operation)
171-
#endif
172-
#else
173-
fatalError("Unsupported Swift compiler")
174-
#endif
162+
#else
163+
fatalError("Unsupported Swift compiler, missing support for BuiltinCreateAsyncTaskOwnedTaskExecutor")
164+
#endif
175165
}
176166

177167
/// Adds a child task to the group and enqueue it on the specified executor, unless the group has been canceled.
@@ -194,7 +184,6 @@ extension ThrowingTaskGroup {
194184
guard let taskExecutor else {
195185
return self.addTaskUnlessCancelled(priority: priority, operation: operation)
196186
}
197-
#if $BuiltinCreateAsyncTaskInGroupWithExecutor
198187
let canAdd = _taskGroupAddPendingTask(group: _group, unconditionally: false)
199188

200189
guard canAdd else {
@@ -208,22 +197,19 @@ extension ThrowingTaskGroup {
208197
isDiscardingTask: false)
209198

210199
// Create the task in this group with an executor preference.
211-
#if $BuiltinCreateTask
212200
let builtinSerialExecutor =
213201
Builtin.extractFunctionIsolation(operation)?.unownedExecutor.executor
214202

203+
#if $BuiltinCreateAsyncTaskOwnedTaskExecutor
215204
_ = Builtin.createTask(flags: flags,
216205
initialSerialExecutor: builtinSerialExecutor,
217206
taskGroup: _group,
218207
initialTaskExecutorConsuming: taskExecutor,
219208
operation: operation)
220-
#else
221-
_ = Builtin.createAsyncTaskInGroupWithExecutor(flags, _group, executorBuiltin, operation)
222-
#endif
223209
return true
224-
#else
225-
fatalError("Unsupported Swift compiler")
226-
#endif
210+
#else
211+
fatalError("Unsupported Swift compiler, missing support for BuiltinCreateAsyncTaskOwnedTaskExecutor")
212+
#endif
227213
}
228214
}
229215

@@ -254,29 +240,25 @@ extension DiscardingTaskGroup {
254240
guard let taskExecutor else {
255241
return self.addTask(priority: priority, operation: operation)
256242
}
257-
#if $BuiltinCreateAsyncDiscardingTaskInGroupWithExecutor
258243
let flags = taskCreateFlags(
259244
priority: priority, isChildTask: true, copyTaskLocals: false,
260245
inheritContext: false, enqueueJob: true,
261246
addPendingGroupTaskUnconditionally: true,
262247
isDiscardingTask: true)
263248

264249
// Create the task in this group with an executor preference.
265-
#if $BuiltinCreateTask
266250
let builtinSerialExecutor =
267251
Builtin.extractFunctionIsolation(operation)?.unownedExecutor.executor
268252

253+
#if $BuiltinCreateAsyncTaskOwnedTaskExecutor
269254
_ = Builtin.createTask(flags: flags,
270255
initialSerialExecutor: builtinSerialExecutor,
271256
taskGroup: _group,
272257
initialTaskExecutorConsuming: taskExecutor,
273258
operation: operation)
274-
#else
275-
_ = Builtin.createAsyncDiscardingTaskInGroupWithExecutor(flags, _group, executorBuiltin, operation)
276-
#endif
277-
#else
278-
fatalError("Unsupported Swift compiler")
279-
#endif
259+
#else
260+
fatalError("Unsupported Swift compiler, missing support for BuiltinCreateAsyncTaskOwnedTaskExecutor")
261+
#endif
280262
}
281263

282264
/// Adds a child task to the group and set it up with the passed in task executor preference,
@@ -304,7 +286,6 @@ extension DiscardingTaskGroup {
304286
guard let taskExecutor else {
305287
return self.addTaskUnlessCancelled(priority: priority, operation: operation)
306288
}
307-
#if $BuiltinCreateAsyncDiscardingTaskInGroupWithExecutor
308289
let canAdd = _taskGroupAddPendingTask(group: _group, unconditionally: false)
309290

310291
guard canAdd else {
@@ -318,22 +299,19 @@ extension DiscardingTaskGroup {
318299
)
319300

320301
// Create the task in this group with an executor preference.
321-
#if $BuiltinCreateTask
322302
let builtinSerialExecutor =
323303
Builtin.extractFunctionIsolation(operation)?.unownedExecutor.executor
324304

305+
#if $BuiltinCreateAsyncTaskOwnedTaskExecutor
325306
_ = Builtin.createTask(flags: flags,
326307
initialSerialExecutor: builtinSerialExecutor,
327308
taskGroup: _group,
328309
initialTaskExecutorConsuming: taskExecutor,
329310
operation: operation)
330-
#else
331-
_ = Builtin.createAsyncDiscardingTaskInGroupWithExecutor(flags, _group, executorBuiltin, operation)
332-
#endif
333311
return true
334-
#else
335-
fatalError("Unsupported Swift compiler")
336-
#endif
312+
#else
313+
fatalError("Unsupported Swift compiler, missing support for BuiltinCreateAsyncTaskOwnedTaskExecutor")
314+
#endif
337315
}
338316
}
339317

@@ -364,29 +342,25 @@ extension ThrowingDiscardingTaskGroup {
364342
guard let taskExecutor else {
365343
return self.addTask(priority: priority, operation: operation)
366344
}
367-
#if $BuiltinCreateAsyncDiscardingTaskInGroupWithExecutor
368345
let flags = taskCreateFlags(
369346
priority: priority, isChildTask: true, copyTaskLocals: false,
370347
inheritContext: false, enqueueJob: true,
371348
addPendingGroupTaskUnconditionally: true,
372349
isDiscardingTask: true)
373350

374351
// Create the task in this group with an executor preference.
375-
#if $BuiltinCreateTask
376352
let builtinSerialExecutor =
377353
Builtin.extractFunctionIsolation(operation)?.unownedExecutor.executor
378354

355+
#if $BuiltinCreateAsyncTaskOwnedTaskExecutor
379356
_ = Builtin.createTask(flags: flags,
380357
initialSerialExecutor: builtinSerialExecutor,
381358
taskGroup: _group,
382359
initialTaskExecutorConsuming: taskExecutor,
383360
operation: operation)
384-
#else
385-
_ = Builtin.createAsyncDiscardingTaskInGroupWithExecutor(flags, _group, executorBuiltin, operation)
386-
#endif
387-
#else
388-
fatalError("Unsupported Swift compiler")
389-
#endif
361+
#else
362+
fatalError("Unsupported Swift compiler, missing support for BuiltinCreateAsyncTaskOwnedTaskExecutor")
363+
#endif
390364
}
391365

392366
/// Adds a child task to the group and set it up with the passed in task executor preference,
@@ -414,7 +388,6 @@ extension ThrowingDiscardingTaskGroup {
414388
guard let taskExecutor else {
415389
return self.addTaskUnlessCancelled(priority: priority, operation: operation)
416390
}
417-
#if $BuiltinCreateAsyncDiscardingTaskInGroupWithExecutor
418391
let canAdd = _taskGroupAddPendingTask(group: _group, unconditionally: false)
419392

420393
guard canAdd else {
@@ -428,22 +401,19 @@ extension ThrowingDiscardingTaskGroup {
428401
)
429402

430403
// Create the task in this group with an executor preference.
431-
#if $BuiltinCreateTask
432404
let builtinSerialExecutor =
433405
Builtin.extractFunctionIsolation(operation)?.unownedExecutor.executor
434406

407+
#if $BuiltinCreateAsyncTaskOwnedTaskExecutor
435408
_ = Builtin.createTask(flags: flags,
436409
initialSerialExecutor: builtinSerialExecutor,
437410
taskGroup: _group,
438411
initialTaskExecutorConsuming: taskExecutor,
439412
operation: operation)
440-
#else
441-
_ = Builtin.createAsyncDiscardingTaskInGroupWithExecutor(flags, _group, executorBuiltin, operation)
442-
#endif
443413
return true
444-
#else
445-
fatalError("Unsupported Swift compiler")
446-
#endif
414+
#else
415+
fatalError("Unsupported Swift compiler, missing support for BuiltinCreateAsyncTaskOwnedTaskExecutor")
416+
#endif
447417
}
448418
}
449419

0 commit comments

Comments
 (0)