Skip to content

Commit 9608c1d

Browse files
committed
Simplify the expansion of @Test by eliminating the isolated thunk.
This PR removes one of the thunks we emit when expanding `@Test`. For example, given the following test function: ```swift @test func foo() {} ``` We currently emit, approximately: ```swift @available(*, deprecated, message: "This function is an implementation detail of the testing library. Do not use it directly.") @sendable private func $s12TestingTests3foo4TestfMp_17Z152ec26a56a4f672fMu_() async throws -> Void { @sendable func $s12TestingTests3foo4TestfMp_7__localfMu_(_:isolated (any _Concurrency.Actor)?=Testing.__defaultSynchronousIsolationContext) async throws { _ = unsafe try await Testing.__requiringUnsafe(Testing.__requiringTry(Testing.__requiringAwait(foo()))) } try await $s12TestingTests3foo4TestfMp_7__localfMu_() } @available(*, deprecated, message: "This property is an implementation detail of the testing library. Do not use it directly.") @sendable private func $s12TestingTests3foo4TestfMp_25generator152ec26a56a4f672fMu_() async -> Testing.Test { return .__function( named: "foo()", in: nil as Swift.Never.Type?, xcTestCompatibleSelector: nil, traits: [],sourceBounds: Testing.__SourceBounds(__uncheckedLowerBound: Testing.SourceLocation(__uncheckedFileID: "TestingTests/ZipTests.swift", filePath: "/Volumes/Dev/Source/swift-testing-public/Tests/TestingTests/ZipTests.swift", line: 30, column: 2), upperBound: (30, 20)), parameters: [], testFunction: $s12TestingTests3foo4TestfMp_17Z152ec26a56a4f672fMu_ ) } @section("__DATA_CONST,__swift5_tests") @used @available(*, deprecated, message: "This property is an implementation detail of the testing library. Do not use it directly.") private nonisolated let $s12TestingTests3foo4TestfMp_33testContentRecord152ec26a56a4f672fMu_: Testing.__TestContentRecord = ( 0x74657374, /* 'test' */ 0, { outValue, type, _, _ in Testing.Test.__store($s12TestingTests3foo4TestfMp_25generator152ec26a56a4f672fMu_, into: outValue, asTypeAt: type) }, 0, 0 ) ``` Note that the first thunk function has a nested thunk function that serves only to impose actor isolation on the actual test function. This change replaces that thunk with `nonisolated(nonsending)` in appropriate locations throughout the macro target and library target. After this change, we emit a simpler expansion: ```swift @available(*, deprecated, message: "This function is an implementation detail of the testing library. Do not use it directly.") @sendable private nonisolated(nonsending) func $s12TestingTests3foo4TestfMp_17Z152ec26a56a4f672fMu_() async throws -> Void { _ = unsafe try await Testing.__requiringUnsafe(Testing.__requiringTry(Testing.__requiringAwait(foo()))) } @available(*, deprecated, message: "This function is an implementation detail of the testing library. Do not use it directly.") @sendable private nonisolated(nonsending) func $s12TestingTests3foo4TestfMp_25generator152ec26a56a4f672fMu_() async -> Testing.Test { return .__function( named: "foo()", in: nil as Swift.Never.Type?, xcTestCompatibleSelector: nil, traits: [],sourceBounds: Testing.__SourceBounds(__uncheckedLowerBound: Testing.SourceLocation(__uncheckedFileID: "TestingTests/ZipTests.swift", filePath: "/Volumes/Dev/Source/swift-testing-public/Tests/TestingTests/ZipTests.swift", line: 30, column: 2), upperBound: (30, 20)), parameters: [], testFunction: $s12TestingTests3foo4TestfMp_17Z152ec26a56a4f672fMu_ ) } @section("__DATA_CONST,__swift5_tests") @used @available(*, deprecated, message: "This property is an implementation detail of the testing library. Do not use it directly.") private nonisolated let $s12TestingTests3foo4TestfMp_33testContentRecord152ec26a56a4f672fMu_: Testing.__TestContentRecord = ( 0x74657374, /* 'test' */ 0, { outValue, type, _, _ in Testing.Test.__store($s12TestingTests3foo4TestfMp_25generator152ec26a56a4f672fMu_, into: outValue, asTypeAt: type) }, 0, 0 ) ```
1 parent 2a16d3d commit 9608c1d

11 files changed

Lines changed: 62 additions & 85 deletions

File tree

Sources/Testing/Parameterization/Test.Case.Generator.swift

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ extension Test.Case {
5757
/// - Parameters:
5858
/// - testFunction: The test function called by the generated test case.
5959
init(
60-
testFunction: @escaping @Sendable () async throws -> Void
60+
testFunction: nonisolated(nonsending) @escaping @Sendable () async throws -> Void
6161
) where S == CollectionOfOne<Void> {
6262
// A beautiful hack to give us the right number of cases: iterate over a
6363
// collection containing a single Void value.
@@ -85,7 +85,7 @@ extension Test.Case {
8585
init(
8686
arguments collection: S,
8787
parameters: [Test.Parameter],
88-
testFunction: @escaping @Sendable (S.Element) async throws -> Void
88+
testFunction: nonisolated(nonsending) @escaping @Sendable (S.Element) async throws -> Void
8989
) where S: Collection {
9090
if parameters.count > 1 {
9191
self.init(sequence: collection) { element in
@@ -124,7 +124,7 @@ extension Test.Case {
124124
init<C1, C2>(
125125
arguments collection1: C1, _ collection2: C2,
126126
parameters: [Test.Parameter],
127-
testFunction: @escaping @Sendable (C1.Element, C2.Element) async throws -> Void
127+
testFunction: nonisolated(nonsending) @escaping @Sendable (C1.Element, C2.Element) async throws -> Void
128128
) where S == CartesianProduct<C1, C2> {
129129
self.init(sequence: cartesianProduct(collection1, collection2)) { element in
130130
Test.Case(values: [element.0, element.1], parameters: parameters) {
@@ -154,7 +154,7 @@ extension Test.Case {
154154
private init<E1, E2>(
155155
sequence: S,
156156
parameters: [Test.Parameter],
157-
testFunction: @escaping @Sendable ((E1, E2)) async throws -> Void
157+
testFunction: nonisolated(nonsending) @escaping @Sendable ((E1, E2)) async throws -> Void
158158
) where S.Element == (E1, E2), E1: Sendable, E2: Sendable {
159159
if parameters.count > 1 {
160160
self.init(sequence: sequence) { element in
@@ -192,7 +192,7 @@ extension Test.Case {
192192
init<E1, E2>(
193193
arguments collection: S,
194194
parameters: [Test.Parameter],
195-
testFunction: @escaping @Sendable ((E1, E2)) async throws -> Void
195+
testFunction: nonisolated(nonsending) @escaping @Sendable ((E1, E2)) async throws -> Void
196196
) where S: Collection, S.Element == (E1, E2) {
197197
self.init(sequence: collection, parameters: parameters, testFunction: testFunction)
198198
}
@@ -210,7 +210,7 @@ extension Test.Case {
210210
init<C1, C2>(
211211
arguments zippedCollections: Zip2Sequence<C1, C2>,
212212
parameters: [Test.Parameter],
213-
testFunction: @escaping @Sendable ((C1.Element, C2.Element)) async throws -> Void
213+
testFunction: nonisolated(nonsending) @escaping @Sendable ((C1.Element, C2.Element)) async throws -> Void
214214
) where S == Zip2Sequence<C1, C2>, C1: Collection, C2: Collection {
215215
self.init(sequence: zippedCollections, parameters: parameters, testFunction: testFunction)
216216
}
@@ -234,7 +234,7 @@ extension Test.Case {
234234
init<Key, Value>(
235235
arguments dictionary: Dictionary<Key, Value>,
236236
parameters: [Test.Parameter],
237-
testFunction: @escaping @Sendable ((Key, Value)) async throws -> Void
237+
testFunction: nonisolated(nonsending) @escaping @Sendable ((Key, Value)) async throws -> Void
238238
) where S == Dictionary<Key, Value> {
239239
if parameters.count > 1 {
240240
self.init(sequence: dictionary) { element in

Sources/Testing/Parameterization/Test.Case.swift

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -155,9 +155,9 @@ extension Test {
155155
}
156156
}
157157

158-
private init(kind: _Kind, body: @escaping @Sendable () async throws -> Void) {
159-
self._kind = kind
160-
self.body = body
158+
private init(kind: _Kind, body: nonisolated(nonsending) @escaping @Sendable () async throws -> Void) {
159+
_kind = kind
160+
_body = body
161161
}
162162

163163
/// Initialize a test case for a non-parameterized test function.
@@ -166,7 +166,7 @@ extension Test {
166166
/// - body: The body closure of this test case.
167167
///
168168
/// The resulting test case will have zero arguments.
169-
init(body: @escaping @Sendable () async throws -> Void) {
169+
init(body: nonisolated(nonsending) @escaping @Sendable () async throws -> Void) {
170170
self.init(kind: .nonParameterized, body: body)
171171
}
172172

@@ -180,7 +180,7 @@ extension Test {
180180
init(
181181
values: [any Sendable],
182182
parameters: [Parameter],
183-
body: @escaping @Sendable () async throws -> Void
183+
body: nonisolated(nonsending) @escaping @Sendable () async throws -> Void
184184
) {
185185
var isStable = true
186186

@@ -229,10 +229,25 @@ extension Test {
229229
}
230230

231231
/// The body closure of this test case.
232+
private var _body: nonisolated(nonsending) @Sendable () async throws -> Void
233+
234+
/// Invoke the body closure of this test case.
235+
///
236+
/// - Parameters:
237+
/// - configuration: The configuration to use for running.
232238
///
233-
/// Do not invoke this closure directly. Always use a ``Runner`` to invoke a
239+
/// Do not call this function directly. Always use a ``Runner`` to invoke a
234240
/// test or test case.
235-
var body: @Sendable () async throws -> Void
241+
nonisolated(nonsending) func run(configuration: borrowing Configuration) async throws {
242+
if let actor = configuration.defaultSynchronousIsolationContext {
243+
func runIsolated(to actor: isolated some Actor) async throws {
244+
try await _body()
245+
}
246+
try await runIsolated(to: actor)
247+
} else {
248+
try await _body()
249+
}
250+
}
236251
}
237252

238253
/// A type representing a single parameter to a parameterized test function.

Sources/Testing/Running/Runner.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ extension Runner {
104104
private static func _applyScopingTraits(
105105
for test: Test,
106106
testCase: Test.Case?,
107-
_ body: @escaping @Sendable () async throws -> Void
107+
_ body: nonisolated(nonsending) @escaping @Sendable () async throws -> Void
108108
) async throws {
109109
// If the test does not have any traits, exit early to avoid unnecessary
110110
// heap allocations below.
@@ -140,7 +140,7 @@ extension Runner {
140140
///
141141
/// - Throws: Whatever is thrown by `body` or by any of the traits' provide
142142
/// scope function calls.
143-
private static func _applyIssueHandlingTraits(for test: Test, _ body: @escaping @Sendable () async throws -> Void) async throws {
143+
private static func _applyIssueHandlingTraits(for test: Test, _ body: nonisolated(nonsending) @escaping @Sendable () async throws -> Void) async throws {
144144
// If the test does not have any traits, exit early to avoid unnecessary
145145
// heap allocations below.
146146
if test.traits.isEmpty {
@@ -420,7 +420,7 @@ extension Runner {
420420

421421
try await withTimeLimit(for: step.test, configuration: configuration) {
422422
try await _applyScopingTraits(for: step.test, testCase: testCase) {
423-
try await testCase.body()
423+
try await testCase.run(configuration: configuration)
424424
}
425425
} timeoutHandler: { timeLimit in
426426
let issue = Issue(

Sources/Testing/Test+Macro.swift

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ extension Test {
163163
traits: [any TestTrait],
164164
sourceBounds: __SourceBounds,
165165
parameters: [__Parameter] = [],
166-
testFunction: @escaping @Sendable () async throws -> Void
166+
testFunction: nonisolated(nonsending) @escaping @Sendable () async throws -> Void
167167
) -> Self where S: ~Copyable & ~Escapable {
168168
// Don't use Optional.map here due to a miscompile/crash. Expand out to an
169169
// if expression instead. SEE: rdar://134280902
@@ -248,7 +248,7 @@ extension Test {
248248
arguments collection: @escaping @Sendable () async throws -> C,
249249
sourceBounds: __SourceBounds,
250250
parameters paramTuples: [__Parameter],
251-
testFunction: @escaping @Sendable (C.Element) async throws -> Void
251+
testFunction: nonisolated(nonsending) @escaping @Sendable (C.Element) async throws -> Void
252252
) -> Self where S: ~Copyable & ~Escapable, C: Collection & Sendable, C.Element: Sendable {
253253
let containingTypeInfo: TypeInfo? = if let containingType {
254254
TypeInfo(describing: containingType)
@@ -395,7 +395,7 @@ extension Test {
395395
arguments collection1: @escaping @Sendable () async throws -> C1, _ collection2: @escaping @Sendable () async throws -> C2,
396396
sourceBounds: __SourceBounds,
397397
parameters paramTuples: [__Parameter],
398-
testFunction: @escaping @Sendable (C1.Element, C2.Element) async throws -> Void
398+
testFunction: nonisolated(nonsending) @escaping @Sendable (C1.Element, C2.Element) async throws -> Void
399399
) -> Self where S: ~Copyable & ~Escapable, C1: Collection & Sendable, C1.Element: Sendable, C2: Collection & Sendable, C2.Element: Sendable {
400400
let containingTypeInfo: TypeInfo? = if let containingType {
401401
TypeInfo(describing: containingType)
@@ -423,7 +423,7 @@ extension Test {
423423
arguments collection: @escaping @Sendable () async throws -> C,
424424
sourceBounds: __SourceBounds,
425425
parameters paramTuples: [__Parameter],
426-
testFunction: @escaping @Sendable ((E1, E2)) async throws -> Void
426+
testFunction: nonisolated(nonsending) @escaping @Sendable ((E1, E2)) async throws -> Void
427427
) -> Self where S: ~Copyable & ~Escapable, C: Collection & Sendable, C.Element == (E1, E2), E1: Sendable, E2: Sendable {
428428
let containingTypeInfo: TypeInfo? = if let containingType {
429429
TypeInfo(describing: containingType)
@@ -454,7 +454,7 @@ extension Test {
454454
arguments dictionary: @escaping @Sendable () async throws -> Dictionary<Key, Value>,
455455
sourceBounds: __SourceBounds,
456456
parameters paramTuples: [__Parameter],
457-
testFunction: @escaping @Sendable ((Key, Value)) async throws -> Void
457+
testFunction: nonisolated(nonsending) @escaping @Sendable ((Key, Value)) async throws -> Void
458458
) -> Self where S: ~Copyable & ~Escapable, Key: Sendable, Value: Sendable {
459459
let containingTypeInfo: TypeInfo? = if let containingType {
460460
TypeInfo(describing: containingType)
@@ -479,7 +479,7 @@ extension Test {
479479
arguments zippedCollections: @escaping @Sendable () async throws -> Zip2Sequence<C1, C2>,
480480
sourceBounds: __SourceBounds,
481481
parameters paramTuples: [__Parameter],
482-
testFunction: @escaping @Sendable (C1.Element, C2.Element) async throws -> Void
482+
testFunction: nonisolated(nonsending) @escaping @Sendable (C1.Element, C2.Element) async throws -> Void
483483
) -> Self where S: ~Copyable & ~Escapable, C1: Collection & Sendable, C1.Element: Sendable, C2: Collection & Sendable, C2.Element: Sendable {
484484
let containingTypeInfo: TypeInfo? = if let containingType {
485485
TypeInfo(describing: containingType)
@@ -547,7 +547,7 @@ extension Test {
547547
/// - Warning: This function is used to implement the `@Test` macro. Do not use
548548
/// it directly.
549549
@_lifetime(copy value)
550-
@inlinable public func __requiringAwait<T>(_ value: consuming T, isolation: isolated (any Actor)? = #isolation) async -> T where T: ~Copyable & ~Escapable {
550+
@inlinable public nonisolated(nonsending) func __requiringAwait<T>(_ value: consuming T) async -> T where T: ~Copyable & ~Escapable {
551551
value
552552
}
553553

Sources/TestingMacros/ConditionMacro.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -507,7 +507,7 @@ extension ExitTestConditionMacro {
507507
}
508508
decls.append(
509509
"""
510-
@Sendable func \(bodyThunkName)(\(bodyThunkParameterList)) async throws {
510+
@Sendable nonisolated(nonsending) func \(bodyThunkName)(\(bodyThunkParameterList)) async throws {
511511
_ = \(applyEffectfulKeywords([.try, .await, .unsafe], to: bodyArgumentExpr))()
512512
}
513513
"""

Sources/TestingMacros/SuiteDeclarationMacro.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,8 @@ public struct SuiteDeclarationMacro: PeerMacro, Sendable {
124124
let generatorName = context.makeUniqueName("generator")
125125
result.append(
126126
"""
127-
@available(*, deprecated, message: "This property is an implementation detail of the testing library. Do not use it directly.")
128-
@Sendable private \(staticKeyword(for: containingType)) func \(generatorName)() async -> Testing.Test {
127+
@available(*, deprecated, message: "This function is an implementation detail of the testing library. Do not use it directly.")
128+
@Sendable private nonisolated(nonsending) \(staticKeyword(for: containingType)) func \(generatorName)() async -> Testing.Test {
129129
.__type(
130130
\(declaration.type.trimmed).self,
131131
\(raw: attributeInfo.functionArgumentList(in: context))

Sources/TestingMacros/Support/Additions/FunctionDeclSyntaxAdditions.swift

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,6 @@ extension FunctionDeclSyntax {
2727
.contains(.keyword(.mutating))
2828
}
2929

30-
/// Whether or not this function is a `nonisolated` function.
31-
var isNonisolated: Bool {
32-
modifiers.lazy
33-
.map(\.name.tokenKind)
34-
.contains(.keyword(.nonisolated))
35-
}
36-
3730
/// Whether or not this function declares an operator.
3831
var isOperator: Bool {
3932
switch name.tokenKind {

Sources/TestingMacros/Support/TestContentGeneration.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ func makeTestContentRecordDecl(named name: TokenSyntax, in typeName: TypeSyntax?
6969
private nonisolated \(staticKeyword(for: typeName)) let \(name): Testing.__TestContentRecord = (
7070
\(kindExpr), \(kind.commentRepresentation)
7171
0,
72-
\(accessorExpr),
72+
\(raw: accessorExpr),
7373
\(contextExpr),
7474
0
7575
)

Sources/TestingMacros/TestDeclarationMacro.swift

Lines changed: 12 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -292,46 +292,13 @@ public struct TestDeclarationMacro: PeerMacro, Sendable {
292292
thunkBody = "_ = \(forwardCall("\(functionDecl.name.trimmed)\(forwardedParamsExpr)"))"
293293
}
294294

295-
// If this function is synchronous, is not explicitly nonisolated, and is
296-
// not explicitly isolated to some actor, it should run in the configured
297-
// default isolation context. If the suite type is an actor, this will cause
298-
// a hop off the actor followed by an immediate hop back on, but otherwise
299-
// should be harmless. Note that we do not support specifying an `isolated`
300-
// parameter on a test function at this time.
301-
//
302-
// We use a second, inner thunk function here instead of just adding the
303-
// isolation parameter to the "real" thunk because adding it there prevents
304-
// correct tuple desugaring of the "real" arguments to the thunk.
305-
if functionDecl.signature.effectSpecifiers?.asyncSpecifier == nil && !isMainActorIsolated && !functionDecl.isNonisolated {
306-
// Get a unique name for this secondary thunk. We don't need it to be
307-
// uniqued against functionDecl because it's interior to the "real" thunk,
308-
// so its name can't conflict with any other names visible in this scope.
309-
let isolationThunkName = context.makeUniqueName("")
310-
311-
// Insert a (defaulted) isolated argument. If we emit a closure (or inner
312-
// function) that captured the arguments to the "real" thunk, the compiler
313-
// has trouble reasoning about the lifetime of arguments to that closure
314-
// especially if those arguments are borrowed or consumed, which results
315-
// in hard-to-avoid compile-time errors. Fortunately, forwarding the full
316-
// argument list is straightforward.
317-
let thunkParamsExprCopy = FunctionParameterClauseSyntax {
318-
for thunkParam in thunkParamsExpr.parameters {
319-
thunkParam
320-
}
321-
FunctionParameterSyntax(
322-
firstName: .wildcardToken(),
323-
type: "isolated (any _Concurrency.Actor)?" as TypeSyntax,
324-
defaultValue: InitializerClauseSyntax(value: "Testing.__defaultSynchronousIsolationContext" as ExprSyntax)
325-
)
326-
}
327-
328-
thunkBody = """
329-
@Sendable func \(isolationThunkName)\(thunkParamsExprCopy) async throws {
330-
\(thunkBody)
331-
}
332-
try await \(isolationThunkName)\(forwardedParamsExpr)
333-
"""
334-
}
295+
// Forward the nonisolated keyword from the original function. If none is
296+
// present, use `nonisolated(nonsending)` by default.
297+
let existingNonisolatedKeyword = functionDecl.modifiers.first { $0.name.tokenKind == .keyword(.nonisolated) }
298+
let nonisolatedKeyword = existingNonisolatedKeyword?.trimmed ?? DeclModifierSyntax(
299+
name: .keyword(.nonisolated),
300+
detail: DeclModifierDetailSyntax(detail: .keyword(.nonsending))
301+
)
335302

336303
// Add availability guards if needed.
337304
thunkBody = createSyntaxNode(
@@ -343,7 +310,7 @@ public struct TestDeclarationMacro: PeerMacro, Sendable {
343310
let thunkName = context.makeUniqueName(thunking: functionDecl)
344311
let thunkDecl: DeclSyntax = """
345312
@available(*, deprecated, message: "This function is an implementation detail of the testing library. Do not use it directly.")
346-
@Sendable private \(staticKeyword(for: typeName)) func \(thunkName)\(thunkParamsExpr) async throws -> Void {
313+
@Sendable private \(nonisolatedKeyword) \(staticKeyword(for: typeName)) func \(thunkName)\(thunkParamsExpr) async throws -> Void {
347314
\(thunkBody)
348315
}
349316
"""
@@ -434,7 +401,7 @@ public struct TestDeclarationMacro: PeerMacro, Sendable {
434401
result.append(
435402
"""
436403
@available(*, deprecated, message: "This property is an implementation detail of the testing library. Do not use it directly.")
437-
private \(staticKeyword(for: typeName)) nonisolated func \(unavailableTestName)() async -> Testing.Test {
404+
private nonisolated(nonsending) \(staticKeyword(for: typeName)) func \(unavailableTestName)() async -> Testing.Test {
438405
.__function(
439406
named: \(literal: functionDecl.completeName.trimmedDescription),
440407
in: \(typeNameExpr),
@@ -459,8 +426,8 @@ public struct TestDeclarationMacro: PeerMacro, Sendable {
459426
let generatorName = context.makeUniqueName(thunking: functionDecl, withPrefix: "generator")
460427
result.append(
461428
"""
462-
@available(*, deprecated, message: "This property is an implementation detail of the testing library. Do not use it directly.")
463-
@Sendable private \(staticKeyword(for: typeName)) func \(generatorName)() async -> Testing.Test {
429+
@available(*, deprecated, message: "This function is an implementation detail of the testing library. Do not use it directly.")
430+
@Sendable private nonisolated(nonsending) \(staticKeyword(for: typeName)) func \(generatorName)() async -> Testing.Test {
464431
\(raw: testsBody)
465432
}
466433
"""
@@ -489,7 +456,7 @@ public struct TestDeclarationMacro: PeerMacro, Sendable {
489456
"""
490457
@available(*, deprecated, message: "This type is an implementation detail of the testing library. Do not use it directly.")
491458
enum \(enumName): Testing.__TestContentRecordContainer {
492-
nonisolated static var __testContentRecord: Testing.__TestContentRecord6_2 {
459+
nonisolated(nonsending) static var __testContentRecord: Testing.__TestContentRecord6_2 {
493460
unsafe \(testContentRecordName)
494461
}
495462
}

0 commit comments

Comments
 (0)