blob: e1994c381d204f1ec47e2e8d106255542d411b85 [file] [log] [blame]
// RUN: %target-swift-frontend -primary-file %s -emit-ir | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize -DINT=i%target-ptrsize -DINT_32=i32
struct A<T1, T2>
{
var b: T1
var c: T2
var d: B<T1, T2>
}
struct B<T1, T2>
{
var c: T1
var d: T2
}
struct C<T1>
{}
struct D<T2>
{}
struct Foo<A1, A2>
{
var a: A1
var b: Bar<A1, A2>
}
struct Bar<A1, A2> {
}
public protocol Proto { }
public struct EmptyStruct {}
public struct GenericStruct<T : Proto> {
var empty: EmptyStruct = EmptyStruct()
var dummy: Int = 0
var opt: Optional<T> = nil
public init() {}
}
// CHECK-LABEL: define{{.*}} swiftcc void @"$s15generic_structs13GenericStructVACyxGycfC"
// CHECK: [[T0:%.*]] = call swiftcc %swift.metadata_response @"$s15generic_structs13GenericStructVMa"([[INT]] 0, %swift.type* %T, i8** %T.Proto)
// CHECK: [[TYPE:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
// CHECK: [[PTR:%.*]] = bitcast %swift.type* [[TYPE]] to [[INT_32]]*
// CHECK: [[FIELDOFFSETS:%.*]] = getelementptr inbounds [[INT_32]], [[INT_32]]* [[PTR]], [[INT]] [[IDX:4|8]]
// CHECK: [[FIELDOFFSET:%.*]] = getelementptr inbounds [[INT_32]], [[INT_32]]* [[FIELDOFFSETS]], i32 2
// CHECK: [[OFFSET:%.*]] = load [[INT_32]], [[INT_32]]* [[FIELDOFFSET]]
// CHECK: [[ADDROFOPT:%.*]] = getelementptr inbounds i8, i8* {{.*}}, [[INT_32]] [[OFFSET]]
// CHECK: [[OPTPTR:%.*]] = bitcast i8* [[ADDROFOPT]] to %TSq*
// CHECK: call %TSq* @"$sxSg15generic_structs5ProtoRzlWOb"(%TSq* {{.*}}, %TSq* [[OPTPTR]]