mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Otherwise, we would generate inconsistent vtable layouts for classes with static properties that have attached wrappers. The reason is that we normally force synthesis of the backing storage and storage wrapper for each instance property wrapper as part of computing the lowered stored properties. However, there was no such forcing for static properties. But since a static stored property (with an attached wrapper or otherwise) must be 'final', the real fix is to just ensure that the 'final' bit propagates to the storage wrapper as well. The backing storage property was already always final, so the issue did not arise there. Fixes <rdar://problem/59522703>, <https://bugs.swift.org/browse/SR-12429>.
55 lines
1.6 KiB
Swift
55 lines
1.6 KiB
Swift
// RUN: %empty-directory(%t)
|
|
// RUN: %target-swift-emit-silgen %s | %FileCheck %s
|
|
|
|
// Test that the storage wrapper for a final property is itself final, and that
|
|
// its accessors do not appear in the vtable.
|
|
|
|
public class MyClass {
|
|
public init() { }
|
|
|
|
@PropertyWrapper()
|
|
public static var staticProperty: Bool
|
|
|
|
@PropertyWrapper()
|
|
public final var instanceProperty: Bool
|
|
|
|
}
|
|
|
|
@propertyWrapper
|
|
public struct PropertyWrapper {
|
|
public var projectedValue: PropertyWrapper {
|
|
get {
|
|
return self
|
|
}
|
|
set {
|
|
self = newValue
|
|
}
|
|
}
|
|
|
|
public var wrappedValue: Bool {
|
|
return false
|
|
}
|
|
}
|
|
|
|
// CHECK-LABEL: sil [ossa] @$s23property_wrappers_final17useStorageWrapperyyAA7MyClassCF : $@convention(thin) (@guaranteed MyClass) -> () {
|
|
public func useStorageWrapper(_ c: MyClass) {
|
|
// CHECK: function_ref @$s23property_wrappers_final7MyClassC15$staticPropertyAA0G7WrapperVvgZ
|
|
_ = MyClass.$staticProperty
|
|
|
|
// CHECK: function_ref @$s23property_wrappers_final7MyClassC15$staticPropertyAA0G7WrapperVvsZ
|
|
MyClass.$staticProperty = PropertyWrapper()
|
|
|
|
// CHECK: $s23property_wrappers_final7MyClassC17$instancePropertyAA0G7WrapperVvg
|
|
_ = c.$instanceProperty
|
|
|
|
// CHECK: $s23property_wrappers_final7MyClassC17$instancePropertyAA0G7WrapperVvs
|
|
c.$instanceProperty = PropertyWrapper()
|
|
|
|
// CHECK: return
|
|
}
|
|
|
|
// CHECK-LABEL: sil_vtable [serialized] MyClass {
|
|
// CHECK-NEXT: #MyClass.init!allocator: (MyClass.Type) -> () -> MyClass : @$s23property_wrappers_final7MyClassCACycfC
|
|
// CHECK-NEXT: #MyClass.deinit!deallocator: @$s23property_wrappers_final7MyClassCfD
|
|
// CHECK-NEXT: }
|