1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
|
// RUN: %target-swift-frontend -emit-ir -primary-file %s | %IRGenFileCheck %s
import Builtin
import Swift
struct A<each T> {}
struct B<each T> {}
struct C<each T : Collection> {}
struct D<each T : Collection> {}
sil @use_metadata : $<T> () -> ()
// CHECK-LABEL: define{{.*}} void @test_simple_fulfillment(ptr %0)
sil @test_simple_fulfillment : $<each T> (@thick A<repeat each T>.Type) -> () {
bb0(%0: $@thick A<repeat each T>.Type):
%use_metadata = function_ref @use_metadata : $@convention(thin) <T> () -> ()
// CHECK: [[T1:%.*]] = getelementptr inbounds [[INT]], ptr %0, [[INT]] 2
// CHECK: [[COUNT:%.*]] = load [[INT]], ptr [[T1]], align
// CHECK: [[T1:%.*]] = getelementptr inbounds ptr, ptr %0, [[INT]] 3
// CHECK: [[PACK:%.*]] = load ptr, ptr [[T1]], align
// CHECK: call swiftcc %swift.metadata_response @"$s29variadic_generic_fulfillments1BVMa"([[INT]] 0, [[INT]] [[COUNT]], ptr [[PACK]])
apply %use_metadata<B<repeat each T>>() : $@convention(thin) <T> () -> ()
%ret = tuple ()
return %ret : $()
}
// CHECK-LABEL: define{{.*}} void @test_simple_fulfillment_constrained(ptr %0)
sil @test_simple_fulfillment_constrained : $<each T : Collection> (@thick C<repeat each T>.Type) -> () {
bb0(%0: $@thick C<repeat each T>.Type):
%use_metadata = function_ref @use_metadata : $@convention(thin) <T> () -> ()
// CHECK: [[T1:%.*]] = getelementptr inbounds [[INT]], ptr %0, [[INT]] 2
// CHECK: [[COUNT:%.*]] = load [[INT]], ptr [[T1]], align
// CHECK: [[T1:%.*]] = getelementptr inbounds ptr, ptr %0, [[INT]] 3
// CHECK: [[PACK:%.*]] = load ptr, ptr [[T1]], align
// CHECK: [[T1:%.*]] = getelementptr inbounds ptr, ptr %0, [[INT]] 4
// CHECK: [[WTABLE_PACK:%.*]] = load ptr, ptr [[T1]], align
// CHECK: call swiftcc %swift.metadata_response @"$s29variadic_generic_fulfillments1DVMa"([[INT]] 0, [[INT]] [[COUNT]], ptr [[PACK]], ptr [[WTABLE_PACK]])
apply %use_metadata<D<repeat each T>>() : $@convention(thin) <T> () -> ()
%ret = tuple ()
return %ret : $()
}
|