// 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 : 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>> func computeNat(_ v : Int32, _ t: T) -> Int32 { if v == 0 { return t.val } return computeNat(v - 1, PlusOne()) } // CHECK-LABEL: sil @$s24specialize_deep_generics14testComputeNats5Int32VyF public func testComputeNat() -> Int32 { return computeNat(8, Zero()) } // Check that compiler does not hang producing very wide tuples during // specialization. @inline(never) func computeTuple(t: T) { computeTuple(t: (t, t)) } // CHECK-LABEL: sil @$s24specialize_deep_generics16testComputeTupleyyF public func testComputeTuple() { computeTuple(t: 0) } // Check that compiler does not hang producing very deep metatypes. @inline(never) public func computeMetatype(t: T) { computeMetatype(t: T.self) } // CHECK-LABEL: sil @$s24specialize_deep_generics19testComputeMetatypeyyF public func testComputeMetatype() { computeMetatype(t: 0) } // Check that compiler does not hang producing very deep function types. @inline(never) public func computeFunctionType(t: [T]) { computeFunctionType(t: [{ t[0] }]) } public func testComputeFunctionType() { computeFunctionType(t: [0]) }