// RUN: %target-swift-frontend -emit-silgen %s | %FileCheck %s sil_stage raw import Swift protocol P {} struct F {} struct G: P {} struct Q: P {} // TODO: Transform boxes by transforming their arguments, not as single-field, // so that they work as parameters in generic SIL functions. // CHECK-LABEL: sil [ossa] @box_type_parsing : $@convention(thin) ( sil [ossa] @box_type_parsing : $@convention(thin) ( // CHECK: <τ_0_0> { var τ_0_0 } , { var B }, // CHECK: <τ_0_0 where τ_0_0 : P> { let τ_0_0 } , { let C }, // CHECK: <τ_0_0 where τ_0_0 : P> { var τ_0_0 } , { var D }, // CHECK: { let Int }, { let Int }, // CHECK: { var Int, let String }, { var Int, let String }, // CHECK: { }, {}, // CHECK: <τ_0_0, τ_0_1, τ_0_2> { var τ_0_0, let τ_0_2 } > { var X, let Z }> // CHECK: ) -> () ) -> () { entry(%0 : @unowned ${ var E }, %1 : @unowned ${ let F }, %2 : @unowned ${ var G }, %3 : @unowned ${ let Int }, %4 : @unowned ${ var Int, let String }, %5 : @unowned ${}, %6 : @unowned ${ var XX, let ZZ }>): unreachable } // CHECK-LABEL: sil [ossa] @box_type_parsing_in_generic_function : $@convention(thin) ( sil [ossa] @box_type_parsing_in_generic_function : $@convention(thin) ( // CHECK: <τ_0_0> { var τ_0_0 } , { var B }, // CHECK: <τ_0_0 where τ_0_0 : P> { let τ_0_0 } , { let C }, // CHECK: <τ_0_0 where τ_0_0 : P> { var τ_0_0 } , { var D }, // CHECK: { let Int }, { let Int }, // CHECK: { var Int, let String }, { var Int, let String }, // CHECK: { }, {}, // CHECK: <τ_0_0, τ_0_1, τ_0_2> { var τ_0_0, let τ_0_2 } > { var X, let Z }> // CHECK: ) -> () ) -> () { entry(%0 : @unowned ${ var E }, %1 : @unowned ${ let F }, %2 : @unowned ${ var G }, %3 : @unowned ${ let Int }, %4 : @unowned ${ var Int, let String }, %5 : @unowned ${}, %6 : @unowned ${ var XX, let ZZ }>): unreachable } // CHECK-LABEL: sil [ossa] @same_generic_param_name_in_multiple_box_signatures : $@convention(thin) ( sil [ossa] @same_generic_param_name_in_multiple_box_signatures : $@convention(thin) ( // CHECK: <τ_0_0> { var τ_0_0 } , { var A } , // CHECK: <τ_0_0> { var τ_0_0 } { var A } // CHECK: ) -> () ) -> () { entry(%0 : @unowned $ { var A } , %1 : @unowned $ { var A } ): unreachable } // CHECK-LABEL: sil [ossa] @same_generic_param_name_in_outer_scope : $@convention(thin) ( sil [ossa] @same_generic_param_name_in_outer_scope : $@convention(thin) ( // CHECK: <τ_0_0> { var τ_0_0 } { var A } // CHECK: ) -> () ) -> () { entry(%0 : @unowned $ { var B } ): unreachable } // CHECK-LABEL: sil [ossa] @box_ownership : $@convention(thin) (@owned { var Int }, @guaranteed <τ_0_0> { let τ_0_0 } ) -> () sil [ossa] @box_ownership : $@convention(thin) (@owned { var Int }, @guaranteed { let T } ) -> () { entry(%0 : @owned ${ var Int }, %1 : @guaranteed $ { let T } ): unreachable } // CHECK-LABEL: sil [ossa] @address_of_box sil [ossa] @address_of_box : $@convention(thin) (@in { var Int }, @in { let T } ) -> () { // CHECK: %0 : $*{ var Int }, %1 : $*<τ_0_0> { let τ_0_0 } entry(%0 : $*{ var Int }, %1 : $* { let T } ): unreachable } // CHECK-LABEL: sil [ossa] @alloc_box_attrs sil [ossa] @alloc_box_attrs : $@convention(thin) () -> () { entry: // CHECK: %0 = alloc_box $ %0 = alloc_box ${ let Int } // CHECK: %1 = alloc_box [dynamic_lifetime] $ %1 = alloc_box [dynamic_lifetime] ${ let Int } // CHECK: %2 = alloc_box [reflection] $ %2 = alloc_box [reflection] ${ let Int } // CHECK: %3 = alloc_box [dynamic_lifetime] [reflection] $ %3 = alloc_box [dynamic_lifetime] [reflection] ${ let Int } dealloc_box %3: ${ let Int } dealloc_box %2: ${ let Int } dealloc_box %1: ${ let Int } dealloc_box %0: ${ let Int } return undef : $() }