Thank you. Based on this information I was able creating a minimal crashing app.
contrived example
import Foundation
struct A {
var a = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
}
struct B {
var b = (A(), A(), A(), A(), A(), A(), A(), A(), A(), A())
}
struct C {
var b = (B(), B(), B(), B(), B(), B(), B(), B(), B(), B())
}
enum E {
case a00(C), a01(C), a02(C), a03(C), a04(C), a05(C), a06(C), a07(C), a08(C), a09(C)
case a10(C), a11(C), a12(C), a13(C), a14(C), a15(C), a16(C), a17(C), a18(C), a19(C)
case a20(C), a21(C), a22(C), a23(C), a24(C), a25(C), a26(C), a27(C), a28(C), a29(C)
case a30(C), a31(C), a32(C), a33(C), a34(C), a35(C), a36(C), a37(C), a38(C), a39(C)
case a40(C), a41(C), a42(C), a43(C), a44(C), a45(C), a46(C), a47(C), a48(C), a49(C)
case a50(C), a51(C), a52(C), a53(C), a54(C), a55(C), a56(C), a57(C), a58(C), a59(C)
case a60(C), a61(C), a62(C), a63(C), a64(C), a65(C), a66(C), a67(C), a68(C), a69(C)
case a70(C), a71(C), a72(C), a73(C), a74(C), a75(C), a76(C), a77(C), a78(C), a79(C)
case a80(C), a81(C), a82(C), a83(C), a84(C), a85(C), a86(C), a87(C), a88(C), a89(C)
case a90(C), a91(C), a92(C), a93(C), a94(C), a95(C), a96(C), a97(C), a98(C), a99(C)
}
func f(_ c: C) {
print(c)
}
@inline (never)
func foo(_ e: E) {
// without indirect:
// 0x1000170ec <+32>: sub sp, sp, #0xc5, lsl #12 ; =0xc5000, 806912 (approx 100 x 8000)
// with indirect:
// 0x1000173cc <+32>: sub sp, sp, #0xc3, lsl #12 ; =0xc3000
// with {f(c)}()
// 0x100003904 <+92>: sub sp, sp, #0x1, lsl #12 ; =0x1000
switch e {
case .a00(let c): f(c); case .a01(let c): f(c); case .a02(let c): f(c); case .a03(let c): f(c); case .a04(let c): f(c)
case .a05(let c): f(c); case .a06(let c): f(c); case .a07(let c): f(c); case .a08(let c): f(c); case .a09(let c): f(c)
case .a10(let c): f(c); case .a11(let c): f(c); case .a12(let c): f(c); case .a13(let c): f(c); case .a14(let c): f(c)
case .a15(let c): f(c); case .a16(let c): f(c); case .a17(let c): f(c); case .a18(let c): f(c); case .a19(let c): f(c)
case .a20(let c): f(c); case .a21(let c): f(c); case .a22(let c): f(c); case .a23(let c): f(c); case .a24(let c): f(c)
case .a25(let c): f(c); case .a26(let c): f(c); case .a27(let c): f(c); case .a28(let c): f(c); case .a29(let c): f(c)
case .a30(let c): f(c); case .a31(let c): f(c); case .a32(let c): f(c); case .a33(let c): f(c); case .a34(let c): f(c)
case .a35(let c): f(c); case .a36(let c): f(c); case .a37(let c): f(c); case .a38(let c): f(c); case .a39(let c): f(c)
case .a40(let c): f(c); case .a41(let c): f(c); case .a42(let c): f(c); case .a43(let c): f(c); case .a44(let c): f(c)
case .a45(let c): f(c); case .a46(let c): f(c); case .a47(let c): f(c); case .a48(let c): f(c); case .a49(let c): f(c)
case .a50(let c): f(c); case .a51(let c): f(c); case .a52(let c): f(c); case .a53(let c): f(c); case .a54(let c): f(c)
case .a55(let c): f(c); case .a56(let c): f(c); case .a57(let c): f(c); case .a58(let c): f(c); case .a59(let c): f(c)
case .a60(let c): f(c); case .a61(let c): f(c); case .a62(let c): f(c); case .a63(let c): f(c); case .a64(let c): f(c)
case .a65(let c): f(c); case .a66(let c): f(c); case .a67(let c): f(c); case .a68(let c): f(c); case .a69(let c): f(c)
case .a70(let c): f(c); case .a71(let c): f(c); case .a72(let c): f(c); case .a73(let c): f(c); case .a74(let c): f(c)
case .a75(let c): f(c); case .a76(let c): f(c); case .a77(let c): f(c); case .a78(let c): f(c); case .a79(let c): f(c)
case .a80(let c): f(c); case .a81(let c): f(c); case .a82(let c): f(c); case .a83(let c): f(c); case .a84(let c): f(c)
case .a85(let c): f(c); case .a86(let c): f(c); case .a87(let c): f(c); case .a88(let c): f(c); case .a89(let c): f(c)
case .a90(let c): f(c); case .a91(let c): f(c); case .a92(let c): f(c); case .a93(let c): f(c); case .a94(let c): f(c)
case .a95(let c): f(c); case .a96(let c): f(c); case .a97(let c): f(c); case .a98(let c): f(c); case .a99(let c): f(c)
}
}
func test() {
print(MemoryLayout<C>.size) // 8000
let e = E.a00(C())
let t = Thread {
print("stack size: \(Thread.current.stackSize)") // stack size: 524288 (512K)
foo(e)
print("thread end")
}
t.start()
sleep(10)
}
test()
Until we have a proper fix in the the compiler (whatever it is) can compiler generate a warning, something along the lines: