mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Use a syntax that declares the layout's generic parameters and fields,
followed by the generic arguments to apply to the layout:
{ var Int, let String } // A concrete box layout with a mutable Int
// and immutable String field
<T, U> { var T, let U } <Int, String> // A generic box layout,
// applied to Int and String
// arguments
92 lines
3.3 KiB
Plaintext
92 lines
3.3 KiB
Plaintext
// 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 @box_type_parsing : $@convention(thin) (
|
|
sil @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 : $<E>{ var E }<F>, %1 : $<F: P>{ let F }<G>, %2 : $<G: P>{ var G }<Q>, %3 : ${ let Int }, %4 : ${ var Int, let String }, %5 : ${}, %6 : $<XX, YY, ZZ>{ var XX, let ZZ }<Int, String, Optional<Double>>):
|
|
unreachable
|
|
}
|
|
|
|
// CHECK-LABEL: sil @box_type_parsing_in_generic_function : $@convention(thin) <F, G where G : P> (
|
|
sil @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 : $<E>{ var E }<F>, %1 : $<F: P>{ let F }<G>, %2 : $<G: P>{ var G }<Q>, %3 : ${ let Int }, %4 : ${ var Int, let String }, %5 : ${}, %6 : $<XX, YY, ZZ>{ var XX, let ZZ }<Int, String, Optional<Double>>):
|
|
unreachable
|
|
}
|
|
|
|
// CHECK-LABEL: sil @same_generic_param_name_in_multiple_box_signatures : $@convention(thin) (
|
|
sil @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 : $<A> { var A } <Int>, %1 : $<A> { var A } <String>):
|
|
unreachable
|
|
}
|
|
|
|
// CHECK-LABEL: sil @same_generic_param_name_in_outer_scope : $@convention(thin) <A> (
|
|
sil @same_generic_param_name_in_outer_scope : $@convention(thin) <A> (
|
|
// CHECK: <τ_0_0> { var τ_0_0 } <A>
|
|
<A> { var A } <A>
|
|
// CHECK: ) -> ()
|
|
) -> () {
|
|
entry(%0 : $<B> { var B } <A>):
|
|
unreachable
|
|
}
|
|
|
|
// CHECK-LABEL: sil @box_ownership : $@convention(thin) (@owned { var Int }, @guaranteed <τ_0_0> { let τ_0_0 } <Int>) -> ()
|
|
sil @box_ownership : $@convention(thin) (@owned { var Int }, @guaranteed <T> { let T } <Int>) -> () {
|
|
entry(%0 : ${ var Int }, %1 : $<T> { let T } <Int>):
|
|
unreachable
|
|
}
|
|
|
|
// CHECK-LABEL: sil @address_of_box
|
|
sil @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
|
|
}
|