// First parse this and then emit a *.sib. Then read in the *.sib, then recreate // RUN: rm -rfv %t // RUN: mkdir %t // RUN: %target-sil-opt %s -emit-sib -o %t/tmp.sib -module-name boxes // RUN: %target-sil-opt %t/tmp.sib -o %t/tmp.2.sib -module-name boxes // RUN: %target-sil-opt %t/tmp.2.sib -module-name boxes | %FileCheck %s sil_stage canonical 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 hidden @box_type_parsing : $@convention(thin) ( sil hidden @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 : ${ var E }, %1 : ${ let F }, %2 : ${ var G }, %3 : ${ let Int }, %4 : ${ var Int, let String }, %5 : ${}, %6 : ${ var XX, let ZZ }>): unreachable } // CHECK-LABEL: sil hidden @box_type_parsing_in_generic_function : $@convention(thin) ( sil hidden @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 : ${ var E }, %1 : ${ let F }, %2 : ${ var G }, %3 : ${ let Int }, %4 : ${ var Int, let String }, %5 : ${}, %6 : ${ var XX, let ZZ }>): unreachable } // CHECK-LABEL: sil hidden @same_generic_param_name_in_multiple_box_signatures : $@convention(thin) ( sil hidden @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 : $ { var A } , %1 : $ { var A } ): unreachable } // CHECK-LABEL: sil hidden @same_generic_param_name_in_outer_scope : $@convention(thin) ( sil hidden @same_generic_param_name_in_outer_scope : $@convention(thin) ( // CHECK: <τ_0_0> { var τ_0_0 } { var A } // CHECK: ) -> () ) -> () { entry(%0 : $ { var B } ): unreachable } // CHECK-LABEL: sil hidden @box_ownership : $@convention(thin) (@owned { var Int }, @guaranteed <τ_0_0> { let τ_0_0 } ) -> () sil hidden @box_ownership : $@convention(thin) (@owned { var Int }, @guaranteed { let T } ) -> () { entry(%0 : ${ var Int }, %1 : $ { let T } ): unreachable } // CHECK-LABEL: sil hidden @address_of_box sil hidden @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 } sil @serialize_all : $@convention(thin) () -> () { entry: %0 = function_ref @box_type_parsing : $@convention(thin) ({ var B }, { let C }, { var D }, { let Int }, { var Int, let String }, {}, { var X, let Z }>) -> () %1 = function_ref @box_type_parsing_in_generic_function : $@convention(thin) ({ var B }, { let C }, { var D }, { let Int }, { var Int, let String }, {}, { var X, let Z }>) -> () %2 = function_ref @same_generic_param_name_in_multiple_box_signatures : $@convention(thin) ( { var A } , { var A } ) -> () %3 = function_ref @same_generic_param_name_in_outer_scope : $@convention(thin) ( { var A } ) -> () %4 = function_ref @box_ownership : $@convention(thin) (@owned { var Int }, @guaranteed { let T } ) -> () %5 = function_ref @address_of_box : $@convention(thin) (@in { var Int }, @in { let T } ) -> () unreachable }