Files
swift-mirror/test/SILGen/property_wrappers_final.swift
Slava Pestov 52c11c78d1 Sema: Property wrapper storage wrappers ($foo) inherit 'final' bit from original property
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>.
2020-03-31 23:42:34 -04:00

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: }