blob: 30cc8aa523b2c5842f44f36b0337c63a63cd0e9e [file] [log] [blame] [edit]
// RUN: %target-swift-frontend -typecheck -verify %S/Inputs/keypath.swift -primary-file %s -swift-version 5
struct S {
let i: Int
init() {
let _: WritableKeyPath<S, Int> = \.i // expected-error {{cannot convert value of type 'KeyPath<S, Int>' to specified type 'WritableKeyPath<S, Int>'}}
S()[keyPath: \.i] = 1
// expected-error@-1 {{cannot assign through subscript: key path is read-only}}
}
}
func test() {
let _: WritableKeyPath<C, Int> = \.i // expected-error {{cannot convert value of type 'KeyPath<C, Int>' to specified type 'WritableKeyPath<C, Int>'}}
C()[keyPath: \.i] = 1
// expected-error@-1 {{cannot assign through subscript: key path is read-only}}
let _ = C()[keyPath: \.i] // no warning for a read
}
struct T {
private(set) var a: Int
init(a: Int) {
self.a = a
}
}
func testReadOnlyKeyPathDiagnostics() {
let path = \T.a
var t = T(a: 3)
t[keyPath: path] = 4 // expected-error {{cannot assign through subscript: 'path' is a read-only key path}}
t[keyPath: \T.a] = 4 // expected-error {{cannot assign through subscript: key path is read-only}}
}