wholemodule 优化模式保留了哪些断言?

Which assertions are retained with wholemodule optimization mode?

我能找到的所有关于 Swift 断言的解释都解释说 assert*-O 丢弃,但 precondition* 被保留,除非 -Ounchecked 被设置。

但是,我们现在将 whole-module optimization -wmo 作为发布版本的新默认值。

启用全模块优化时是否保留 precondition* 断言?

考虑这个小程序:

func f(_ i: Int) -> Int {
    assert(i > 0, "needed positive number")
    return i
}

print(f(0))

xcrun swiftc [opt] 和 运行 编译它的结果是:

  • -Onone: 断言错误
  • -Onone -wmo: 断言错误
  • -O:打印 0
  • -O -wmo:打印 0

相比之下:

func f(_ i: Int) -> Int {
    precondition(i > 0, "needed positive number")
    return i
}

print(f(0))
  • -Onone: 前置条件错误
  • -Onone -wmo: 前置条件错误
  • -O:非法指令:4
  • -O -wmo:非法指令:4

我无法完全解释最后两个结果,但很明显 whole-module 优化不会影响断言的处理方式;只有优化级别很重要。


这是在

Apple Swift version 3.0.1 (swiftlang-800.0.58.6 clang-800.0.42.1)
Target: x86_64-apple-macosx10.9