Xcode 27 betaのSwift 6.4では、typed throwsと列挙型ケースを指定したcatchを組み合わせると、正しいコードでもFound ownership error?!を出してコンパイラが停止することがあります。発生条件、原因、推奨手順、回避策を公式Issueに基づいて解説します。
代表的なログ
error: compile command failed due to signal 6 (use -v to see invocation)
Found outside of lifetime use?!
Found ownership error?!
<unknown>:0: error: fatal error encountered during compilation
While running pass #0 SILModuleTransform "SILGenCleanup".
原因
Swift Issue #89787によると、SILGenがケースパターン付きcatchを生成する際、typed throwsのエラー値を借用したまま未処理エラーの再送出経路へ所有権を渡す場合があります。所有権検証器が有効期間外の使用と判断し、コンパイラがsignal 6で停止します。
アプリ実行時のメモリ破損ではありません。Swiftコンパイラ内部の回帰です。
発生条件・対象バージョン
- Xcode 27 betaのApple Swift 6.4(再現環境は
swiftlang-6.4.0.20.104) throws(MyError)またはResult<T, MyError>.get()を使用catch MyError.someCaseでケースをパターンマッチ- エラー列挙型に関連値を持つケースがある
Swift 5/6言語モードの両方で再現し、Swift 6.3.2では再現しないと報告されています。
再現例
enum MyError: Error {
case noData
case wrapped(Error)
}
func load() throws(MyError) -> Int { 0 }
func reproduce() throws -> Int {
do { return try load() }
catch MyError.noData { return 0 }
}
推奨する解決手順
- 使用中のXcodeとSwiftを確認します。
xcodebuild -version xcrun swiftc --version xcode-select -p - 修正を含むことが確認できるツールチェーンまたはXcodeへ更新します。PR #90330は2026年7月6日にSwiftの
mainへマージ済みですが、最初に収録されたXcode正式版は公開情報で特定できません。更新後に再現コードで確認してください。 - 更新できない場合は、ケースパターンを
catchの外へ移します。func reproduce() throws -> Int { do { return try load() } catch { if case MyError.noData = error { return 0 } throw error } } - Derived Dataを削除して再ビルドします。
rm -rf ~/Library/Developer/Xcode/DerivedData/* xcodebuild clean
代替策
- 要件が許せばSwift 6.3.2を含むXcodeへ一時的に戻す
- API契約を変えられる場合だけ通常の
throwsへ変更する - 汎用
catch内でswitchまたはif caseを使う
@_で始まる非公開属性に依存する恒久対策は推奨しません。
確認方法
- 最小再現ターゲットを作る
- 以前と同じSwift言語モードでDebug/Releaseをビルドする
SILGenCleanupと所有権エラーが消えたことを確認する- 処理対象のケースと再送出ケースの両方をテストする
注意点
compile command failed due to signal 6だけでは今回の不具合と断定できません。SILGenCleanup、所有権エラー、typed throws、ケースパターン付きcatchがそろうか確認してください。IssueがClosedでも、使用中のXcodeへの収録を意味するとは限りません。
まとめ
Found ownership error?!は、Swift 6.4でtyped throwsをケース指定のcatchと組み合わせた際のSILGen所有権管理の回帰です。確認済みの修正ツールチェーンへ更新し、それまでは汎用catch内でケース判定してください。
