mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Correctly handle implicit closures in initializers, e.g. with boolean operators:
init() {
bool_member1 = false
bool_member2 = false || bool_member1 // implicit closure
}
The implicit closure ('bool_member1' at the RHS of the || operator) captures the whole self, but only uses 'bool_member1'.
If the whole captured 'self' is considered as use, we would get a "'self.bool_member2' not initialized" error at the partial_apply.
Therefore look into the body of the closure and only add the actually used members.
rdar://66420045
73 lines
883 B
Swift
73 lines
883 B
Swift
// RUN: %target-swift-frontend -emit-sil %s -o /dev/null
|
|
|
|
// Test boolean operators with implicit closures
|
|
|
|
struct Simple {
|
|
let x: Bool
|
|
let y: Bool
|
|
|
|
init() {
|
|
x = false
|
|
y = false || x
|
|
}
|
|
}
|
|
|
|
struct NestedClosures {
|
|
let x: Bool
|
|
let y: Bool
|
|
let z: Bool
|
|
|
|
init(a: Bool) {
|
|
x = false
|
|
y = false
|
|
z = false || (y || (x || a))
|
|
}
|
|
|
|
init(b: Bool) {
|
|
x = false
|
|
y = false
|
|
// With explicit self
|
|
z = false || (self.y || (self.x || b))
|
|
}
|
|
}
|
|
|
|
class SimpleClass {
|
|
let x: Bool
|
|
let y: Bool
|
|
|
|
init() {
|
|
x = false
|
|
y = false || x
|
|
}
|
|
}
|
|
|
|
func forward(_ b: inout Bool) -> Bool {
|
|
return b
|
|
}
|
|
|
|
struct InoutUse {
|
|
var x: Bool
|
|
var y: Bool
|
|
|
|
init() {
|
|
x = false
|
|
y = false || forward(&x)
|
|
}
|
|
}
|
|
|
|
protocol P {
|
|
var b: Bool { get }
|
|
}
|
|
|
|
struct Generic<T : P> {
|
|
let x: T
|
|
let y: Bool
|
|
|
|
init(_ t: T) {
|
|
x = t
|
|
y = false || x.b
|
|
}
|
|
}
|
|
|
|
|