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
|
// RUN: %target-typecheck-verify-swift
public protocol P: ~Copyable {
var protocolProp: String { get }
}
public struct NC: ~Copyable {
var data: [Int] = []
var next: Box<NC>? = nil
}
public struct M<T: ~Copyable & P>: ~Copyable {
var nc: NC
var string: String
let ncg: T
init(_ t: consuming T) {
self.string = ""
self.nc = NC()
self.ncg = t
}
}
public class Box<Wrapped: ~Copyable> {
var wrapped: Wrapped
init(_ t: consuming Wrapped) { self.wrapped = t }
func with<T: ~Copyable>(_ op: (borrowing Wrapped)->T) -> T { op(wrapped) }
}
class A {
var b: B
init(_ b: consuming B) { self.b = b }
}
struct B: ~Copyable {
var c: C
}
struct C {
var d: Int
}
// rdar://109287447
public func testKeypath<V: ~Copyable>(m: consuming M<V>) {
_ = m[keyPath: \.nc] // expected-error {{key path cannot refer to noncopyable type 'NC'}}
_ = m[keyPath: \.nc.data] // expected-error {{key path cannot refer to noncopyable type 'NC'}}
_ = m[keyPath: \.ncg] // expected-error {{key path cannot refer to noncopyable type 'V'}}
_ = m[keyPath: \.ncg.protocolProp] // expected-error {{key path cannot refer to noncopyable type 'V'}}
_ = m[keyPath: \.string]
let b = Box(NC())
_ = b.with(\.data)
_ = b.with(\.next)
_ = b.with(\.next?.wrapped) // expected-error {{key path cannot refer to noncopyable type 'NC'}}
_ = b.with(\.next!.wrapped.data) // expected-error {{key path cannot refer to noncopyable type 'NC'}}
}
// rdar://109162739
func testKeypath2(_ someA: A) -> Int {
let kp: KeyPath<A, Int> = \A.b.c.d // expected-error {{key path cannot refer to noncopyable type 'B'}}
return someA[keyPath: kp]
}
func testAsFunc(_ someA: A) -> Int {
let fn: (A) -> Int = \A.b.c.d // expected-error {{key path cannot refer to noncopyable type 'B'}}
return fn(someA)
}
|