@@ -122,3 +122,44 @@ func partial<A>(valueA: A,
122
122
_ = valueB [ keyPath: pkpB]
123
123
}
124
124
125
+ extension Int {
126
+ var b : Int { get { return 0 } set { } }
127
+ var u : Int { get { return 0 } set { } }
128
+ var tt : Int { get { return 0 } set { } }
129
+ }
130
+
131
+ // CHECK-LABEL: sil hidden @{{.*}}writebackNesting
132
+ func writebackNesting( x: inout Int ,
133
+ y: WritableKeyPath < Int , Int > ,
134
+ z: WritableKeyPath < Int , Int > ,
135
+ w: Int ) -> Int {
136
+ // -- get 'b'
137
+ // CHECK: function_ref @$SSi19keypath_applicationE1bSivg
138
+ // -- apply keypath y
139
+ // CHECK: [[PROJECT_FN:%.*]] = function_ref @{{.*}}_projectKeyPathWritable
140
+ // CHECK: [[PROJECT_RET:%.*]] = apply [[PROJECT_FN]]
141
+ // CHECK: [[PROJECT_RET_BORROW:%.*]] = begin_borrow [[PROJECT_RET]]
142
+ // CHECK: [[PROJECT_RET_BORROW_OWNER:%.*]] = tuple_extract [[PROJECT_RET_BORROW]] {{.*}}, 1
143
+ // CHECK: [[OWNER_Y:%.*]] = copy_value [[PROJECT_RET_BORROW_OWNER]]
144
+ // -- get 'u'
145
+ // CHECK: function_ref @$SSi19keypath_applicationE1uSivg
146
+ // -- apply keypath z
147
+ // CHECK: [[PROJECT_FN:%.*]] = function_ref @{{.*}}_projectKeyPathWritable
148
+ // CHECK: [[PROJECT_RET:%.*]] = apply [[PROJECT_FN]]
149
+ // CHECK: [[PROJECT_RET_BORROW:%.*]] = begin_borrow [[PROJECT_RET]]
150
+ // CHECK: [[PROJECT_RET_BORROW_OWNER:%.*]] = tuple_extract [[PROJECT_RET_BORROW]] {{.*}}, 1
151
+ // CHECK: [[OWNER_Z:%.*]] = copy_value [[PROJECT_RET_BORROW_OWNER]]
152
+
153
+ // -- set 'tt'
154
+ // CHECK: function_ref @$SSi19keypath_applicationE2ttSivs
155
+ // -- destroy owner for keypath projection z
156
+ // CHECK: destroy_value [[OWNER_Z]]
157
+ // -- set 'u'
158
+ // CHECK: function_ref @$SSi19keypath_applicationE1uSivs
159
+ // -- destroy owner for keypath projection y
160
+ // CHECK: destroy_value [[OWNER_Y]]
161
+ // -- set 'b'
162
+ // CHECK: function_ref @$SSi19keypath_applicationE1bSivs
163
+
164
+ x. b [ keyPath: y] . u [ keyPath: z] . tt = w
165
+ }
0 commit comments