Description
Compiling a Swift package on Windows with the Swift 6.2.0 toolchain crashes swift-frontend during SIL ownership verification. The crash is Found outside of lifetime use?! followed by Found ownership error?!. The same source compiles without crashing on macOS and Linux.
Reproduction
The crash occurs while compiling Configuration.swift in swiftlang/swift-subprocess#261. The relevant function and the catch block that triggers it:
internal func run<Result, Input: InputProtocol, Output: OutputProtocol, Error: OutputProtocol>(
input: consuming CreatedPipe,
as inputType: Input.Type,
output: consuming CreatedPipe,
as outputType: Output.Type,
error: consuming CreatedPipe,
as errorType: Error.Type,
_ body: (
(
ProcessIdentifier,
consuming IODescriptor?,
consuming IODescriptor?,
consuming IODescriptor?
) async throws -> Result
)
) async throws -> ExecutionOutcome<Result> {
let baseContext = ExecutionContext(self)
var spawnResults: SpawnResult
do {
spawnResults = try await self.spawn(
withInput: input,
outputPipe: output,
errorPipe: error
)
} catch let error as SubprocessError { // warning emitted + crash
throw error.withExecutionContext(baseContext)
}
// ...
}
withExecutionContext(_:) returns SubprocessError. On Windows, spawn(withInput:outputPipe:errorPipe:) uses throws(SubprocessError); on other platforms it is an untyped throw.
The workaround is to branch on the OS:
var spawnResults: SpawnResult
#if os(Windows)
do {
spawnResults = try await self.spawn(
withInput: input,
outputPipe: output,
errorPipe: error
)
} catch {
throw error.withExecutionContext(baseContext)
}
#else
do {
spawnResults = try await self.spawn(
withInput: input,
outputPipe: output,
errorPipe: error
)
} catch let error as SubprocessError {
throw error.withExecutionContext(baseContext)
}
#endif
Stack dump
Full stack dump and program arguments
error: compile command failed due to exception 3 (use -v to see invocation)
Begin Error in Function: '$s10Subprocess13ConfigurationV3run5input2as6outputAF5errorAF_AA16ExecutionOutcomeVyxGAA11CreatedPipeVn_q_mAMnq0_mAMnq1_mxAA17ProcessIdentifierV_AA12IODescriptorVSgnARnARntYaKYCXEtYaKs8SendableRzAA13InputProtocolR_AA06OutputQ0R0_AaUR1_r2_lF'
Found outside of lifetime use?!
Value: %133 = argument of bb4 : $SubprocessError // users: %138, %169, %178
Consuming User: store %133 to [init] %176 : $*SubprocessError // id: %178
Non Consuming User: end_borrow %138 : $SubprocessError // id: %184
Block: bb6
End Error in Function: '$s10Subprocess13ConfigurationV3run5input2as6outputAF5errorAF_AA16ExecutionOutcomeVyxGAA11CreatedPipeVn_q_mAMnq0_mAMnq1_mxAA17ProcessIdentifierV_AA12IODescriptorVSgnARnARntYaKYCXEtYaKs8SendableRzAA13InputProtocolR_AA06OutputQ0R0_AaUR1_r2_lF'
Found ownership error?!
D:\a\swift-subprocess-test\swift-subprocess-test\Sources\Subprocess\Configuration.swift:112:27: warning: 'as' test is always true
110 | errorPipe: error
111 | )
112 | } catch let error as SubprocessError {
| `- warning: 'as' test is always true
113 | throw error.withExecutionContext(baseContext)
114 | }
<unknown>:0: error: fatal error encountered during compilation; please submit a bug report (https://swift.org/contributing/#reporting-bugs)
<unknown>:0: note: triggering standard assertion failure routine
Please submit a bug report (https://swift.org/contributing/#reporting-bugs) and include the crash backtrace.
Stack dump:
0. Program arguments: C:\\Users\\runneradmin\\AppData\\Local\\Programs\\Swift\\Toolchains\\6.2.0+Asserts\\usr\\bin\\swift-frontend.exe -frontend -c -primary-file D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\API.swift -primary-file D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\Buffer.swift -primary-file D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\Configuration.swift -primary-file D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\Error.swift -primary-file D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\Execution.swift -primary-file D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\ExecutionContext.swift -primary-file D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\IO\\AsyncIO+KQueue.swift -primary-file D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\IO\\AsyncIO+Linux.swift -primary-file D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\IO\\AsyncIO+Unix.swift -primary-file D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\IO\\AsyncIO+Windows.swift -primary-file D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\IO\\Input.swift -primary-file D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\IO\\Output.swift -primary-file D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\Platforms\\Subprocess+BSD.swift D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\Platforms\\Subprocess+Darwin.swift D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\Platforms\\Subprocess+Linux.swift D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\Platforms\\Subprocess+Unix.swift D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\Platforms\\Subprocess+Windows.swift D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\Result.swift D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\Span+Subprocess.swift D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\SubprocessFoundation\\Input+Foundation.swift D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\SubprocessFoundation\\Output+Foundation.swift D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\SubprocessFoundation\\Span+SubprocessFoundation.swift D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\SubprocessOutputSequence.swift D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\Teardown.swift D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\Thread.swift -supplementary-output-file-map C:\\Users\\runneradmin\\AppData\\Local\\Temp\\TemporaryDirectory.1ObWvc\\supplementaryOutputs-1 -target x86_64-unknown-windows-msvc -disable-objc-interop -sdk C:\\Users\\runneradmin\\AppData\\Local\\Programs\\Swift\\Platforms\\6.2.0\\Windows.platform\\Developer\\SDKs\\Windows.sdk\\ -I D:\\a\\swift-subprocess-test\\swift-subprocess-test\\.build\\x86_64-unknown-windows-msvc\\debug\\Modules -I C:\\Users\\runneradmin\\AppData\\Local\\Programs\\Swift\\Platforms\\6.2.0\\Windows.platform\\Developer\\Library\\XCTest-6.2.0\\usr\\lib\\swift\\windows -I C:\\Users\\runneradmin\\AppData\\Local\\Programs\\Swift\\Platforms\\6.2.0\\Windows.platform\\Developer\\Library\\XCTest-6.2.0\\usr\\lib\\swift\\windows\\x86_64 -I C:\\Users\\runneradmin\\AppData\\Local\\Programs\\Swift\\Platforms\\6.2.0\\Windows.platform\\Developer\\Library\\Testing-6.2.0\\usr\\lib\\swift\\windows -no-color-diagnostics -Xcc -fno-color-diagnostics -enable-testing -g -debug-info-format=dwarf -dwarf-version=4 -module-cache-path D:\\a\\swift-subprocess-test\\swift-subprocess-test\\.build\\x86_64-unknown-windows-msvc\\debug\\ModuleCache -static -swift-version 6 -Onone -D SWIFT_PACKAGE -D DEBUG -D SWIFT_MODULE_RESOURCE_BUNDLE_UNAVAILABLE -D SubprocessFoundation -enable-experimental-feature StrictConcurrency -enable-experimental-feature Lifetimes -enable-upcoming-feature NonisolatedNonsendingByDefault -enable-upcoming-feature ExistentialAny -enable-upcoming-feature MemberImportVisibility -enable-upcoming-feature InternalImportsByDefault -empty-abi-descriptor -enable-anonymous-context-mangled-names -file-compilation-dir D:\\a\\swift-subprocess-test\\swift-subprocess-test -Xcc -fmodule-map-file=D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\_SubprocessCShims\\include\\module.modulemap -Xcc -I -Xcc D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\_SubprocessCShims\\include -Xcc -fmodule-map-file=D:\\a\\swift-subprocess-test\\swift-subprocess-test\\.build\\checkouts\\swift-system\\Sources\\CSystem\\include\\module.modulemap -Xcc -I -Xcc D:\\a\\swift-subprocess-test\\swift-subprocess-test\\.build\\checkouts\\swift-system\\Sources\\CSystem\\include -Xcc -D_MT -Xcc -D_DLL -Xcc -Xclang -Xcc --dependent-lib=msvcrt -Xcc -gdwarf -no-auto-bridging-header-chaining -module-name Subprocess -package-name swift_subprocess_test -in-process-plugin-server-path C:\\Users\\runneradmin\\AppData\\Local\\Programs\\Swift\\Toolchains\\6.2.0+Asserts\\usr\\bin\\SwiftInProcPluginServer.dll -plugin-path C:\\Users\\runneradmin\\AppData\\Local\\Programs\\Swift\\Toolchains\\6.2.0+Asserts\\usr\\bin -plugin-path C:\\Users\\runneradmin\\AppData\\Local\\Programs\\Swift\\Toolchains\\6.2.0+Asserts\\usr\\local\\bin -autolink-library oldnames -autolink-library msvcrt -Xcc -D_MT -Xcc -D_DLL -parse-as-library -o D:\\a\\swift-subprocess-test\\swift-subprocess-test\\.build\\x86_64-unknown-windows-msvc\\debug\\Subprocess.build\\API.swift.o -o D:\\a\\swift-subprocess-test\\swift-subprocess-test\\.build\\x86_64-unknown-windows-msvc\\debug\\Subprocess.build\\Buffer.swift.o -o D:\\a\\swift-subprocess-test\\swift-subprocess-test\\.build\\x86_64-unknown-windows-msvc\\debug\\Subprocess.build\\Configuration.swift.o -o D:\\a\\swift-subprocess-test\\swift-subprocess-test\\.build\\x86_64-unknown-windows-msvc\\debug\\Subprocess.build\\Error.swift.o -o D:\\a\\swift-subprocess-test\\swift-subprocess-test\\.build\\x86_64-unknown-windows-msvc\\debug\\Subprocess.build\\Execution.swift.o -o D:\\a\\swift-subprocess-test\\swift-subprocess-test\\.build\\x86_64-unknown-windows-msvc\\debug\\Subprocess.build\\ExecutionContext.swift.o -o D:\\a\\swift-subprocess-test\\swift-subprocess-test\\.build\\x86_64-unknown-windows-msvc\\debug\\Subprocess.build\\AsyncIO+KQueue.swift.o -o D:\\a\\swift-subprocess-test\\swift-subprocess-test\\.build\\x86_64-unknown-windows-msvc\\debug\\Subprocess.build\\AsyncIO+Linux.swift.o -o D:\\a\\swift-subprocess-test\\swift-subprocess-test\\.build\\x86_64-unknown-windows-msvc\\debug\\Subprocess.build\\AsyncIO+Unix.swift.o -o D:\\a\\swift-subprocess-test\\swift-subprocess-test\\.build\\x86_64-unknown-windows-msvc\\debug\\Subprocess.build\\AsyncIO+Windows.swift.o -o D:\\a\\swift-subprocess-test\\swift-subprocess-test\\.build\\x86_64-unknown-windows-msvc\\debug\\Subprocess.build\\Input.swift.o -o D:\\a\\swift-subprocess-test\\swift-subprocess-test\\.build\\x86_64-unknown-windows-msvc\\debug\\Subprocess.build\\Output.swift.o -o D:\\a\\swift-subprocess-test\\swift-subprocess-test\\.build\\x86_64-unknown-windows-msvc\\debug\\Subprocess.build\\Subprocess+BSD.swift.o -index-store-path D:\\a\\swift-subprocess-test\\swift-subprocess-test\\.build\\x86_64-unknown-windows-msvc\\debug\\index\\store -index-system-modules
#17 0x00007ff6b49ed60d (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0x172d60d)
#18 0x00007ff6b401b5d9 (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0xd5b5d9)
#19 0x00007ff6b401215d (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0xd5215d)
#20 0x00007ff6b4014eab (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0xd54eab)
#21 0x00007ff6b40112ef (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0xd512ef)
#22 0x00007ff6b405f248 (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0xd9f248)
#23 0x00007ff6b4059c1d (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0xd99c1d)
#24 0x00007ff6b405f3f8 (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0xd9f3f8)
#25 0x00007ff6b401ca15 (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0xd5ca15)
#26 0x00007ff6b4015105 (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0xd55105)
#27 0x00007ff6b40157e6 (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0xd557e6)
#28 0x00007ff6b401ce16 (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0xd5ce16)
#29 0x00007ff6b400b773 (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0xd4b773)
#30 0x00007ff6b401b2c4 (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0xd5b2c4)
#31 0x00007ff6b3907d69 (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0x647d69)
#32 0x00007ff6b3906b34 (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0x646b34)
#33 0x00007ff6b3906feb (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0x646feb)
#34 0x00007ff6b3908f52 (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0x648f52)
#35 0x00007ff6b3754110 (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0x494110)
#36 0x00007ff6b3753ca7 (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0x493ca7)
#37 0x00007ff6ba226698 (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0x6f66698)
#38 0x00007ffb7165e8d7 (C:\Windows\System32\KERNEL32.DLL+0x2e8d7)
#39 0x00007ffb726cc53c (C:\Windows\SYSTEM32\ntdll.dll+0x8c53c)
Expected behavior
The compiler should either compile the code successfully or emit an error diagnostic, not crash with an internal SIL verification failure.
Environment
- swift-6.2-RELEASE, asserts-enabled toolchain
- Target:
x86_64-unknown-windows-msvc, -Onone, -swift-version 6
- GitHub Actions
windows-latest
Additional information
No response
Description
Compiling a Swift package on Windows with the Swift 6.2.0 toolchain crashes
swift-frontendduring SIL ownership verification. The crash isFound outside of lifetime use?!followed byFound ownership error?!. The same source compiles without crashing on macOS and Linux.Reproduction
The crash occurs while compiling
Configuration.swiftin swiftlang/swift-subprocess#261. The relevant function and thecatchblock that triggers it:withExecutionContext(_:)returnsSubprocessError. On Windows,spawn(withInput:outputPipe:errorPipe:)usesthrows(SubprocessError); on other platforms it is an untyped throw.The workaround is to branch on the OS:
Stack dump
Full stack dump and program arguments
Expected behavior
The compiler should either compile the code successfully or emit an error diagnostic, not crash with an internal SIL verification failure.
Environment
x86_64-unknown-windows-msvc,-Onone,-swift-version 6windows-latestAdditional information
No response