整个模块优化模式保留哪些断言?

时间:2017-01-25 10:33:15

标签: swift compiler-optimization assertions compiler-options

我可以找到Swift断言的所有解释,解释assert*-O抛出但precondition*被保留,除非设置了-Ounchecked

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

启用整个模块优化后,是否保留precondition*个断言?

1 个答案:

答案 0 :(得分:1)

考虑这个小程序:

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

我无法解释最后两个结果,但似乎很清楚整个模块优化不会影响断言的处理方式;只有优化级别很重要。

这是

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