on Wed Mar 01 2017, Douglas Gregor <[email protected]> wrote:
>> On Mar 1, 2017, at 1:55 AM, Jonathan Hull <[email protected]> wrote: >> >> What I would like is a way to specialize a generic function in a block of >> code: (Strawman syntax) >> >> if T is Int.self { >> //In this block of code T == Int >> } >> >> It seems to me that the compiler might even be able to optimize this without >> a branch. If there > is a return in the block, then it might even be able to throw away all the > code after it for the Int > version of the function. > > We’ve been calling this “type refinement”. Essentially, within some > lexical context (the “if” here) we can assert additional properties on > a type or one specific (constant) values and take advantage of those > properties, as you’ve done with T == Int. > > It’s a plausible language feature, and could be useful. There’s > certainly some precedent for it: C++17 adds something similar with > “constexpr if”, albeit in their non-separately-type-checked template > instantiation model. > > It’s a nontrivial language feature that’s well out of scope for Swift 4. Huh? This totally works: extension Optional { func goo() -> Int { return Wrapped.self is Int.Type ? 1 : 0 } } func rue() -> Int { return (nil as Bool?).goo() + (nil as Int?).goo() } /* rue optimizes down to: .private_extern __TF1x3rueFT_Si .globl __TF1x3rueFT_Si .p2align 4, 0x90 __TF1x3rueFT_Si: pushq %rbp movq %rsp, %rbp movl $1, %eax popq %rbp retq */ print(rue()) What am I missing? -- -Dave _______________________________________________ swift-evolution mailing list [email protected] https://lists.swift.org/mailman/listinfo/swift-evolution
