mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
"Function builders" are being renamed to "result builders". Add the corresponding `@resultBuilder` attribute, with `@_functionBuilder` as an alias for it, Update test cases to use @resultBuilder.
48 lines
942 B
Swift
48 lines
942 B
Swift
// RUN: %target-typecheck-verify-swift -parse-stdlib
|
|
|
|
// rdar://64890308: Make sure we don't leave one-way constraints unsolved.
|
|
|
|
import Swift
|
|
|
|
@resultBuilder
|
|
class ArrayBuilder<Element> {
|
|
static func buildBlock() -> [Element] { [] }
|
|
static func buildBlock(_ elt: Element) -> [Element] { [elt] }
|
|
static func buildBlock(_ elts: Element...) -> [Element] { elts }
|
|
}
|
|
|
|
func foo<T>(@ArrayBuilder<T> fn: () -> [T]) {}
|
|
|
|
foo {
|
|
""
|
|
}
|
|
|
|
struct S<T> {
|
|
init(_: T.Type) {}
|
|
func overloaded() -> [T] { [] }
|
|
func overloaded(_ x: T) -> [T] { [x] }
|
|
func overloaded(_ x: T...) -> [T] { x }
|
|
}
|
|
|
|
func bar<T>(_ x: T, _ fn: (T, T.Type) -> [T]) {}
|
|
bar("") { x, ty in
|
|
(Builtin.one_way(S(ty).overloaded(x)))
|
|
}
|
|
|
|
protocol P {}
|
|
extension String : P {}
|
|
|
|
@resultBuilder
|
|
struct FooBuilder<T> {}
|
|
|
|
extension FooBuilder where T : P {
|
|
static func buildBlock(_ x: Int, _ y: Int) -> String { "" }
|
|
}
|
|
|
|
func foo<T : P>(@FooBuilder<T> fn: () -> T) {}
|
|
|
|
foo {
|
|
0
|
|
0
|
|
}
|