Skip to content

Found ownership error compiler assertion for simple function #89255

@MaxDesiatov

Description

@MaxDesiatov

Description

No response

Reproduction

Save this file to repro.swift

public func f(_ s: inout Substring, _ b: Bool) -> Substring? {                                          while !s.isEmpty {
        let c = s; var i = c.startIndex; var x: Substring.Index?
        while i < c.endIndex { if b { x = i }; c.formIndex(after: &i) }
        s = ""
        guard let x else { continue }
        return c[..<x]
    }
    return nil
}

Try to build with this command:

TOOLCHAINS=$(plutil -extract CFBundleIdentifier raw \
  ~/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a.xctoolchain/Info.plist) \
  swiftc -O -c -parse-as-library repro.swift -o repro.o

Stack dump

Begin Error in Function: '$s5repro1fySsSgSsz_SbtF'
Found over consume?!
Value:   %89 = apply %22(%88, %21) : $@convention(method) (@owned String, @thin Substring.Type) -> @owned Substring // users: %130, %92, %119, %113, %129
User:   %113 = destructure_struct %89 : $Substring      // user: %114
Block: bb14
Consuming Users:
  store %89 to [init] %0 : $*Substring            // id: %130
  store %89 to [init] %0 : $*Substring            // id: %92
  %119 = destructure_struct %89 : $Substring      // user: %120
  %113 = destructure_struct %89 : $Substring      // user: %114
  br bb3(%89 : $Substring)                        // id: %129

End Error in Function: '$s5repro1fySsSgSsz_SbtF'
// f(_:_:)
// Isolation: unspecified
sil [ossa] @$s5repro1fySsSgSsz_SbtF : $@convention(thin) (@inout Substring, Bool) -> @owned Optional<Substring> {
[%0: read v**, write v**, copy v**, destroy v**]
[global: read,write,copy,destroy,allocate,deinit_barrier]
// %0 "s"                                         // users: %130, %92, %18, %4, %2
// %1 "b"                                         // users: %50, %3
bb0(%0 : $*Substring, %1 : $Bool):
  debug_value %0, var, name "s", argno 1, expr op_deref // id: %2
  debug_value %1, let, name "b", argno 2          // id: %3
  %4 = struct_element_addr %0, #Substring._slice  // users: %8, %5
  %5 = struct_element_addr %4, #Slice._startIndex // user: %6
  %6 = struct_element_addr %5, #String.Index._rawBits // user: %7
  %7 = struct_element_addr %6, #UInt64._value     // user: %12
  %8 = struct_element_addr %4, #Slice._endIndex   // user: %9
  %9 = struct_element_addr %8, #String.Index._rawBits // user: %10
  %10 = struct_element_addr %9, #UInt64._value    // user: %13
  %11 = integer_literal $Builtin.Int64, 14        // users: %15, %14, %46, %43, %102, %96, %71, %57, %126, %125
  %12 = load [trivial] %7                         // user: %14
  %13 = load [trivial] %10                        // user: %15
  %14 = builtin "lshr_Int64"(%12, %11) : $Builtin.Int64 // user: %16
  %15 = builtin "lshr_Int64"(%13, %11) : $Builtin.Int64 // user: %16
  %16 = builtin "cmp_eq_Int64"(%14, %15) : $Builtin.Int1 // user: %17
  cond_br %16, bb2, bb1                           // id: %17

bb1:                                              // Preds: bb0
  %18 = load [take] %0                            // user: %28
  %19 = enum $Optional<String.Index>, #Optional.none!enumelt // users: %49, %58, %20
  debug_value %19, var, name "x"                  // id: %20
  %21 = metatype $@thin Substring.Type            // user: %89
  // function_ref Substring.init(_:)
  %22 = function_ref @$sSsySsSScfC : $@convention(method) (@owned String, @thin Substring.Type) -> @owned Substring // user: %89
  %23 = integer_literal $Builtin.Int64, 0         // users: %27, %24
  %24 = struct $UInt64 (%23)                      // user: %86
  %25 = integer_literal $Builtin.Int64, -2305843009213693952 // user: %26
  %26 = value_to_bridge_object %25                // user: %78
  %27 = value_to_bridge_object %23                // user: %81
  br bb3(%18)                                     // id: %28

bb2:                                              // Preds: bb0
  br bb17                                         // id: %29

// %30                                            // users: %112, %109, %31, %52, %32, %97, %67, %37
// Loop header
bb3(%30 : @owned $Substring):                     // Preds: bb1 bb15
  debug_value %30, let, name "c"                  // id: %31
  %32 = begin_borrow %30                          // users: %33, %35
  %33 = struct_extract %32, #Substring._slice     // user: %34
  %34 = struct_extract %33, #Slice._startIndex    // users: %58, %41, %36
  end_borrow %32                                  // id: %35
  debug_value %34, var, name "i"                  // id: %36
  %37 = begin_borrow %30                          // users: %40, %38
  %38 = struct_extract %37, #Substring._slice     // user: %39
  %39 = struct_extract %38, #Slice._endIndex      // user: %44
  end_borrow %37                                  // id: %40
  %41 = struct_extract %34, #String.Index._rawBits // user: %42
  %42 = struct_extract %41, #UInt64._value        // user: %43
  %43 = builtin "lshr_Int64"(%42, %11) : $Builtin.Int64 // user: %47
  %44 = struct_extract %39, #String.Index._rawBits // user: %45
  %45 = struct_extract %44, #UInt64._value        // user: %46
  %46 = builtin "lshr_Int64"(%45, %11) : $Builtin.Int64 // user: %47
  %47 = builtin "cmp_ult_Int64"(%43, %46) : $Builtin.Int1 // user: %48
  cond_br %47, bb5, bb4                           // id: %48

bb4:                                              // Preds: bb3
  br bb12(%19)                                    // id: %49

bb5:                                              // Preds: bb3
  %50 = struct_extract %1, #Bool._value           // user: %61
  // function_ref Substring.index(after:)
  %51 = function_ref @$sSs5index5afterSS5IndexVAD_tF : $@convention(method) (String.Index, @guaranteed Substring) -> String.Index // user: %67
  %52 = begin_borrow %30                          // users: %53, %74
  %53 = struct_extract %52, #Substring._slice     // user: %54
  %54 = struct_extract %53, #Slice._endIndex      // user: %55
  %55 = struct_extract %54, #String.Index._rawBits // user: %56
  %56 = struct_extract %55, #UInt64._value        // user: %57
  %57 = builtin "lshr_Int64"(%56, %11) : $Builtin.Int64 // user: %72
  br bb6(%19, %34)                                // id: %58

// %59                                            // user: %65
// %60                                            // users: %67, %62
// Loop header
bb6(%59 : $Optional<String.Index>, %60 : $String.Index): // Preds: bb11 bb5
  cond_br %50, bb7, bb8                           // id: %61

bb7:                                              // Preds: bb6
  %62 = enum $Optional<String.Index>, #Optional.some!enumelt, %60 // users: %64, %63
  debug_value %62, var, name "x"                  // id: %63
  br bb9(%62)                                     // id: %64

bb8:                                              // Preds: bb6
  br bb9(%59)                                     // id: %65

// %66                                            // users: %75, %76
bb9(%66 : $Optional<String.Index>):               // Preds: bb8 bb7
  %67 = apply %51(%60, %30) : $@convention(method) (String.Index, @guaranteed Substring) -> String.Index // users: %76, %69, %68
  debug_value %67, var, name "i"                  // id: %68
  %69 = struct_extract %67, #String.Index._rawBits // user: %70
  %70 = struct_extract %69, #UInt64._value        // user: %71
  %71 = builtin "lshr_Int64"(%70, %11) : $Builtin.Int64 // user: %72
  %72 = builtin "cmp_ult_Int64"(%71, %57) : $Builtin.Int1 // user: %73
  cond_br %72, bb11, bb10                         // id: %73

bb10:                                             // Preds: bb9
  end_borrow %52                                  // id: %74
  br bb12(%66)                                    // id: %75

bb11:                                             // Preds: bb9
  br bb6(%66, %67)                                // id: %76

// %77                                            // user: %90
bb12(%77 : $Optional<String.Index>):              // Preds: bb10 bb4
  %78 = copy_value %26                            // users: %80, %79
  %79 = unchecked_trivial_bit_cast %78 to $UInt64 // user: %83
  destroy_value %78                               // id: %80
  %81 = copy_value %27                            // user: %82
  destroy_value %81                               // id: %82
  %83 = struct_extract %79, #UInt64._value        // user: %84
  %84 = value_to_bridge_object %83                // user: %85
  %85 = copy_value %84                            // user: %86
  %86 = struct $_StringObject (%24, %85)          // user: %87
  %87 = struct $_StringGuts (%86)                 // user: %88
  %88 = struct $String (%87)                      // user: %89
  %89 = apply %22(%88, %21) : $@convention(method) (@owned String, @thin Substring.Type) -> @owned Substring // users: %130, %92, %119, %113, %129
  switch_enum %77, case #Optional.some!enumelt: bb13, case #Optional.none!enumelt: bb14 // id: %90

// %91                                            // users: %105, %94, %93
bb13(%91 : $String.Index):                        // Preds: bb12
  store %89 to [init] %0                          // id: %92
  debug_value %91, let, name "x"                  // id: %93
  %94 = struct_extract %91, #String.Index._rawBits // user: %95
  %95 = struct_extract %94, #UInt64._value        // user: %96
  %96 = builtin "lshr_Int64"(%95, %11) : $Builtin.Int64 // user: %103
  %97 = begin_borrow %30                          // users: %108, %98, %107
  %98 = struct_extract %97, #Substring._slice     // user: %99
  %99 = struct_extract %98, #Slice._startIndex    // users: %105, %100
  %100 = struct_extract %99, #String.Index._rawBits // user: %101
  %101 = struct_extract %100, #UInt64._value      // user: %102
  %102 = builtin "lshr_Int64"(%101, %11) : $Builtin.Int64 // user: %103
  %103 = builtin "cmp_ult_Int64"(%96, %102) : $Builtin.Int1 // user: %104
  cond_fail %103, "Range requires lowerBound <= upperBound" // id: %104
  %105 = struct $Range<String.Index> (%99, %91)   // user: %107
  // function_ref Substring.subscript.getter
  %106 = function_ref @$sSsySsSnySS5IndexVGcig : $@convention(method) (Range<String.Index>, @guaranteed Substring) -> @owned Substring // user: %107
  %107 = apply %106(%105, %97) : $@convention(method) (Range<String.Index>, @guaranteed Substring) -> @owned Substring // user: %110
  end_borrow %97                                  // id: %108
  destroy_value %30                               // id: %109
  %110 = enum $Optional<Substring>, #Optional.some!enumelt, %107 // user: %111
  br bb18(%110)                                   // id: %111

bb14:                                             // Preds: bb12
  destroy_value %30                               // id: %112
  %113 = destructure_struct %89                   // user: %114
  (%114, %115, %116) = destructure_struct %113    // user: %117
  %117 = struct_extract %114, #String.Index._rawBits // user: %118
  %118 = struct_extract %117, #UInt64._value      // user: %125
  %119 = destructure_struct %89                   // user: %120
  (%120, %121, %122) = destructure_struct %119    // user: %123
  %123 = struct_extract %121, #String.Index._rawBits // user: %124
  %124 = struct_extract %123, #UInt64._value      // user: %126
  %125 = builtin "lshr_Int64"(%118, %11) : $Builtin.Int64 // user: %127
  %126 = builtin "lshr_Int64"(%124, %11) : $Builtin.Int64 // user: %127
  %127 = builtin "cmp_eq_Int64"(%125, %126) : $Builtin.Int1 // user: %128
  cond_br %127, bb16, bb15                        // id: %128

bb15:                                             // Preds: bb14
  br bb3(%89)                                     // id: %129

bb16:                                             // Preds: bb14
  store %89 to [init] %0                          // id: %130
  br bb17                                         // id: %131

bb17:                                             // Preds: bb16 bb2
  %132 = enum $Optional<Substring>, #Optional.none!enumelt // user: %133; ownership: none
  br bb18(%132)                                   // id: %133

// %134                                           // user: %135
bb18(%134 : @owned $Optional<Substring>):         // Preds: bb17 bb13
  return %134                                     // id: %135
} // end sil function '$s5repro1fySsSgSsz_SbtF'

Found ownership error?!
<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: /Users/mdesiatov/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a.xctoolchain/usr/bin/swift-frontend -frontend -c -primary-file /tmp/style-repro/repro.swift -target arm64-apple-macosx26.0 -Xllvm -aarch64-use-tbi -enable-objc-interop -sdk /Applications/Xcode-26.5.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX26.5.sdk -no-color-diagnostics -Xcc -fno-color-diagnostics -O -empty-abi-descriptor -no-auto-bridging-header-chaining -module-name repro -in-process-plugin-server-path /Users/mdesiatov/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a.xctoolchain/usr/lib/swift/host/libSwiftInProcPluginServer.dylib -plugin-path /Users/mdesiatov/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a.xctoolchain/usr/lib/swift/host/plugins -plugin-path /Users/mdesiatov/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a.xctoolchain/usr/local/lib/swift/host/plugins -target-sdk-version 26.5 -target-sdk-name macosx26.5 -external-plugin-path /Applications/Xcode-26.5.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/lib/swift/host/plugins#/Applications/Xcode-26.5.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/bin/swift-plugin-server -external-plugin-path /Applications/Xcode-26.5.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/local/lib/swift/host/plugins#/Applications/Xcode-26.5.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/bin/swift-plugin-server -enable-default-cmo -parse-as-library -o /tmp/style-repro/repro.o
1.	Apple Swift version 6.5-dev (LLVM d61b42392ef8b48, Swift 233c2bc947487c0)
2.	Compiling with effective version 5.10
3.	While evaluating request ExecuteSILPipelineRequest(Run pipelines { PrepareOptimizationPasses, EarlyModulePasses, HighLevel,Function+EarlyLoopOpt, HighLevel,Module+StackPromote, MidLevel,Function, ClosureSpecialize, LowLevel,Function, LateLoopOpt, SIL Debug Info Generator } on SIL for repro)
4.	While running pass #3088 SILModuleTransform "OwnershipModelEliminator".
5.	Found verification error when verifying before lowering ownership. Please re-run with -sil-verify-all to identify the actual pass that introduced the verification error.
6.	While verifying SIL function "@$s5repro1fySsSgSsz_SbtF".
 for 'f(_:_:)' (at /tmp/style-repro/repro.swift:1:8)
 #0 0x0000000105f47734 (/Users/mdesiatov/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a.xctoolchain/usr/bin/swift-frontend+0x105e2f734)
 #1 0x0000000105f45a50 (/Users/mdesiatov/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a.xctoolchain/usr/bin/swift-frontend+0x105e2da50)
 #2 0x0000000105f481c4 (/Users/mdesiatov/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a.xctoolchain/usr/bin/swift-frontend+0x105e301c4)
 #3 0x00000001821cf744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744)
 #4 0x00000001821c58d8 (/usr/lib/system/libsystem_pthread.dylib+0x1804f18d8)
 #5 0x00000001820cc644 (/usr/lib/system/libsystem_c.dylib+0x1803f8644)
 #6 0x0000000100682058 (/Users/mdesiatov/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a.xctoolchain/usr/bin/swift-frontend+0x10056a058)
 #7 0x0000000105ec140c (/Users/mdesiatov/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a.xctoolchain/usr/bin/swift-frontend+0x105da940c)
 #8 0x0000000105ec130c (/Users/mdesiatov/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a.xctoolchain/usr/bin/swift-frontend+0x105da930c)
 #9 0x0000000100ecbf8c (/Users/mdesiatov/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a.xctoolchain/usr/bin/swift-frontend+0x100db3f8c)
#10 0x0000000100ec98d8 (/Users/mdesiatov/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a.xctoolchain/usr/bin/swift-frontend+0x100db18d8)
#11 0x0000000100ecac64 (/Users/mdesiatov/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a.xctoolchain/usr/bin/swift-frontend+0x100db2c64)
#12 0x0000000100ed35b8 (/Users/mdesiatov/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a.xctoolchain/usr/bin/swift-frontend+0x100dbb5b8)
#13 0x0000000100ed58f0 (/Users/mdesiatov/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a.xctoolchain/usr/bin/swift-frontend+0x100dbd8f0)
#14 0x0000000100ed57c0 (/Users/mdesiatov/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a.xctoolchain/usr/bin/swift-frontend+0x100dbd7c0)
#15 0x0000000100ef5000 (/Users/mdesiatov/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a.xctoolchain/usr/bin/swift-frontend+0x100ddd000)
#16 0x0000000100ef75a8 (/Users/mdesiatov/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a.xctoolchain/usr/bin/swift-frontend+0x100ddf5a8)
#17 0x0000000100eea2ac (/Users/mdesiatov/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a.xctoolchain/usr/bin/swift-frontend+0x100dd22ac)
#18 0x0000000100ede570 (/Users/mdesiatov/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a.xctoolchain/usr/bin/swift-frontend+0x100dc6570)
#19 0x0000000100eda230 (/Users/mdesiatov/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a.xctoolchain/usr/bin/swift-frontend+0x100dc2230)
#20 0x00000001011b5744 (/Users/mdesiatov/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a.xctoolchain/usr/bin/swift-frontend+0x10109d744)
#21 0x00000001011bddac (/Users/mdesiatov/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a.xctoolchain/usr/bin/swift-frontend+0x1010a5dac)
#22 0x00000001011c07dc (/Users/mdesiatov/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a.xctoolchain/usr/bin/swift-frontend+0x1010a87dc)
#23 0x00000001011ba658 (/Users/mdesiatov/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a.xctoolchain/usr/bin/swift-frontend+0x1010a2658)
#24 0x00000001011ba5d8 (/Users/mdesiatov/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a.xctoolchain/usr/bin/swift-frontend+0x1010a25d8)
#25 0x00000001011e0e54 (/Users/mdesiatov/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a.xctoolchain/usr/bin/swift-frontend+0x1010c8e54)
#26 0x00000001011c2664 (/Users/mdesiatov/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a.xctoolchain/usr/bin/swift-frontend+0x1010aa664)
#27 0x00000001011ba850 (/Users/mdesiatov/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a.xctoolchain/usr/bin/swift-frontend+0x1010a2850)
#28 0x00000001011c3e0c (/Users/mdesiatov/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a.xctoolchain/usr/bin/swift-frontend+0x1010abe0c)
#29 0x0000000100699abc (/Users/mdesiatov/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a.xctoolchain/usr/bin/swift-frontend+0x100581abc)
#30 0x0000000100427078 (/Users/mdesiatov/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a.xctoolchain/usr/bin/swift-frontend+0x10030f078)
#31 0x000000010042668c (/Users/mdesiatov/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a.xctoolchain/usr/bin/swift-frontend+0x10030e68c)
#32 0x00000001004380a4 (/Users/mdesiatov/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a.xctoolchain/usr/bin/swift-frontend+0x1003200a4)
#33 0x000000010042a750 (/Users/mdesiatov/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a.xctoolchain/usr/bin/swift-frontend+0x100312750)
#34 0x0000000100427fac (/Users/mdesiatov/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a.xctoolchain/usr/bin/swift-frontend+0x10030ffac)
#35 0x000000010015117c (/Users/mdesiatov/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a.xctoolchain/usr/bin/swift-frontend+0x10003917c)
#36 0x0000000181e07e00

Expected behavior

This code compiles fine as before.

Environment

macOS 26, swift-DEVELOPMENT-SNAPSHOT-2026-05-17-a

Additional information

This code built fine with swift-6.3-RELEASE and swift-6.3.1-RELEASE

Metadata

Metadata

Assignees

No one assigned

    Labels

    SILSIL ownershipArea → compiler → SIL: SIL ownershipcrashBug: A crash, i.e., an abnormal termination of softwareownershipFeature: Ownership modifiers and semantics

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions