[swift-evolution] [DRAFT] Introducing a Debug Build Configuration Test

Joe Groff jgroff at apple.com
Tue Mar 15 11:49:07 CDT 2016

> On Mar 14, 2016, at 1:04 PM, Dmitri Gribenko via swift-evolution <swift-evolution at swift.org> wrote:
> On Mon, Mar 14, 2016 at 11:57 AM, Erica Sadun via swift-evolution
> <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>> https://gist.github.com/erica/d20639b409fe1b318c0e
>> Feedback solicited. Thanks, -- Erica
>> Introducing a Debug Build Configuration Test
>> Proposal: SE-00XX
>> Author(s): Erica Sadun
>> Status: TBD
>> Review manager: TBD
>> Introduction
>> This proposal introduces a configuration test for debug builds.
>> This proposal was discussed on-list in the Introducing a Debug Build
>> Configuration Test thread.
>> Motivation
>> Developers are used to including code specific to debug builds in their
>> projects. Having a debug configuration test is an industry standard option.
>> Under the current version of Swift you must add a command-line flag using -D
>> <#flag#> (e.g. -D debug) and test in-code (#if debug), there's no consistent
>> system-supplied way to differentiate code meant only for debug builds.
>> Detail Design
>> This proposal adds #if config(debug) to test for debug builds.
>> #if config(debug)
>>    // code for debug builds only
>> #endif
> Hi Erica,
> Based on Joe's rationale that you are quoting, I think the intent is
> that we want to restrict this directive to be statement-level only.
> The API vended by a module should not be affected by the build mode.

I think the right thing here would be (in a separate proposal) to introduce an expression-level test for build configurations, so you could say something like this:

func assertIf64Bit(condition: @autoclosure () -> Bool) {
  if #condition(config(debug) && bits(64)) && condition() {
    fatalError("64-bit assertion failed")

and the #-expression would be lowered to a SIL intrinsic that gets guaranteed-optimized like our _is*Configuration hacks do today. That would allow for platform-dependent code that doesn't depend on platform-dependent declarations to still be type-checked and diagnosed, and share build products up to the SIL optimization stage of the pipeline. If we have that then our original objection to config(debug) goes away.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160315/9446a9d8/attachment.html>

More information about the swift-evolution mailing list