1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
|
// RUN: %target-typecheck-verify-swift
struct Projection<T> {
var value: T
}
@propertyWrapper
struct Wrapper<T> {
var wrappedValue: T
init(wrappedValue: T) {
self.wrappedValue = wrappedValue
}
var projectedValue: Projection<T> {
Projection(value: wrappedValue)
}
init(projectedValue: Projection<T>) {
self.wrappedValue = projectedValue.value
}
}
@propertyWrapper
struct ImplementationDetailWrapper<T> {
var wrappedValue: T
init(wrappedValue: T) {
self.wrappedValue = wrappedValue
}
}
func globalFunc(@Wrapper arg: Int) {
let _: Int = arg
let _: Projection<Int> = $arg
let _: Wrapper<Int> = _arg
}
func testGlobalFunc(value: Int, projection: Projection<Int>) {
globalFunc(arg: value)
globalFunc($arg: projection)
let _: (Int) -> Void = globalFunc
let _: (Int) -> Void = globalFunc(arg:)
let _: (Projection<Int>) -> Void = globalFunc($arg:)
}
func globalFuncWithImplementationDetailWrapper(@ImplementationDetailWrapper arg: Int) {
let _: Int = arg
let _: ImplementationDetailWrapper<Int> = _arg
}
func testGlobalFuncWithImplementationDetailWrapper(value: Int) {
globalFuncWithImplementationDetailWrapper(arg: value)
let _: (Int) -> Void = globalFuncWithImplementationDetailWrapper
let _: (Int) -> Void = globalFuncWithImplementationDetailWrapper(arg:)
}
struct S<Value> {
func method(@Wrapper arg: Value) {
let _: Value = arg
let _: Projection<Value> = $arg
let _: Wrapper<Value> = _arg
}
func methodWithImplementationDetailWrapper(@ImplementationDetailWrapper arg: Value) {
let _: Value = arg
let _: ImplementationDetailWrapper<Value> = _arg
}
static func staticMethod(@Wrapper arg: Value) {
let _: Value = arg
let _: Projection<Value> = $arg
let _: Wrapper<Value> = _arg
}
static func staticMethodWithImplementationDetailWrapper(@ImplementationDetailWrapper arg: Value) {
let _: Value = arg
let _: ImplementationDetailWrapper<Value> = _arg
}
}
func testMethods(instance: S<String>, Metatype: S<String>.Type,
@Wrapper value: String) {
Metatype.staticMethod(arg: value)
Metatype.staticMethod($arg: $value)
instance.method(arg: value)
instance.method($arg: $value)
let _: (String) -> Void = Metatype.staticMethod
let _: (String) -> Void = Metatype.staticMethod(arg:)
let _: (Projection<String>) -> Void = Metatype.staticMethod($arg:)
let _: (String) -> Void = instance.method
let _: (String) -> Void = instance.method(arg:)
let _: (Projection<String>) -> Void = instance.method($arg:)
let _: (String) -> Void = instance.method
let _: (String) -> Void = instance.method(arg:)
let _: (Projection<String>) -> Void = instance.method($arg:)
let _: (S) -> (String) -> Void = Metatype.method
let _: (S) -> (String) -> Void = Metatype.method(arg:)
let _: (S) -> (Projection<String>) -> Void = Metatype.method($arg:)
}
func testMethodsWithImplementationDetailWrapper(instance: S<String>, Metatype: S<String>.Type,
@ImplementationDetailWrapper value: String) {
Metatype.staticMethodWithImplementationDetailWrapper(arg: value)
instance.methodWithImplementationDetailWrapper(arg: value)
let _: (String) -> Void = Metatype.staticMethodWithImplementationDetailWrapper
let _: (String) -> Void = Metatype.staticMethodWithImplementationDetailWrapper(arg:)
let _: (String) -> Void = instance.methodWithImplementationDetailWrapper
let _: (String) -> Void = instance.methodWithImplementationDetailWrapper(arg:)
let _: (S) -> (String) -> Void = Metatype.methodWithImplementationDetailWrapper
let _: (S) -> (String) -> Void = Metatype.methodWithImplementationDetailWrapper(arg:)
}
func testClosures() {
typealias PropertyWrapperTuple = (Wrapper<Int>, Int, Projection<Int>)
let _: (Int) -> PropertyWrapperTuple = { (@Wrapper value) in
(_value, value, $value)
}
let _: (Projection<Int>) -> PropertyWrapperTuple = { (@Wrapper $value) in
(_value, value, $value)
}
}
func testClosuresWithImplementationDetailWrapper() {
let _: (Int) -> (ImplementationDetailWrapper<Int>, Int) = { (@ImplementationDetailWrapper value) in
(_value, value)
}
}
func projectionPlaceholder<T>(@Wrapper _ value: T) {}
func testOmittedProjectionLabel(value: Int) {
projectionPlaceholder($_: Projection(value: value))
}
@propertyWrapper
struct ProjectionWrapper<Value> {
var wrappedValue: Value
var projectedValue: ProjectionWrapper<Value> { self }
init(wrappedValue: Value) { self.wrappedValue = wrappedValue }
init(projectedValue: ProjectionWrapper<Value>) {
self.wrappedValue = projectedValue.wrappedValue
}
}
func testImplicitPropertyWrapper() {
typealias PropertyWrapperTuple = (ProjectionWrapper<Int>, Int, ProjectionWrapper<Int>)
let _: (ProjectionWrapper<Int>) -> PropertyWrapperTuple = { $value in
(_value, value, $value)
}
}
@resultBuilder
struct PairBuilder {
static func buildBlock<T1, T2>(_ t1: T1, _ t2: T2) -> (T1, T2) {
return (t1, t2)
}
}
func takesResultBuilder<Projection, T1, T2>(projection: Projection,
@PairBuilder _ closure: (Projection) -> (T1, T2)) {}
func testResultBuilderWithImplicitWrapper(@ProjectionWrapper value: String) {
takesResultBuilder(projection: $value) { $value in
value
$value
}
}
func takesWrapperClosure<T>(_: ProjectionWrapper<[S<T>]>, closure: (ProjectionWrapper<S<T>>) -> Void) {}
func testGenericPropertyWrapper<U>(@ProjectionWrapper wrappers: [S<U>]) {
takesWrapperClosure($wrappers) { $wrapper in }
}
|