blob: 7541d0edcee1b4208fac928436a290a08533ee6f [file] [log] [blame]
// 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 init() { }
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: }