mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
125 lines
3.0 KiB
Swift
125 lines
3.0 KiB
Swift
// RUN: %target-typecheck-verify-swift -disable-availability-checking -enable-experimental-feature BorrowAndMutateAccessors -enable-experimental-feature CoroutineAccessors
|
|
|
|
// REQUIRES: swift_feature_BorrowAndMutateAccessors
|
|
// REQUIRES: swift_feature_CoroutineAccessors
|
|
|
|
class Klass {}
|
|
|
|
struct Wrapper {
|
|
let _k: Klass
|
|
var _otherK: Klass
|
|
|
|
var k1: Klass {
|
|
borrow {
|
|
return _k
|
|
}
|
|
}
|
|
var k2: Klass {
|
|
borrow { // expected-error{{variable cannot provide both a 'borrow' accessor and a getter}}
|
|
return _k
|
|
}
|
|
get { // expected-note{{getter defined here}}
|
|
return _k
|
|
}
|
|
}
|
|
var k3: Klass {
|
|
borrow { // expected-error{{variable cannot provide both a 'borrow' accessor and a '_read' accessor}}
|
|
return _k
|
|
}
|
|
_read { // expected-note{{'_read' accessor defined here}}
|
|
yield _k
|
|
}
|
|
}
|
|
var k4: Klass {
|
|
borrow { // expected-error{{variable cannot provide both a 'borrow' accessor and a 'read' accessor}}
|
|
return _k
|
|
}
|
|
read { // expected-note{{'read' accessor defined here}}
|
|
yield _k
|
|
}
|
|
}
|
|
var k5: Klass {
|
|
mutate { // expected-error{{variable with a 'mutate' accessor must also have a 'borrow' accessor, getter, addressor or 'read' accessor}}
|
|
return &_otherK
|
|
}
|
|
}
|
|
var k6: Klass {
|
|
borrow {
|
|
return _otherK
|
|
}
|
|
mutate { // expected-error{{variable cannot provide both a 'mutate' accessor and a setter}}
|
|
return &_otherK
|
|
}
|
|
_modify {
|
|
yield &_otherK
|
|
}
|
|
set { // expected-note{{setter defined here}}
|
|
_otherK = newValue
|
|
}
|
|
}
|
|
var k7: Klass {
|
|
borrow {
|
|
return _otherK
|
|
}
|
|
mutate { // expected-note{{mutate accessor defined here}}
|
|
return &_otherK
|
|
}
|
|
unsafeMutableAddress { // expected-error{{variable cannot provide both a mutable addressor and a 'mutate' accessor}}
|
|
}
|
|
}
|
|
var k8: Klass {
|
|
borrow async throws { // expected-error{{'borrow' accessor cannot have specifier 'async'}} expected-error{{'borrow' accessor cannot have specifier 'throws'}}
|
|
return _otherK
|
|
}
|
|
mutate async throws { // expected-error{{'mutate' accessor cannot have specifier 'async'}} expected-error{{'mutate' accessor cannot have specifier 'throws'}}
|
|
return &_otherK
|
|
}
|
|
}
|
|
}
|
|
|
|
var i: Int
|
|
|
|
var i_accessor: Int {
|
|
borrow { // expected-error{{a 'borrow' accessor is supported only on a struct or enum}}
|
|
fatalError()
|
|
}
|
|
mutate { // expected-error{{a 'mutate' accessor is supported only on a struct or enum}}
|
|
return &i // expected-error{{'&' may only be used to pass an argument to inout parameter}}
|
|
}
|
|
}
|
|
|
|
var _count: Int = 0
|
|
|
|
enum Color {
|
|
case red
|
|
case green
|
|
case blue
|
|
|
|
var count: Int {
|
|
borrow {
|
|
return _count
|
|
}
|
|
mutate {
|
|
return &_count
|
|
}
|
|
}
|
|
}
|
|
|
|
class KlassWrapper {
|
|
var _k: Klass
|
|
|
|
init(_ k: Klass) {
|
|
self._k = k
|
|
}
|
|
|
|
var k: Klass {
|
|
borrow {// expected-error{{a 'borrow' accessor is supported only on a struct or enum}}
|
|
return _k
|
|
}
|
|
mutate {// expected-error{{a 'mutate' accessor is supported only on a struct or enum}}
|
|
return &_k
|
|
}
|
|
}
|
|
}
|
|
|