@@ -11,6 +11,7 @@ protocol P {}
11
11
protocol Q : P { }
12
12
13
13
class A : P { }
14
+ class AA : A { }
14
15
15
16
class X { }
16
17
@@ -204,6 +205,18 @@ func cast33(_ p: P) -> Bool {
204
205
return p is X . Type
205
206
}
206
207
208
+ func cast38< T> ( _ t: T ) -> Bool {
209
+ return t is ( Int , Int )
210
+ }
211
+
212
+ func cast39< T> ( _ t: T ) -> Bool {
213
+ return t is ( x: Int , y: Int )
214
+ }
215
+
216
+ func cast40< T> ( _ t: T ) -> Bool {
217
+ return t is ( x: Int , y: A )
218
+ }
219
+
207
220
// CHECK-LABEL: sil hidden [noinline] @_TF12cast_folding5test0FT_Sb : $@convention(thin) () -> Bool
208
221
// CHECK: bb0
209
222
// CHECK-NEXT: %0 = integer_literal $Builtin.Int1, -1
@@ -798,6 +811,114 @@ public func test37<T>(ah: T) {
798
811
}
799
812
}
800
813
814
+ // CHECK-LABEL: sil [noinline] @_TF12cast_folding7test38a
815
+ // CHECK: bb0
816
+ // CHECK-NEXT: %0 = integer_literal $Builtin.Int1, -1
817
+ // CHECK-NEXT: %1 = struct $Bool
818
+ // CHECK-NEXT: return %1
819
+ @inline ( never)
820
+ public func test38a( ) -> Bool {
821
+ return cast38 ( ( 1 , 2 ) )
822
+ }
823
+
824
+ // CHECK-LABEL: sil [noinline] @_TF12cast_folding7test38b
825
+ // CHECK: bb0
826
+ // CHECK-NEXT: %0 = integer_literal $Builtin.Int1, -1
827
+ // CHECK-NEXT: %1 = struct $Bool
828
+ // CHECK-NEXT: return %1
829
+ @inline ( never)
830
+ public func test38b( ) -> Bool {
831
+ return cast38 ( ( x: 1 , y: 2 ) )
832
+ }
833
+
834
+ // CHECK-LABEL: sil [noinline] @_TF12cast_folding7test38c
835
+ // CHECK: bb0
836
+ // CHECK-NEXT: %0 = integer_literal $Builtin.Int1, -1
837
+ // CHECK-NEXT: %1 = struct $Bool
838
+ // CHECK-NEXT: return %1
839
+ @inline ( never)
840
+ public func test38c( ) -> Bool {
841
+ return cast38 ( ( z: 1 , y: 2 ) )
842
+ }
843
+
844
+ // CHECK-LABEL: sil [noinline] @_TF12cast_folding7test39a
845
+ // CHECK: bb0
846
+ // CHECK-NEXT: %0 = integer_literal $Builtin.Int1, -1
847
+ // CHECK-NEXT: %1 = struct $Bool
848
+ // CHECK-NEXT: return %1
849
+ @inline ( never)
850
+ public func test39a( ) -> Bool {
851
+ return cast39 ( ( 1 , 2 ) )
852
+ }
853
+
854
+ // CHECK-LABEL: sil [noinline] @_TF12cast_folding7test39b
855
+ // CHECK: bb0
856
+ // CHECK-NEXT: %0 = integer_literal $Builtin.Int1, -1
857
+ // CHECK-NEXT: %1 = struct $Bool
858
+ // CHECK-NEXT: return %1
859
+ @inline ( never)
860
+ public func test39b( ) -> Bool {
861
+ return cast39 ( ( x: 1 , y: 2 ) )
862
+ }
863
+
864
+ // CHECK-LABEL: sil [noinline] @_TF12cast_folding7test39c
865
+ // CHECK: bb0
866
+ // CHECK-NEXT: %0 = integer_literal $Builtin.Int1, 0
867
+ // CHECK-NEXT: %1 = struct $Bool
868
+ // CHECK-NEXT: return %1
869
+ @inline ( never)
870
+ public func test39c( ) -> Bool {
871
+ return cast39 ( ( z: 1 , y: 2 ) )
872
+ }
873
+
874
+ // CHECK-LABEL: sil [noinline] @_TF12cast_folding7test39d
875
+ // CHECK: bb0
876
+ // CHECK-NEXT: %0 = integer_literal $Builtin.Int1, 0
877
+ // CHECK-NEXT: %1 = struct $Bool
878
+ // CHECK-NEXT: return %1
879
+ @inline ( never)
880
+ public func test39d( ) -> Bool {
881
+ return cast39 ( ( 1 , 2 , 3 ) )
882
+ }
883
+
884
+ // CHECK-LABEL: sil [noinline] @_TF12cast_folding7test40a
885
+ // CHECK: bb0
886
+ // FIXME: Would love to fold this to just "true"
887
+ // CHECK-NOT: return:
888
+ // CHECK: unconditional_checked_cast_addr
889
+ @inline ( never)
890
+ public func test40a( ) -> Bool {
891
+ return cast40 ( ( 1 , A ( ) ) )
892
+ }
893
+
894
+ // CHECK-LABEL: sil [noinline] @_TF12cast_folding7test40b
895
+ // CHECK: bb0
896
+ // FIXME: Would love to fold this to just "true"
897
+ // CHECK-NOT: return:
898
+ // CHECK: unconditional_checked_cast_addr
899
+ @inline ( never)
900
+ public func test40b( ) -> Bool {
901
+ return cast40 ( ( 1 , AA ( ) ) )
902
+ }
903
+
904
+ // CHECK-LABEL: sil [noinline] @_TF12cast_folding7test40c
905
+ // CHECK: bb0
906
+ // CHECK-NEXT: %0 = integer_literal $Builtin.Int1, 0
907
+ // CHECK-NEXT: %1 = struct $Bool
908
+ // CHECK-NEXT: return %1
909
+ @inline ( never)
910
+ public func test40c( ) -> Bool {
911
+ return cast40 ( ( 1 , S ( ) ) )
912
+ }
913
+
914
+ // CHECK-LABEL: sil [noinline] @_TF12cast_folding7test40d
915
+ // CHECK: bb0
916
+ // CHECK-NOT: return
917
+ // CHECK: checked_cast_addr_br take_always (Int, Any) in
918
+ @inline ( never)
919
+ public func test40d( _ a: Any ) -> Bool {
920
+ return cast40 ( ( 1 , a) )
921
+ }
801
922
802
923
print ( " test0= \( test0 ( ) ) " )
803
924
0 commit comments