mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
324 lines
14 KiB
Swift
324 lines
14 KiB
Swift
// RUN: %target-typecheck-verify-swift -target %target-swift-5.9-abi-triple
|
|
|
|
// rdar://121214563
|
|
// https://github.com/apple/swift/issues/62219
|
|
|
|
// nonmutating get mutating set
|
|
|
|
do {
|
|
protocol P {
|
|
associatedtype A: P
|
|
|
|
var getOnlyProp: A { get set }
|
|
subscript(getOnlySubscript _: Void) -> A { get set }
|
|
|
|
var setOnlyProp: (A) -> Void { get set }
|
|
subscript(setOnlySubscript _: Void) -> (A) -> Void { get set }
|
|
}
|
|
|
|
let p: any P
|
|
let pClosure: (any P) -> Void
|
|
|
|
do {
|
|
let rvalueP: any P // expected-note 2 {{change 'let' to 'var' to make it mutable}}
|
|
|
|
let _ = rvalueP.getOnlyProp
|
|
// expected-error@+1 {{cannot assign to property: 'rvalueP' is a 'let' constant}}
|
|
rvalueP.getOnlyProp = p
|
|
let _ = rvalueP[getOnlySubscript: ()]
|
|
// expected-error@+1 {{cannot assign through subscript: 'rvalueP' is a 'let' constant}}
|
|
rvalueP[getOnlySubscript: ()] = p
|
|
|
|
// expected-error@+1 {{member 'setOnlyProp' cannot be used on value of type 'any P'; consider using a generic constraint instead}}
|
|
let _ = rvalueP.setOnlyProp
|
|
// expected-error@+1 {{member 'setOnlyProp' cannot be used on value of type 'any P'; consider using a generic constraint instead}}
|
|
rvalueP.setOnlyProp = pClosure
|
|
// expected-error@+1 {{member 'subscript' cannot be used on value of type 'any P'; consider using a generic constraint instead}}
|
|
let _ = rvalueP[setOnlySubscript: ()]
|
|
// expected-error@+1 {{member 'subscript' cannot be used on value of type 'any P'; consider using a generic constraint instead}}
|
|
rvalueP[setOnlySubscript: ()] = pClosure
|
|
}
|
|
|
|
func takesInout(_: inout any P) {}
|
|
|
|
do {
|
|
var lvalueP: any P
|
|
|
|
let _ = lvalueP.getOnlyProp
|
|
// expected-error@+1 {{cannot assign to property: 'lvalueP' is immutable}}
|
|
lvalueP.getOnlyProp = p
|
|
// expected-error@+1 {{cannot pass immutable value as inout argument: 'lvalueP' is immutable}}
|
|
takesInout(&lvalueP.getOnlyProp)
|
|
let _ = lvalueP[getOnlySubscript: ()]
|
|
// expected-error@+1 {{cannot assign through subscript: 'lvalueP' is immutable}}
|
|
lvalueP[getOnlySubscript: ()] = p
|
|
// expected-error@+1 {{cannot pass immutable value as inout argument: 'lvalueP' is immutable}}
|
|
takesInout(&lvalueP[getOnlySubscript: ()])
|
|
|
|
// expected-error@+1 {{member 'setOnlyProp' cannot be used on value of type 'any P'; consider using a generic constraint instead}}
|
|
let _ = lvalueP.setOnlyProp
|
|
// expected-error@+1 {{member 'setOnlyProp' cannot be used on value of type 'any P'; consider using a generic constraint instead}}
|
|
lvalueP.setOnlyProp = pClosure
|
|
// expected-error@+1 {{member 'subscript' cannot be used on value of type 'any P'; consider using a generic constraint instead}}
|
|
let _ = lvalueP[setOnlySubscript: ()]
|
|
// expected-error@+1 {{member 'subscript' cannot be used on value of type 'any P'; consider using a generic constraint instead}}
|
|
lvalueP[setOnlySubscript: ()] = pClosure
|
|
}
|
|
}
|
|
|
|
// static
|
|
|
|
do {
|
|
protocol P {
|
|
associatedtype A: P
|
|
|
|
static var getOnlyProp: A { get set }
|
|
static subscript(getOnlySubscript _: Void) -> A { get set }
|
|
|
|
static var setOnlyProp: (A) -> Void { get set }
|
|
static subscript(setOnlySubscript _: Void) -> (A) -> Void { get set }
|
|
}
|
|
|
|
let p: any P
|
|
let pClosure: (any P) -> Void
|
|
|
|
do {
|
|
let rvalueP: any P.Type // expected-note 2 {{change 'let' to 'var' to make it mutable}}
|
|
|
|
let _ = rvalueP.getOnlyProp
|
|
// expected-error@+1 {{cannot assign to property: 'rvalueP' is a 'let' constant}}
|
|
rvalueP.getOnlyProp = p
|
|
let _ = rvalueP[getOnlySubscript: ()]
|
|
// expected-error@+1 {{cannot assign through subscript: 'rvalueP' is a 'let' constant}}
|
|
rvalueP[getOnlySubscript: ()] = p
|
|
|
|
// expected-error@+1 {{member 'setOnlyProp' cannot be used on value of type 'any P.Type'; consider using a generic constraint instead}}
|
|
let _ = rvalueP.setOnlyProp
|
|
// expected-error@+1 {{member 'setOnlyProp' cannot be used on value of type 'any P.Type'; consider using a generic constraint instead}}
|
|
rvalueP.setOnlyProp = pClosure
|
|
// expected-error@+1 {{member 'subscript' cannot be used on value of type 'any P.Type'; consider using a generic constraint instead}}
|
|
let _ = rvalueP[setOnlySubscript: ()]
|
|
// expected-error@+1 {{member 'subscript' cannot be used on value of type 'any P.Type'; consider using a generic constraint instead}}
|
|
rvalueP[setOnlySubscript: ()] = pClosure
|
|
}
|
|
|
|
func takesInout(_: inout any P) {}
|
|
|
|
do {
|
|
var lvalueP: any P.Type
|
|
|
|
let _ = lvalueP.getOnlyProp
|
|
// expected-error@+1 {{cannot assign to property: 'lvalueP' is immutable}}
|
|
lvalueP.getOnlyProp = p
|
|
// expected-error@+1 {{cannot pass immutable value as inout argument: 'lvalueP' is immutable}}
|
|
takesInout(&lvalueP.getOnlyProp)
|
|
let _ = lvalueP[getOnlySubscript: ()]
|
|
// expected-error@+1 {{cannot assign through subscript: 'lvalueP' is immutable}}
|
|
lvalueP[getOnlySubscript: ()] = p
|
|
// expected-error@+1 {{cannot pass immutable value as inout argument: 'lvalueP' is immutable}}
|
|
takesInout(&lvalueP[getOnlySubscript: ()])
|
|
|
|
// expected-error@+1 {{member 'setOnlyProp' cannot be used on value of type 'any P.Type'; consider using a generic constraint instead}}
|
|
let _ = lvalueP.setOnlyProp
|
|
// expected-error@+1 {{member 'setOnlyProp' cannot be used on value of type 'any P.Type'; consider using a generic constraint instead}}
|
|
lvalueP.setOnlyProp = pClosure
|
|
// expected-error@+1 {{member 'subscript' cannot be used on value of type 'any P.Type'; consider using a generic constraint instead}}
|
|
let _ = lvalueP[setOnlySubscript: ()]
|
|
// expected-error@+1 {{member 'subscript' cannot be used on value of type 'any P.Type'; consider using a generic constraint instead}}
|
|
lvalueP[setOnlySubscript: ()] = pClosure
|
|
}
|
|
}
|
|
|
|
// mutating get mutating set
|
|
|
|
do {
|
|
protocol P {
|
|
associatedtype A: P
|
|
|
|
var getOnlyProp: A { mutating get set }
|
|
subscript(getOnlySubscript _: Void) -> A { mutating get set }
|
|
|
|
var setOnlyProp: (A) -> Void { mutating get set }
|
|
subscript(setOnlySubscript _: Void) -> (A) -> Void { mutating get set }
|
|
}
|
|
|
|
let p: any P
|
|
let pClosure: (any P) -> Void
|
|
|
|
do {
|
|
let rvalueP: any P // expected-note 4 {{change 'let' to 'var' to make it mutable}}
|
|
|
|
// expected-error@+1 {{cannot use mutating getter on immutable value: 'rvalueP' is a 'let' constant}}
|
|
let _ = rvalueP.getOnlyProp
|
|
// expected-error@+1 {{cannot assign to property: 'rvalueP' is a 'let' constant}}
|
|
rvalueP.getOnlyProp = p
|
|
// expected-error@+1 {{cannot use mutating getter on immutable value: 'rvalueP' is a 'let' constant}}
|
|
let _ = rvalueP[getOnlySubscript: ()]
|
|
// expected-error@+1 {{cannot assign through subscript: 'rvalueP' is a 'let' constant}}
|
|
rvalueP[getOnlySubscript: ()] = p
|
|
|
|
// expected-error@+1 {{member 'setOnlyProp' cannot be used on value of type 'any P'; consider using a generic constraint instead}}
|
|
let _ = rvalueP.setOnlyProp
|
|
// expected-error@+1 {{member 'setOnlyProp' cannot be used on value of type 'any P'; consider using a generic constraint instead}}
|
|
rvalueP.setOnlyProp = pClosure
|
|
// expected-error@+1 {{member 'subscript' cannot be used on value of type 'any P'; consider using a generic constraint instead}}
|
|
let _ = rvalueP[setOnlySubscript: ()]
|
|
// expected-error@+1 {{member 'subscript' cannot be used on value of type 'any P'; consider using a generic constraint instead}}
|
|
rvalueP[setOnlySubscript: ()] = pClosure
|
|
}
|
|
|
|
func takesInout(_: inout any P) {}
|
|
|
|
do {
|
|
var lvalueP: any P
|
|
|
|
let _ = lvalueP.getOnlyProp
|
|
// expected-error@+1 {{cannot assign to property: 'lvalueP' is immutable}}
|
|
lvalueP.getOnlyProp = p
|
|
// expected-error@+1 {{cannot pass immutable value as inout argument: 'lvalueP' is immutable}}
|
|
takesInout(&lvalueP.getOnlyProp)
|
|
let _ = lvalueP[getOnlySubscript: ()]
|
|
// expected-error@+1 {{cannot assign through subscript: 'lvalueP' is immutable}}
|
|
lvalueP[getOnlySubscript: ()] = p
|
|
// expected-error@+1 {{cannot pass immutable value as inout argument: 'lvalueP' is immutable}}
|
|
takesInout(&lvalueP[getOnlySubscript: ()])
|
|
|
|
// expected-error@+1 {{member 'setOnlyProp' cannot be used on value of type 'any P'; consider using a generic constraint instead}}
|
|
let _ = lvalueP.setOnlyProp
|
|
// expected-error@+1 {{member 'setOnlyProp' cannot be used on value of type 'any P'; consider using a generic constraint instead}}
|
|
lvalueP.setOnlyProp = pClosure
|
|
// expected-error@+1 {{member 'subscript' cannot be used on value of type 'any P'; consider using a generic constraint instead}}
|
|
let _ = lvalueP[setOnlySubscript: ()]
|
|
// expected-error@+1 {{member 'subscript' cannot be used on value of type 'any P'; consider using a generic constraint instead}}
|
|
lvalueP[setOnlySubscript: ()] = pClosure
|
|
}
|
|
}
|
|
|
|
// nonmutating get nonmutating set
|
|
|
|
do {
|
|
protocol P {
|
|
associatedtype A: P
|
|
|
|
var getOnlyProp: A { get nonmutating set }
|
|
subscript(getOnlySubscript _: Void) -> A { get nonmutating set }
|
|
|
|
var setOnlyProp: (A) -> Void { get nonmutating set }
|
|
subscript(setOnlySubscript _: Void) -> (A) -> Void { get nonmutating set }
|
|
}
|
|
|
|
let p: any P
|
|
let pClosure: (any P) -> Void
|
|
|
|
do {
|
|
let rvalueP: any P // expected-note 2 {{change 'let' to 'var' to make it mutable}}
|
|
|
|
let _ = rvalueP.getOnlyProp
|
|
// expected-error@+1 {{cannot assign to property: 'rvalueP' is a 'let' constant}}
|
|
rvalueP.getOnlyProp = p
|
|
let _ = rvalueP[getOnlySubscript: ()]
|
|
// expected-error@+1 {{cannot assign through subscript: 'rvalueP' is a 'let' constant}}
|
|
rvalueP[getOnlySubscript: ()] = p
|
|
|
|
// expected-error@+1 {{member 'setOnlyProp' cannot be used on value of type 'any P'; consider using a generic constraint instead}}
|
|
let _ = rvalueP.setOnlyProp
|
|
// expected-error@+1 {{member 'setOnlyProp' cannot be used on value of type 'any P'; consider using a generic constraint instead}}
|
|
rvalueP.setOnlyProp = pClosure
|
|
// expected-error@+1 {{member 'subscript' cannot be used on value of type 'any P'; consider using a generic constraint instead}}
|
|
let _ = rvalueP[setOnlySubscript: ()]
|
|
// expected-error@+1 {{member 'subscript' cannot be used on value of type 'any P'; consider using a generic constraint instead}}
|
|
rvalueP[setOnlySubscript: ()] = pClosure
|
|
}
|
|
|
|
func takesInout(_: inout any P) {}
|
|
|
|
do {
|
|
var lvalueP: any P
|
|
|
|
let _ = lvalueP.getOnlyProp
|
|
// expected-error@+1 {{cannot assign to property: 'lvalueP' is immutable}}
|
|
lvalueP.getOnlyProp = p
|
|
// expected-error@+1 {{cannot pass immutable value as inout argument: 'lvalueP' is immutable}}
|
|
takesInout(&lvalueP.getOnlyProp)
|
|
let _ = lvalueP[getOnlySubscript: ()]
|
|
// expected-error@+1 {{cannot assign through subscript: 'lvalueP' is immutable}}
|
|
lvalueP[getOnlySubscript: ()] = p
|
|
// expected-error@+1 {{cannot pass immutable value as inout argument: 'lvalueP' is immutable}}
|
|
takesInout(&lvalueP[getOnlySubscript: ()])
|
|
|
|
// expected-error@+1 {{member 'setOnlyProp' cannot be used on value of type 'any P'; consider using a generic constraint instead}}
|
|
let _ = lvalueP.setOnlyProp
|
|
// expected-error@+1 {{member 'setOnlyProp' cannot be used on value of type 'any P'; consider using a generic constraint instead}}
|
|
lvalueP.setOnlyProp = pClosure
|
|
// expected-error@+1 {{member 'subscript' cannot be used on value of type 'any P'; consider using a generic constraint instead}}
|
|
let _ = lvalueP[setOnlySubscript: ()]
|
|
// expected-error@+1 {{member 'subscript' cannot be used on value of type 'any P'; consider using a generic constraint instead}}
|
|
lvalueP[setOnlySubscript: ()] = pClosure
|
|
}
|
|
}
|
|
|
|
// mutating get nonmutating set
|
|
|
|
do {
|
|
protocol P {
|
|
associatedtype A: P
|
|
|
|
var getOnlyProp: A { mutating get nonmutating set }
|
|
subscript(getOnlySubscript _: Void) -> A { mutating get nonmutating set }
|
|
|
|
var setOnlyProp: (A) -> Void { mutating get nonmutating set }
|
|
subscript(setOnlySubscript _: Void) -> (A) -> Void { mutating get nonmutating set }
|
|
}
|
|
|
|
let p: any P
|
|
let pClosure: (any P) -> Void
|
|
|
|
do {
|
|
let rvalueP: any P // expected-note 4 {{change 'let' to 'var' to make it mutable}}
|
|
|
|
// expected-error@+1 {{cannot use mutating getter on immutable value: 'rvalueP' is a 'let' constant}}
|
|
let _ = rvalueP.getOnlyProp
|
|
// expected-error@+1 {{cannot assign to property: 'rvalueP' is a 'let' constant}}
|
|
rvalueP.getOnlyProp = p
|
|
// expected-error@+1 {{cannot use mutating getter on immutable value: 'rvalueP' is a 'let' constant}}
|
|
let _ = rvalueP[getOnlySubscript: ()]
|
|
// expected-error@+1 {{cannot assign through subscript: 'rvalueP' is a 'let' constant}}
|
|
rvalueP[getOnlySubscript: ()] = p
|
|
|
|
// expected-error@+1 {{member 'setOnlyProp' cannot be used on value of type 'any P'; consider using a generic constraint instead}}
|
|
let _ = rvalueP.setOnlyProp
|
|
// expected-error@+1 {{member 'setOnlyProp' cannot be used on value of type 'any P'; consider using a generic constraint instead}}
|
|
rvalueP.setOnlyProp = pClosure
|
|
// expected-error@+1 {{member 'subscript' cannot be used on value of type 'any P'; consider using a generic constraint instead}}
|
|
let _ = rvalueP[setOnlySubscript: ()]
|
|
// expected-error@+1 {{member 'subscript' cannot be used on value of type 'any P'; consider using a generic constraint instead}}
|
|
rvalueP[setOnlySubscript: ()] = pClosure
|
|
}
|
|
|
|
func takesInout(_: inout any P) {}
|
|
|
|
do {
|
|
var lvalueP: any P
|
|
|
|
let _ = lvalueP.getOnlyProp
|
|
// expected-error@+1 {{cannot assign to property: 'lvalueP' is immutable}}
|
|
lvalueP.getOnlyProp = p
|
|
// expected-error@+1 {{cannot pass immutable value as inout argument: 'lvalueP' is immutable}}
|
|
takesInout(&lvalueP.getOnlyProp)
|
|
let _ = lvalueP[getOnlySubscript: ()]
|
|
// expected-error@+1 {{cannot assign through subscript: 'lvalueP' is immutable}}
|
|
lvalueP[getOnlySubscript: ()] = p
|
|
// expected-error@+1 {{cannot pass immutable value as inout argument: 'lvalueP' is immutable}}
|
|
takesInout(&lvalueP[getOnlySubscript: ()])
|
|
|
|
// expected-error@+1 {{member 'setOnlyProp' cannot be used on value of type 'any P'; consider using a generic constraint instead}}
|
|
let _ = lvalueP.setOnlyProp
|
|
// expected-error@+1 {{member 'setOnlyProp' cannot be used on value of type 'any P'; consider using a generic constraint instead}}
|
|
lvalueP.setOnlyProp = pClosure
|
|
// expected-error@+1 {{member 'subscript' cannot be used on value of type 'any P'; consider using a generic constraint instead}}
|
|
let _ = lvalueP[setOnlySubscript: ()]
|
|
// expected-error@+1 {{member 'subscript' cannot be used on value of type 'any P'; consider using a generic constraint instead}}
|
|
lvalueP[setOnlySubscript: ()] = pClosure
|
|
}
|
|
}
|