@@ -655,6 +655,103 @@ func test_as_pattern(_ y : BaseClass) -> DerivedClass {
655655 // CHECK-NEXT: return [[RESULT]] : $DerivedClass
656656 return result
657657}
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+
658755// CHECK-LABEL: sil hidden [ossa] @$s10statements22let_else_tuple_bindingyS2i_SitSgF
659756func let_else_tuple_binding( _ a : ( Int , Int ) ? ) -> Int {
660757
0 commit comments