| // RUN: %target-swift-frontend -O -emit-sil %s | FileCheck %s |
| |
| // Check that this Church Numerals inspired example does not hang |
| // a compiler in the generic specializer. |
| // |
| // rdar://problem/21260480 |
| |
| protocol Nat { |
| init() |
| // static stored properties are not supported in generic structs. |
| var val : Int32 {get} |
| } |
| |
| struct Zero : Nat { var val : Int32 = 0 } |
| |
| struct PlusOne<X : Nat> : Nat { |
| var val : Int32 = X().val + 1 |
| } |
| |
| // Compiler used to keep performing the generic specialization of |
| // computeNat for increasingly deeply nested bound generic types |
| // like PlusOne<PlusOne<....<PlusOne<Zero>>> |
| func computeNat<T: Nat>(_ v : Int32, _ t: T) -> Int32 { |
| if v == 0 { |
| return t.val |
| } |
| return computeNat(v - 1, PlusOne<T>()) |
| } |
| |
| // CHECK-LABEL: sil @_TF24specialize_deep_generics14testComputeNatFT_Vs5Int32 |
| public func testComputeNat() -> Int32 { |
| return computeNat(8, Zero()) |
| } |
| |