// RUN: %target-typecheck-verify-swift // RUN: %target-typecheck-verify-swift -debug-constraints > %t.log 2>&1 // RUN: %FileCheck %s < %t.log enum Either { case first(T) case second(U) } @_functionBuilder struct TupleBuilder { static func buildBlock(_ t1: T1) -> T1 { return t1 } static func buildBlock(_ t1: T1, _ t2: T2) -> (T1, T2) { return (t1, t2) } static func buildBlock(_ t1: T1, _ t2: T2, _ t3: T3) -> (T1, T2, T3) { return (t1, t2, t3) } static func buildBlock(_ t1: T1, _ t2: T2, _ t3: T3, _ t4: T4) -> (T1, T2, T3, T4) { return (t1, t2, t3, t4) } static func buildBlock( _ t1: T1, _ t2: T2, _ t3: T3, _ t4: T4, _ t5: T5 ) -> (T1, T2, T3, T4, T5) { return (t1, t2, t3, t4, t5) } static func buildDo(_ value: T) -> T { return value } static func buildIf(_ value: T?) -> T? { return value } static func buildEither(first value: T) -> Either { return .first(value) } static func buildEither(second value: U) -> Either { return .second(value) } } func tuplify(_ collection: C, @TupleBuilder body: (C.Element) -> T) -> T { return body(collection.first!) } // CHECK: ---Connected components--- // CHECK-NEXT: 0: $T1 $T2 $T3 $T5 $T6 $T7 $T8 $T10 $T77 $T78 depends on 2 // CHECK-NEXT: 2: $T12 $T17 $T28 $T42 $T53 $T54 $T55 $T56 $T57 $T58 $T59 $T60 $T61 $T62 $T63 $T64 $T65 $T66 $T68 $T69 $T70 $T71 $T72 $T73 $T74 $T75 $T76 depends on 1, 3, 4, 6, 9 // CHECK-NEXT: 9: $T48 $T49 $T50 $T51 $T52 depends on 8 // CHECK-NEXT: 8: $T43 $T44 $T45 $T46 $T47 // CHECK-NEXT: 6: $T31 $T35 $T36 $T37 $T38 $T39 $T40 $T41 depends on 5, 7 // CHECK-NEXT: 7: $T32 $T33 $T34 // CHECK-NEXT: 5: $T30 // CHECK-NEXT: 4: $T18 $T19 $T20 $T21 $T22 $T23 $T24 $T25 $T26 $T27 // CHECK-NEXT: 3: $T15 $T16 // CHECK-NEXT: 1: $T11 let names = ["Alice", "Bob", "Charlie"] let b = true var number = 17 print( tuplify(names) { name in 17 number "Hello, \(name)" tuplify(["a", "b"]) { value in value.first! } if b { 2.71828 ["if", "stmt"] } else { [1, 2, 3, 17] } })