blob: 314396288cdacacf7c5e004db6469616ec11c11e [file] [log] [blame]
// RUN: %target-typecheck-verify-swift
struct Read {
var simpleReadImmutable: Int {
_read {}
}
var redundantRead: Int {
_read {} // expected-note {{previous definition of 'read' accessor here}}
_read {} // expected-error {{variable already has a 'read' accessor}}
}
var readAndGet: Int {
_read {} // expected-error {{variable cannot provide both a 'read' accessor and a getter}}
get {} // expected-note {{getter defined here}}
}
var readAndAddress: Int {
_read {} // expected-note {{'read' accessor defined here}}
unsafeAddress {} // expected-error {{variable cannot provide both an addressor and a 'read' accessor}}
}
}
struct ReadModifiable {
var readAndWillSet: Int {
_read {}
willSet {} // expected-error {{'willSet' cannot be provided together with a 'read' accessor}}
}
var readAndDidSet: Int {
_read {}
didSet {} // expected-error {{'didSet' cannot be provided together with a 'read' accessor}}
}
var readAndSet: Int {
_read {}
set {}
}
var readAndMutableAddress: Int {
_read {}
unsafeMutableAddress {}
}
var readAndModify: Int {
_read {}
_modify {}
}
}
struct Modify {
var modifyAlone: Int {
_modify {} // expected-error {{variable with a 'modify' accessor must also have a getter, addressor, or 'read' accessor}}
}
var getAndModify: Int {
get {}
_modify {}
}
var addressAndModify: Int {
unsafeAddress {}
_modify {}
}
var readAndModify: Int {
_read {}
_modify {}
}
var getAndRedundantModify: Int {
get {}
_modify {} // expected-note {{previous definition of 'modify' accessor here}}
_modify {} // expected-error {{variable already has a 'modify' accessor}}
}
var getAndModifyAndMutableAddress: Int {
get {}
_modify {} // expected-note {{'modify' accessor defined here}}
unsafeMutableAddress {} // expected-error {{variable cannot provide both a mutable addressor and a 'modify' accessor}}
}
var getAndModifyAndSet: Int {
get {}
_modify {}
set {}
}
var getAndNonMutatingModifyAndNonMutatingSet: Int {
get {}
nonmutating _modify {}
nonmutating set {}
}
var getAndNonMutatingModifyAndSet: Int {
get {}
nonmutating _modify {} // expected-error {{'modify' accessor cannot be 'nonmutating' when the setter is 'mutating'}}
set {} // expected-note {{setter defined here}}
}
var getAndModifyAndNonMutatingSet: Int {
get {}
_modify {}// expected-error {{'modify' accessor cannot be 'mutating' when the setter is 'nonmutating'}}
nonmutating set {} // expected-note {{setter defined here}}
}
}
struct ImplicitlyUnwrapped {
var x: Int!
var y: Int? {
_read { yield x }
_modify { yield &x }
}
}