blob: 41575abac3153b7fd019db870ababe1d3219715c [file] [log] [blame]
// RUN: %target-swift-frontend %s -emit-ir | %FileCheck %s --check-prefix=CHECK
// REQUIRES: CPU=x86_64
func blah<T>(_: T.Type) {}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @"$s15nested_generics13makeAMetadatayyF"()
public func makeAMetadata() {
blah(OuterGenericStruct<Int>.InnerGenericStruct<String>.self)
blah(OuterGenericStruct<Int>.InnerConcreteStruct.self)
blah(OuterGenericClass<Int>.InnerGenericClass<String>.self)
blah(OuterGenericClass<Int>.InnerConcreteClass.self)
}
// Type constructor for OuterGenericStruct<Int>.InnerGenericStruct<String>
// CHECK-LABEL: define linkonce_odr hidden swiftcc %swift.metadata_response @"$s15nested_generics18OuterGenericStructV05InnerdE0VySi_SSGMa"(i64)
// CHECK: call swiftcc %swift.metadata_response @"$s15nested_generics18OuterGenericStructV05InnerdE0VMa"(i64 %0, %swift.type* @"$sSiN", %swift.type* @"$sSSN")
// CHECK: ret %swift.metadata_response
// Type constructor for OuterGenericStruct<T>.InnerGenericStruct<U>
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %swift.metadata_response @"$s15nested_generics18OuterGenericStructV05InnerdE0VMa"(i64, %swift.type*, %swift.type*)
// Type constructor for OuterGenericStruct<Int>.InnerConcreteStruct
// CHECK-LABEL: define linkonce_odr hidden swiftcc %swift.metadata_response @"$s15nested_generics18OuterGenericStructV013InnerConcreteE0VySi_GMa"(i64)
// CHECK: call swiftcc %swift.metadata_response @"$s15nested_generics18OuterGenericStructV013InnerConcreteE0VMa"(i64 %0, %swift.type* @"$sSiN")
// CHECK: ret %swift.metadata_response
// Type constructor for OuterGenericStruct<T>.InnerConcreteStruct
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %swift.metadata_response @"$s15nested_generics18OuterGenericStructV013InnerConcreteE0VMa"(i64, %swift.type*)
public struct OuterGenericStruct<T> {
public struct InnerGenericStruct<U> {
public func method() {
blah(T.self)
blah(U.self)
}
}
public struct InnerConcreteStruct {
public func method() {
blah(T.self)
}
}
}
// Type constructor for OuterGenericClass<Int>.InnerGenericClass<String>
// CHECK-LABEL: define linkonce_odr hidden swiftcc %swift.metadata_response @"$s15nested_generics17OuterGenericClassC05InnerdE0CySi_SSGMa"(i64)
// CHECK: call swiftcc %swift.metadata_response @"$s15nested_generics17OuterGenericClassC05InnerdE0CMa"(i64 %0, %swift.type* @"$sSiN", %swift.type* @"$sSSN")
// Type constructor for OuterGenericClass<T>.InnerGenericClass<U>
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %swift.metadata_response @"$s15nested_generics17OuterGenericClassC05InnerdE0CMa"(i64, %swift.type*, %swift.type*)
// Type constructor for OuterGenericClass<Int>.InnerConcreteClass
// CHECK-LABEL: define linkonce_odr hidden swiftcc %swift.metadata_response @"$s15nested_generics17OuterGenericClassC013InnerConcreteE0CySi_GMa"(i64)
// CHECK: call swiftcc %swift.metadata_response @"$s15nested_generics17OuterGenericClassC013InnerConcreteE0CMa"(i64 %0, %swift.type* @"$sSiN")
// CHECK: ret %swift.metadata_response
// Type constructor for OuterGenericClass<T>.InnerConcreteClass
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %swift.metadata_response @"$s15nested_generics17OuterGenericClassC013InnerConcreteE0CMa"(i64, %swift.type*)
// Type constructor for OuterGenericStruct<T>
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %swift.metadata_response @"$s15nested_generics18OuterGenericStructVMa"(i64, %swift.type*)
// Type constructor for OuterGenericClass<T>
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %swift.metadata_response @"$s15nested_generics17OuterGenericClassCMa"(i64, %swift.type*)
public class OuterGenericClass<T> {
public class InnerGenericClass<U> {
public func method() {
blah(T.self)
blah(U.self)
}
}
public class InnerConcreteClass {
public func method() {
blah(T.self)
}
}
}
// This used to crash while emitting value witnesses.
public struct Fish<Water> {}
public protocol Wet {}
extension Fish where Water : Wet {
public enum Fillet {
case grilled
case fried
}
}