@@ -655,6 +655,103 @@ func test_as_pattern(_ y : BaseClass) -> DerivedClass {
655
655
// CHECK-NEXT: return [[RESULT]] : $DerivedClass
656
656
return result
657
657
}
658
+
659
+ // https://github.com/apple/swift/issues/56139
660
+
661
+ // CHECK-LABEL: sil hidden [ossa] @$s10statements31test_isa_pattern_array_downcastyySayAA9BaseClassCGF : $@convention(thin) (@guaranteed Array<BaseClass>) -> () {
662
+ func test_isa_pattern_array_downcast( _ arr: [ BaseClass ] ) {
663
+ // CHECK: [[ARR_CAST_FN:%[0-9]+]] = function_ref @$[[FN_REF:ss21_arrayConditionalCastySayq_GSgSayxGr0_lF]] : $@convention(thin) <τ_0_0, τ_0_1> (@guaranteed Array<τ_0_0>) -> @owned Optional<Array<τ_0_1>>
664
+ // CHECK-NEXT: [[RESULT:%[0-9]+]] = apply [[ARR_CAST_FN]]<BaseClass, DerivedClass>
665
+ // CHECK-NEXT: switch_enum [[RESULT]]
666
+ if case _ as [ DerivedClass ] = arr { }
667
+ // CHECK: [[ARR_CAST_FN:%[0-9]+]] = function_ref @$[[FN_REF]]
668
+ // CHECK-NEXT: [[RESULT:%[0-9]+]] = apply [[ARR_CAST_FN]]<BaseClass, DerivedClass>
669
+ // CHECK-NEXT: switch_enum [[RESULT]]
670
+ guard case _ as [ DerivedClass ] = arr else { }
671
+ // CHECK: [[ARR_CAST_FN:%[0-9]+]] = function_ref @$[[FN_REF]]
672
+ // CHECK-NEXT: [[RESULT:%[0-9]+]] = apply [[ARR_CAST_FN]]<BaseClass, DerivedClass>
673
+ // CHECK-NEXT: switch_enum [[RESULT]]
674
+ while case _ as [ DerivedClass ] = arr { }
675
+
676
+ // CHECK: [[ARR_CAST_FN:%[0-9]+]] = function_ref @$[[FN_REF]]
677
+ // CHECK-NEXT: [[RESULT:%[0-9]+]] = apply [[ARR_CAST_FN]]<BaseClass, DerivedClass>
678
+ // CHECK-NEXT: switch_enum [[RESULT]]
679
+ if case is [ DerivedClass ] = arr { }
680
+ // CHECK: [[ARR_CAST_FN:%[0-9]+]] = function_ref @$[[FN_REF]]
681
+ // CHECK-NEXT: [[RESULT:%[0-9]+]] = apply [[ARR_CAST_FN]]<BaseClass, DerivedClass>
682
+ // CHECK-NEXT: switch_enum [[RESULT]]
683
+ guard case is [ DerivedClass ] = arr else { }
684
+ // CHECK: [[ARR_CAST_FN:%[0-9]+]] = function_ref @$[[FN_REF]]
685
+ // CHECK-NEXT: [[RESULT:%[0-9]+]] = apply [[ARR_CAST_FN]]<BaseClass, DerivedClass>
686
+ // CHECK-NEXT: switch_enum [[RESULT]]
687
+ while case is [ DerivedClass ] = arr { }
688
+ }
689
+ // CHECK: } // end sil function '$s10statements31test_isa_pattern_array_downcastyySayAA9BaseClassCGF'
690
+
691
+ // CHECK-LABEL: sil hidden [ossa] @$s10statements36test_isa_pattern_dictionary_downcastyySDySSAA9BaseClassCGF : $@convention(thin) (@guaranteed Dictionary<String, BaseClass>) -> () {
692
+ func test_isa_pattern_dictionary_downcast( _ dict: Dictionary < String , BaseClass > ) {
693
+ // CHECK: [[DICT_CAST_FN:%[0-9]+]] = function_ref @$[[FN_REF:ss30_dictionaryDownCastConditionalySDyq0_q1_GSgSDyxq_GSHRzSHR0_r2_lF]] : $@convention(thin) <τ_0_0, τ_0_1, τ_0_2, τ_0_3 where τ_0_0 : Hashable, τ_0_2 : Hashable> (@guaranteed Dictionary<τ_0_0, τ_0_1>) -> @owned Optional<Dictionary<τ_0_2, τ_0_3>>
694
+ // CHECK-NEXT: [[RESULT:%[0-9]+]] = apply [[DICT_CAST_FN]]<String, BaseClass, String, DerivedClass>
695
+ // CHECK-NEXT: switch_enum [[RESULT]]
696
+ if case _ as [ String : DerivedClass ] = dict { }
697
+ // CHECK: [[DICT_CAST_FN:%[0-9]+]] = function_ref @$[[FN_REF]]
698
+ // CHECK-NEXT: [[RESULT:%[0-9]+]] = apply [[DICT_CAST_FN]]<String, BaseClass, String, DerivedClass>
699
+ // CHECK-NEXT: switch_enum [[RESULT]]
700
+ guard case _ as [ String : DerivedClass ] = dict else { }
701
+ // CHECK: [[DICT_CAST_FN:%[0-9]+]] = function_ref @$[[FN_REF]]
702
+ // CHECK-NEXT: [[RESULT:%[0-9]+]] = apply [[DICT_CAST_FN]]<String, BaseClass, String, DerivedClass>
703
+ // CHECK-NEXT: switch_enum [[RESULT]]
704
+ while case _ as [ String : DerivedClass ] = dict { }
705
+
706
+ // CHECK: [[DICT_CAST_FN:%[0-9]+]] = function_ref @$[[FN_REF]]
707
+ // CHECK-NEXT: [[RESULT:%[0-9]+]] = apply [[DICT_CAST_FN]]<String, BaseClass, String, DerivedClass>
708
+ // CHECK-NEXT: switch_enum [[RESULT]]
709
+ if case is [ String : DerivedClass ] = dict { }
710
+ // CHECK: [[DICT_CAST_FN:%[0-9]+]] = function_ref @$[[FN_REF]]
711
+ // CHECK-NEXT: [[RESULT:%[0-9]+]] = apply [[DICT_CAST_FN]]<String, BaseClass, String, DerivedClass>
712
+ // CHECK-NEXT: switch_enum [[RESULT]]
713
+ guard case is [ String : DerivedClass ] = dict else { }
714
+ // CHECK: [[DICT_CAST_FN:%[0-9]+]] = function_ref @$[[FN_REF]]
715
+ // CHECK-NEXT: [[RESULT:%[0-9]+]] = apply [[DICT_CAST_FN]]<String, BaseClass, String, DerivedClass>
716
+ // CHECK-NEXT: switch_enum [[RESULT]]
717
+ while case is [ String : DerivedClass ] = dict { }
718
+ }
719
+ // CHECK: } // end sil function '$s10statements36test_isa_pattern_dictionary_downcastyySDySSAA9BaseClassCGF'
720
+
721
+ // CHECK-LABEL: sil hidden [ossa] @$s10statements29test_isa_pattern_set_downcastyyShyxGSHRzlF : $@convention(thin) <T where T : Hashable> (@guaranteed Set<T>) -> () {
722
+ func test_isa_pattern_set_downcast< T: Hashable > ( _ set: Set < T > ) {
723
+ // CHECK: [[SET_CAST_FN:%[0-9]+]] = function_ref @$[[FN_REF:ss23_setDownCastConditionalyShyq_GSgShyxGSHRzSHR_r0_lF]] : $@convention(thin) <τ_0_0, τ_0_1 where τ_0_0 : Hashable, τ_0_1 : Hashable> (@guaranteed Set<τ_0_0>) -> @owned Optional<Set<τ_0_1>>
724
+ // CHECK-NEXT: [[RESULT:%[0-9]+]] = apply [[SET_CAST_FN]]<T, Bool>
725
+ // CHECK-NEXT: switch_enum [[RESULT]]
726
+ if case let t as Set < Bool > = set { }
727
+ // FIXME: Get rid of these warnings when https://github.com/apple/swift/issues/60808 is fixed
728
+ // expected-warning@-2 {{immutable value 't' was never used; consider replacing with '_' or removing it}}
729
+ // CHECK: [[SET_CAST_FN:%[0-9]+]] = function_ref @$[[FN_REF]]
730
+ // CHECK-NEXT: [[RESULT:%[0-9]+]] = apply [[SET_CAST_FN]]<T, Bool>
731
+ // CHECK-NEXT: switch_enum [[RESULT]]
732
+ guard case let t as Set < Bool > = set else { }
733
+ // expected-warning@-1 {{immutable value 't' was never used; consider replacing with '_' or removing it}}
734
+ // CHECK: [[SET_CAST_FN:%[0-9]+]] = function_ref @$[[FN_REF]]
735
+ // CHECK-NEXT: [[RESULT:%[0-9]+]] = apply [[SET_CAST_FN]]<T, Bool>
736
+ // CHECK-NEXT: switch_enum [[RESULT]]
737
+ while case let t as Set < Bool > = set { }
738
+ // expected-warning@-1 {{immutable value 't' was never used; consider replacing with '_' or removing it}}
739
+
740
+ // CHECK: [[SET_CAST_FN:%[0-9]+]] = function_ref @$[[FN_REF]]
741
+ // CHECK-NEXT: [[RESULT:%[0-9]+]] = apply [[SET_CAST_FN]]<T, Int>
742
+ // CHECK-NEXT: switch_enum [[RESULT]]
743
+ if case is Set < Int > = set { }
744
+ // CHECK: [[SET_CAST_FN:%[0-9]+]] = function_ref @$[[FN_REF]]
745
+ // CHECK-NEXT: [[RESULT:%[0-9]+]] = apply [[SET_CAST_FN]]<T, Int>
746
+ // CHECK-NEXT: switch_enum [[RESULT]]
747
+ guard case is Set < Int > = set else { }
748
+ // CHECK: [[SET_CAST_FN:%[0-9]+]] = function_ref @$[[FN_REF]]
749
+ // CHECK-NEXT: [[RESULT:%[0-9]+]] = apply [[SET_CAST_FN]]<T, Int>
750
+ // CHECK-NEXT: switch_enum [[RESULT]]
751
+ while case is Set < Int > = set { }
752
+ }
753
+ // CHECK: } // end sil function '$s10statements29test_isa_pattern_set_downcastyyShyxGSHRzlF'
754
+
658
755
// CHECK-LABEL: sil hidden [ossa] @$s10statements22let_else_tuple_bindingyS2i_SitSgF
659
756
func let_else_tuple_binding( _ a : ( Int , Int ) ? ) -> Int {
660
757
0 commit comments