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