// RUN: %target-swift-frontend %s -Xllvm -sil-print-types -emit-sil -disable-availability-checking -O -o - | %FileCheck %s public protocol P { associatedtype T } public protocol Q: P where T == Int {} public struct X: Q { public typealias T = Int } public struct Y: P {} extension Y: Q where T == Int {} @_optimize(none) func use(_ t: T) {} // CHECK-LABEL: sil @$s35cast_folding_parameterized_protocol23concrete_to_existentialyyAA1XV_AA1YVyxGAFySiGtlF : $@convention(thin) (X, Y, Y) -> () public func concrete_to_existential(_ x: X, _ yt: Y, _ yi: Y) { // CHECK:{{%.*}} = init_existential_addr %6 : $*any P, $X use(x as! any P) // CHECK: unconditional_checked_cast_addr X in {{%.*}} : $*X to any P in {{%.*}} : $*any P use(x as! any P) // CHECK: unconditional_checked_cast_addr X in {{%.*}} : $*X to any P in {{%.*}} : $*any P use(x as! any P) // CHECK: unconditional_checked_cast_addr X in {{%.*}} : $*X to any P in {{%.*}} : $*any P use(x as! any P) // CHECK: {{%.*}} = init_existential_addr {{%.*}} : $*any Q, $X use(x as! any Q) // CHECK: {{%.*}} = init_existential_addr {{%.*}} : $*any P, $Y use(yt as! any P) // CHECK: unconditional_checked_cast_addr Y in {{%.*}} : $*Y to any P in {{%.*}} : $*any P use(yt as! any P) // CHECK: unconditional_checked_cast_addr Y in {{%.*}} : $*Y to any P in {{%.*}} : $*any P use(yt as! any P) // CHECK: unconditional_checked_cast_addr Y in {{%.*}} : $*Y to any P in {{%.*}} : $*any P use(yt as! any P) // CHECK: unconditional_checked_cast_addr Y in {{%.*}} : $*Y to any Q in {{%.*}} : $*any Q use(yt as! any Q) // CHECK: {{%.*}} = init_existential_addr {{%.*}} : $*any P, $Y use(yi as! any P) // CHECK: unconditional_checked_cast_addr Y in {{%.*}} : $*Y to any P in {{%.*}} : $*any P use(yi as! any P) // CHECK: unconditional_checked_cast_addr Y in {{%.*}} : $*Y to any P in {{%.*}} : $*any P use(yi as! any P) // CHECK: unconditional_checked_cast_addr Y in {{%.*}} : $*Y to any P in {{%.*}} : $*any P use(yi as! any P) // CHECK: {{%.*}} = init_existential_addr {{%.*}} : $*any Q, $Y use(yi as! any Q) } // CHECK-LABEL: sil @$s35cast_folding_parameterized_protocol23existential_to_concreteyyxm_AA1P_px1TRts_XPtlF : $@convention(thin) (@thick T.Type, @in_guaranteed any P) -> () public func existential_to_concrete(_: T.Type, _ p: any P) { // CHECK: unconditional_checked_cast_addr any P in {{%.*}} : $*any P to X in {{%.*}} : $*X _ = p as! X // CHECK: unconditional_checked_cast_addr any P in {{%.*}} : $*any P to Y in {{%.*}} : $*Y _ = p as! Y // CHECK: unconditional_checked_cast_addr any P in {{%.*}} : $*any P to Y in {{%.*}} : $*Y _ = p as! Y // CHECK: unconditional_checked_cast_addr any P in {{%.*}} : $*any P to Y in {{%.*}} : $*Y _ = p as! Y } // CHECK-LABEL: sil @$s35cast_folding_parameterized_protocol015existential_to_E0yyAA1P_px1TRts_XP_AA1Q_ptlF : $@convention(thin) (@in_guaranteed any P, @in_guaranteed any Q) -> () public func existential_to_existential(_ p: any P, _ q: any Q) { // CHECK: unconditional_checked_cast_addr any P in {{%.*}} : $*any P to any Q in {{%.*}} : $*any Q _ = p as! any Q // CHECK: unconditional_checked_cast_addr any P in {{%.*}} : $*any P to any P in {{%.*}} : $*any P _ = p as! any P // CHECK: unconditional_checked_cast_addr any P in {{%.*}} : $*any P to any P in {{%.*}} : $*any P _ = p as! any P // CHECK: unconditional_checked_cast_addr any P in {{%.*}} : $*any P to any P in {{%.*}} : $*any P _ = p as! any P // CHECK: unconditional_checked_cast_addr any Q in {{%.*}} : $*any Q to any P in {{%.*}} : $*any P _ = q as! any P // CHECK: unconditional_checked_cast_addr any Q in {{%.*}} : $*any Q to any P in {{%.*}} : $*any P _ = q as! any P // CHECK: unconditional_checked_cast_addr any Q in {{%.*}} : $*any Q to any P in {{%.*}} : $*any P _ = q as! any P // CHECK: unconditional_checked_cast_addr any Q in {{%.*}} : $*any Q to any P in {{%.*}} : $*any P _ = q as! any P }