Files
swift-mirror/test/attr/attr_result_builder.swift
Pavel Yaskevich 6b323f1663 [BuilderTransform] Verify that builder type has at least one accessible build{Partial}Block
Check accessibility of all build{Partial}Block overloads and
diagnose if none of them are as accessible as type, otherwise
swift interfaces could end up with invalid result builder
declarations when type is public and all builder methods are
internal.

Resolves: rdar://104384604
2023-03-08 12:46:50 -08:00

79 lines
3.3 KiB
Swift

// RUN: %target-typecheck-verify-swift
@_functionBuilder // expected-warning{{'@_functionBuilder' has been renamed to '@resultBuilder'}}{{2-18=resultBuilder}}
struct MyBuilder {
static func buildBlock(_: Any...) -> Any { }
}
// rdar://104384604 - empty result builder in swiftinterface file
@resultBuilder
public struct TestInvalidBuildBlock1 {
// expected-error@-1 {{result builder must provide at least one static 'buildBlock' as accessible as result builder type 'TestInvalidBuildBlock1' (which is public)}}
static func buildBlock(_: Int) -> Int { 42 }
}
@resultBuilder
public struct TestInvalidBuildBlock2 { // Ok
static func buildBlock(_: Int) -> Int { 42 }
public static func buildBlock(_: String) -> String { "" }
}
@resultBuilder
public struct TestInvalidBuildPartialBlockFirst1 {
// expected-error@-1 {{result builder must provide at least one static 'buildPartialBlock(first:)' as accessible as result builder type 'TestInvalidBuildPartialBlockFirst1' (which is public)}}
static func buildPartialBlock(first: Int) -> Int { first }
public static func buildPartialBlock(accumulated: Int, next: Int) -> Int { accumulated + next }
}
@resultBuilder
public struct TestInvalidBuildPartialBlockFirst2 { // Ok
static func buildPartialBlock(first: Int) -> Int { first }
public static func buildPartialBlock<T>(first: T) -> T { first }
public static func buildPartialBlock(accumulated: Int, next: Int) -> Int { accumulated + next }
}
@resultBuilder
public struct TestInvalidBuildPartialBlockAccumulated1 {
// expected-error@-1 {{result builder must provide at least one static 'buildPartialBlock(accumulated:next:)' as accessible as result builder type 'TestInvalidBuildPartialBlockAccumulated1' (which is public)}}
public static func buildPartialBlock(first: Int) -> Int { first }
private static func buildPartialBlock(accumulated: Int, next: Int) -> Int { accumulated + next }
}
@resultBuilder
public struct TestInvalidBuildPartialBlockAccumulated2 { // Ok
public static func buildPartialBlock<T>(first: T) -> T { first }
public static func buildPartialBlock<T>(accumulated: T, next: T) -> T { fatalError() }
private static func buildPartialBlock(accumulated: Int, next: Int) -> Int { accumulated + next }
}
@resultBuilder
public struct TestBuildPartialBlock1 { // Ok
public static func buildPartialBlock(first: Int) -> Int { first }
public static func buildPartialBlock(accumulated: Int, next: Int) -> Int { accumulated + next }
}
@resultBuilder
public struct TestBuildPartialBlock2 { // Ok
private static func buildBlock(_: Int) -> Int { 42 }
public static func buildPartialBlock(first: Int) -> Int { first }
public static func buildPartialBlock(accumulated: Int, next: Int) -> Int { accumulated + next }
}
@resultBuilder
public struct TestBuildPartialBlock3 { // Ok
public static func buildBlock(_: Int) -> Int { 42 }
fileprivate static func buildPartialBlock(first: Int) -> Int { first }
fileprivate static func buildPartialBlock(accumulated: Int, next: Int) -> Int { accumulated + next }
}
@resultBuilder
public struct TestBuildPartialBlock4 { // Ok
public static func buildBlock(_: Int) -> Int { 42 }
public static func buildPartialBlock(first: Int) -> Int { first }
public static func buildPartialBlock(accumulated: Int, next: Int) -> Int { accumulated + next }
}