blob: dca8fb50c9b79b83ab300f1bff604ed0d6a5d3bb [file] [log] [blame]
// First parse this and then emit a *.sib. Then read in the *.sib, then recreate
// RUN: %empty-directory(%t)
// RUN: %target-sil-opt %s -emit-sib -o %t/tmp.sib -module-name boxes
// RUN: %target-sil-opt %t/tmp.sib -emit-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 [serialized] [ossa] @box_type_parsing : $@convention(thin) (
sil hidden [serialized] [ossa] @box_type_parsing : $@convention(thin) (
// CHECK: <τ_0_0> { var τ_0_0 } <F>,
<B>{ var B }<F>,
// CHECK: <τ_0_0 where τ_0_0 : P> { let τ_0_0 } <G>,
<C: P>{ let C }<G>,
// CHECK: <τ_0_0 where τ_0_0 : P> { var τ_0_0 } <Q>,
<D: P>{ var D }<Q>,
// 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 } <Int, String, Optional<Double>>
<X, Y, Z>{ var X, let Z }<Int, String, Optional<Double>>
// CHECK: ) -> ()
) -> () {
entry(%0 : @unowned $<E>{ var E }<F>, %1 : @unowned $<F: P>{ let F }<G>, %2 : @unowned $<G: P>{ var G }<Q>, %3 : @unowned ${ let Int }, %4 : @unowned ${ var Int, let String }, %5 : @unowned ${}, %6 : @unowned $<XX, YY, ZZ>{ var XX, let ZZ }<Int, String, Optional<Double>>):
unreachable
}
// CHECK-LABEL: sil hidden [serialized] [ossa] @box_type_parsing_in_generic_function : $@convention(thin) <F, G where G : P> (
sil hidden [serialized] [ossa] @box_type_parsing_in_generic_function : $@convention(thin) <F, G: P> (
// CHECK: <τ_0_0> { var τ_0_0 } <F>,
<B>{ var B }<F>,
// CHECK: <τ_0_0 where τ_0_0 : P> { let τ_0_0 } <G>,
<C: P>{ let C }<G>,
// CHECK: <τ_0_0 where τ_0_0 : P> { var τ_0_0 } <Q>,
<D: P>{ var D }<Q>,
// 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 } <Int, String, Optional<Double>>
<X, Y, Z>{ var X, let Z }<Int, String, Optional<Double>>
// CHECK: ) -> ()
) -> () {
entry(%0 : @unowned $<E>{ var E }<F>, %1 : @unowned $<F: P>{ let F }<G>, %2 : @unowned $<G: P>{ var G }<Q>, %3 : @unowned ${ let Int }, %4 : @unowned ${ var Int, let String }, %5 : @unowned ${}, %6 : @unowned $<XX, YY, ZZ>{ var XX, let ZZ }<Int, String, Optional<Double>>):
unreachable
}
// CHECK-LABEL: sil hidden [serialized] [ossa] @same_generic_param_name_in_multiple_box_signatures : $@convention(thin) (
sil hidden [serialized] [ossa] @same_generic_param_name_in_multiple_box_signatures : $@convention(thin) (
// CHECK: <τ_0_0> { var τ_0_0 } <Int>,
<A> { var A } <Int>,
// CHECK: <τ_0_0> { var τ_0_0 } <String>
<A> { var A } <String>
// CHECK: ) -> ()
) -> () {
entry(%0 : @unowned $<A> { var A } <Int>, %1 : @unowned $<A> { var A } <String>):
unreachable
}
// CHECK-LABEL: sil hidden [serialized] [ossa] @same_generic_param_name_in_outer_scope : $@convention(thin) <A> (
sil hidden [serialized] [ossa] @same_generic_param_name_in_outer_scope : $@convention(thin) <A> (
// CHECK: <τ_0_0> { var τ_0_0 } <A>
<A> { var A } <A>
// CHECK: ) -> ()
) -> () {
entry(%0 : @unowned $<B> { var B } <A>):
unreachable
}
// CHECK-LABEL: sil hidden [serialized] [ossa] @box_ownership : $@convention(thin) (@owned { var Int }, @guaranteed <τ_0_0> { let τ_0_0 } <Int>) -> ()
sil hidden [serialized ] [ossa] @box_ownership : $@convention(thin) (@owned { var Int }, @guaranteed <T> { let T } <Int>) -> () {
entry(%0 : @owned ${ var Int }, %1 : @guaranteed $<T> { let T } <Int>):
unreachable
}
// CHECK-LABEL: sil hidden [serialized] [ossa] @address_of_box
sil hidden [serialized] [ossa] @address_of_box : $@convention(thin) (@in { var Int }, @in <T> { let T } <Int>) -> () {
// CHECK: %0 : $*{ var Int }, %1 : $*<τ_0_0> { let τ_0_0 } <Int>
entry(%0 : $*{ var Int }, %1 : $*<T> { let T } <Int>):
unreachable
}
sil [serialized] @serialize_all : $@convention(thin) () -> () {
entry:
%0 = function_ref @box_type_parsing : $@convention(thin) (<B>{ var B }<F>, <C: P>{ let C }<G>, <D: P>{ var D }<Q>, { let Int }, { var Int, let String }, {}, <X, Y, Z>{ var X, let Z }<Int, String, Optional<Double>>) -> ()
%1 = function_ref @box_type_parsing_in_generic_function : $@convention(thin) <F, G: P> (<B>{ var B }<F>, <C: P>{ let C }<G>, <D: P>{ var D }<Q>, { let Int }, { var Int, let String }, {}, <X, Y, Z>{ var X, let Z }<Int, String, Optional<Double>>) -> ()
%2 = function_ref @same_generic_param_name_in_multiple_box_signatures : $@convention(thin) (<A> { var A } <Int>, <A> { var A } <String>) -> ()
%3 = function_ref @same_generic_param_name_in_outer_scope : $@convention(thin) <A> (<A> { var A } <A>) -> ()
%4 = function_ref @box_ownership : $@convention(thin) (@owned { var Int }, @guaranteed <T> { let T } <Int>) -> ()
%5 = function_ref @address_of_box : $@convention(thin) (@in { var Int }, @in <T> { let T } <Int>) -> ()
unreachable
}