mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
The storage kind has been replaced with three separate "impl kinds", one for each of the basic access kinds (read, write, and read/write). This makes it far easier to mix-and-match implementations of different accessors, as well as subtleties like implementing both a setter and an independent read/write operation. AccessStrategy has become a bit more explicit about how exactly the access should be implemented. For example, the accessor-based kinds now carry the exact accessor intended to be used. Also, I've shifted responsibilities slightly between AccessStrategy and AccessSemantics so that AccessSemantics::Ordinary can be used except in the sorts of semantic-bypasses that accessor synthesis wants. This requires knowing the correct DC of the access when computing the access strategy; the upshot is that SILGenFunction now needs a DC. Accessor synthesis has been reworked so that only the declarations are built immediately; body synthesis can be safely delayed out of the main decl-checking path. This caused a large number of ramifications, especially for lazy properties, and greatly inflated the size of this patch. That is... really regrettable. The impetus for changing this was necessity: I needed to rework accessor synthesis to end its reliance on distinctions like Stored vs. StoredWithTrivialAccessors, and those fixes were exposing serious re-entrancy problems, and fixing that... well. Breaking the fixes apart at this point would be a serious endeavor.
19 lines
959 B
Swift
19 lines
959 B
Swift
// RUN: %target-typecheck-verify-swift
|
|
|
|
class LazyReferenceClass {
|
|
lazy unowned(unsafe) var unsafeSelf = { self }()
|
|
// expected-error@-1 {{lazy properties cannot be 'unowned(unsafe)'}}
|
|
|
|
lazy weak var weakValue = LazyReferenceClass()
|
|
// expected-error@-1 {{lazy properties cannot be 'weak'}}
|
|
// expected-warning@-2 {{instance will be immediately deallocated because property 'weakValue' is 'weak'}}
|
|
// expected-note@-3 {{'weakValue' declared here}}
|
|
// expected-note@-4 {{a strong reference is required to prevent the instance from being deallocated}}
|
|
|
|
unowned lazy var unownedValue = LazyReferenceClass()
|
|
// expected-error@-1 {{lazy properties cannot be 'unowned'}}
|
|
// expected-warning@-2 {{instance will be immediately deallocated because property 'unownedValue' is 'unowned'}}
|
|
// expected-note@-3 {{'unownedValue' declared here}}
|
|
// expected-note@-4 {{a strong reference is required to prevent the instance from being deallocated}}
|
|
}
|