@@ -65,3 +65,39 @@ struct MemberTests {
6565 // CHECK-NEXT: {{.*}} = apply [[IGNORE_INIT]]<(inout MemberTests) -> Int>({{.*}})
6666 @Ignore mutating func mutatingFn( ) -> Int { 42 }
6767}
68+
69+ @runtimeMetadata
70+ struct Flag < U> {
71+ init < T> ( attachedTo: T , value: U ) { }
72+ }
73+
74+ struct TestSelfUse {
75+ static var answer : Int = 42
76+ static var question : String = " "
77+
78+ // CHECK-LABEL: sil hidden [runtime_accessible] [ossa] @$s18runtime_attributes11TestSelfUseV1xSSvpfaAA4Flag : $@convention(thin) () -> @out Optional<Flag<Int>>
79+ // CHECK: [[ADDRESSOR:%.*]] = function_ref @$s18runtime_attributes11TestSelfUseV6answerSivau
80+ // CHECK-NEXT: [[ADDR_RESULT:%.*]] = apply [[ADDRESSOR]]() : $@convention(thin) () -> Builtin.RawPointer
81+ // CHECK-NEXT: [[PROP_ADDR:%.*]] = pointer_to_address [[ADDR_RESULT]] : $Builtin.RawPointer to [strict] $*Int
82+ // CHECK-NEXT: [[PROP_ACCESS:%.*]] = begin_access [read] [dynamic] [[PROP_ADDR]] : $*Int
83+ // CHECK-NEXT: [[PROP_VALUE:%.*]] = load [trivial] [[PROP_ACCESS]] : $*Int
84+ // CHECK_NEXT: end_access [[PROP_ACCESS]] : $*Int
85+ // CHECK: [[PROP_VAL_COPY:%.*]] = alloc_stack $Int
86+ // CHECK: store [[PROP_VALUE]] to [trivial] [[PROP_VAL_COPY]] : $*Int
87+ // CHECK: [[FLAG_INIT_REF:%.*]] = function_ref @$s18runtime_attributes4FlagV10attachedTo5valueACyxGqd___xtclufC
88+ // CHECK-NEXT: {{.*}} = apply [[FLAG_INIT_REF]]<Int, WritableKeyPath<TestSelfUse, String>>({{.*}}, [[PROP_VAL_COPY]], {{.*}})
89+ @Flag ( value: Self . answer) var x : String = " "
90+
91+ // CHECK-LABEL: sil hidden [runtime_accessible] [ossa] @$s18runtime_attributes11TestSelfUseV4testyycvpfaAA4Flag : $@convention(thin) () -> @out Optional<Flag<String>>
92+ // CHECK: [[ADDRESSOR:%.*]] = function_ref @$s18runtime_attributes11TestSelfUseV8questionSSvau
93+ // CHECK-NEXT: [[ADDR_RESULT:%.*]] = apply [[ADDRESSOR]]() : $@convention(thin) () -> Builtin.RawPointer
94+ // CHECK-NEXT: [[PROP_ADDR:%.*]] = pointer_to_address [[ADDR_RESULT]] : $Builtin.RawPointer to [strict] $*String
95+ // CHECK-NEXT: [[PROP_ACCESS:%.*]] = begin_access [read] [dynamic] [[PROP_ADDR]] : $*String
96+ // CHECK-NEXT: [[PROP_VALUE:%.*]] = load [copy] [[PROP_ACCESS]] : $*String
97+ // CHECK_NEXT: end_access [[PROP_ACCESS]] : $*String
98+ // CHECK: [[PROP_VAL_COPY:%.*]] = alloc_stack $String
99+ // CHECK: store [[PROP_VALUE]] to [init] [[PROP_VAL_COPY]] : $*String
100+ // CHECK: [[FLAG_INIT_REF:%.*]] = function_ref @$s18runtime_attributes4FlagV10attachedTo5valueACyxGqd___xtclufC
101+ // CHECK-NEXT: {{.*}} = apply [[FLAG_INIT_REF]]<String, (TestSelfUse) -> ()>({{.*}}, [[PROP_VAL_COPY]], {{.*}})
102+ @Flag ( value: Self . question) func test( ) { }
103+ }
0 commit comments