@@ -699,3 +699,47 @@ func FormClassKeyPath() {
699
699
func getInout( _ i: inout MyInt ) -> Int {
700
700
return i [ keyPath: \MyInt . int]
701
701
}
702
+
703
+ protocol IntValuable {
704
+ var value : Int { get }
705
+ }
706
+ // CHECK-LABEL: sil {{.*}}[ossa] @getFromSubscriptOnLValueArray : {{.*}} {
707
+ // CHECK: bb0([[ARRAY_ADDR:%[^,]+]] :
708
+ // CHECK: [[ARRAY_ACCESS:%[^,]+]] = begin_access [read] [unknown] [[ARRAY_ADDR]]
709
+ // CHECK: [[ARRAY:%[^,]+]] = load_borrow [[ARRAY_ACCESS]]
710
+ // CHECK: [[SUBSCRIPT:%[^,]+]] = function_ref @$sSayxSicig
711
+ // CHECK: [[ELEMENT:%[^,]+]] = apply [[SUBSCRIPT]]<any IntValuable>({{%[^,]+}}, [[ARRAY]])
712
+ // CHECK: end_borrow [[ARRAY]]
713
+ // CHECK: [[ELEMENT_LIFETIME:%[^,]+]] = begin_borrow [[ELEMENT]]
714
+ // CHECK: [[OPEN_ELEMENT:%[^,]+]] = open_existential_value [[ELEMENT_LIFETIME]]
715
+ // CHECK: [[OPEN_ELEMENT_COPY:%[^,]+]] = copy_value [[OPEN_ELEMENT]]
716
+ // CHECK: end_access [[ARRAY_ACCESS]]
717
+ // CHECK: [[OPEN_ELEMENT_LIFETIME:%[^,]+]] = begin_borrow [[OPEN_ELEMENT_COPY]]
718
+ // CHECK: [[GETTER:%[^,]+]] = witness_method {{.*}}, #IntValuable.value!getter
719
+ // CHECK: apply [[GETTER]]<{{.*}}>([[OPEN_ELEMENT_LIFETIME]])
720
+ // CHECK: end_borrow [[OPEN_ELEMENT_LIFETIME]]
721
+ // CHECK: destroy_value [[OPEN_ELEMENT_COPY]]
722
+ // CHECK: end_borrow [[ELEMENT_LIFETIME]]
723
+ // CHECK: destroy_value [[ELEMENT]]
724
+ // CHECK-LABEL: } // end sil function 'getFromSubscriptOnLValueArray'
725
+ @_silgen_name ( " getFromSubscriptOnLValueArray " )
726
+ func getFromSubscriptOnLValueArray( _ array: inout [ IntValuable ] ) {
727
+ _ = array [ 0 ] . value
728
+ }
729
+
730
+ protocol MutatingFooable {
731
+ mutating func foo( )
732
+ }
733
+
734
+ // CHECK-LABEL: sil {{.*}}@callMutatingFooOnInoutExistential : {{.*}} {
735
+ // CHECK: bb0([[EXISTENTIAL_ADDR:%[^,]+]] :
736
+ // CHECK: [[EXISTENTIAL_ACCESS:%[^,]+]] = begin_access [modify] [unknown] [[EXISTENTIAL_ADDR]]
737
+ // CHECK: [[OPEN_ADDR:%[^,]+]] = open_existential_addr mutable_access [[EXISTENTIAL_ACCESS]]
738
+ // CHECK: [[FOO:%[^,]+]] = witness_method {{.*}}#MutatingFooable.foo
739
+ // CHECK: apply [[FOO]]<{{.*}}>([[OPEN_ADDR]])
740
+ // CHECK: end_access [[EXISTENTIAL_ACCESS]]
741
+ // CHECK-LABEL: } // end sil function 'callMutatingFooOnInoutExistential'
742
+ @_silgen_name ( " callMutatingFooOnInoutExistential " )
743
+ func callMutatingFooOnInoutExistential( _ i: inout any MutatingFooable ) {
744
+ i. foo ( )
745
+ }
0 commit comments