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