blob: 44ac2ccba59b7f5936116f68862b3dac4c5399d3 [file] [log] [blame]
// RUN: %target-swift-frontend %s -emit-ir > %t.txt
// RUN: %FileCheck %s --check-prefix=CHECK < %t.txt
// RUN: %FileCheck %s --check-prefix=CHECK-CONSTANTS < %t.txt
// 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<T>
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %swift.metadata_response @"$s15nested_generics18OuterGenericStructVMa"(i64 %0, %swift.type* %1)
// Type constructor for OuterGenericStruct<T>.InnerGenericStruct<U>
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %swift.metadata_response @"$s15nested_generics18OuterGenericStructV05InnerdE0VMa"(i64 %0, %swift.type* %1, %swift.type* %2)
// Type constructor for OuterGenericStruct<T>.InnerConcreteStruct
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %swift.metadata_response @"$s15nested_generics18OuterGenericStructV013InnerConcreteE0VMa"(i64 %0, %swift.type* %1)
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<T>
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %swift.metadata_response @"$s15nested_generics17OuterGenericClassCMa"(i64 %0, %swift.type* %1)
// Type constructor for OuterGenericClass<T>.InnerGenericClass<U>
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %swift.metadata_response @"$s15nested_generics17OuterGenericClassC05InnerdE0CMa"(i64 %0, %swift.type* %1, %swift.type* %2)
// Type constructor for OuterGenericClass<T>.InnerConcreteClass
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %swift.metadata_response @"$s15nested_generics17OuterGenericClassC013InnerConcreteE0CMa"(i64 %0, %swift.type* %1)
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
}
}
// <rdar://problem/51627403> Superclass demangling failure when instantiating
// nested generic subclass constrained to outer type generic argument
protocol TagProtocol {}
enum Outer : TagProtocol {}
protocol HasAssoc {
associatedtype Assoc
}
class SeparateGenericSuperclass<T> {}
enum Container<T : TagProtocol> {
class _Superclass {}
// CHECK-CONSTANTS-LABEL: @"$s15nested_generics9ContainerO9_SubclassCMn" =
// Check the superclass...
// CHECK-CONSTANTS-SAME: @"symbolic _____y______G 15nested_generics9ContainerO11_SuperclassC AA5OuterO"
// ...and the requirements.
// CHECK-CONSTANTS-SAME: @"symbolic x"
// CHECK-CONSTANTS-SAME: @"symbolic _____ 15nested_generics5OuterO"
// CHECK-CONSTANTS-LABEL: @"$s15nested_generics9ContainerO9_SubclassCMF" =
// CHECK-CONSTANTS-SAME: @"symbolic _____y______G 15nested_generics9ContainerO11_SuperclassC AA5OuterO"
class _Subclass<U>: _Superclass where T == Outer {
// CHECK-CONSTANTS-LABEL: @"$s15nested_generics9ContainerO9_SubclassC11ExtraNestedCMn" =
// CHECK-CONSTANTS-SAME: @"symbolic _____y______G 15nested_generics9ContainerO11_SuperclassC AA5OuterO"
// CHECK-CONSTANTS-LABEL: @"$s15nested_generics9ContainerO9_SubclassC11ExtraNestedCMF" =
// CHECK-CONSTANTS-SAME: @"symbolic _____y______G 15nested_generics9ContainerO11_SuperclassC AA5OuterO"
class ExtraNested: _Superclass {}
}
// CHECK-CONSTANTS-LABEL: @"$s15nested_generics9ContainerO10_Subclass2CMn" =
// CHECK-CONSTANTS-SAME: @"symbolic _____yx_G 15nested_generics9ContainerO11_SuperclassC"
class _Subclass2<U: Collection>: _Superclass where T == U.Element {}
// CHECK-CONSTANTS-LABEL: @"$s15nested_generics9ContainerO10_Subclass3CMn" =
// CHECK-CONSTANTS-SAME: @"symbolic _____y______qd__G 15nested_generics9ContainerO18_GenericSuperclassC AA5OuterO"
class _GenericSuperclass<U> {}
class _Subclass3<U>: _GenericSuperclass<U> where T == Outer {}
class MoreNesting {
// CHECK-CONSTANTS-LABEL: @"$s15nested_generics9ContainerO11MoreNestingC9_SubclassCMn" =
// CHECK-CONSTANTS-SAME: @"symbolic _____y______G 15nested_generics9ContainerO11_SuperclassC AA5OuterO"
class _Subclass<U>: _Superclass where T == Outer {}
}
// CHECK-CONSTANTS-LABEL: @"$s15nested_generics9ContainerO24_SeparateGenericSubclassCMn" =
// CHECK-CONSTANTS-SAME: @"symbolic _____yxSgG 15nested_generics25SeparateGenericSuperclassC"
class _SeparateGenericSubclass: SeparateGenericSuperclass<T?> {}
// CHECK-CONSTANTS-LABEL: @"$s15nested_generics9ContainerO6FieldsVMF" =
// CHECK-CONSTANTS-SAME: @"symbolic _____ 15nested_generics5OuterO"
// CHECK-CONSTANTS-SAME: @"symbolic qd__"
struct Fields<U> where T == Outer {
var x: T
var y: U
}
// CHECK-CONSTANTS-LABEL: @"$s15nested_generics9ContainerO5CasesOMF" =
// CHECK-CONSTANTS-SAME: @"symbolic qd__"
enum Cases<U> where T == Outer {
case a(T)
case b(U)
}
struct Conformancy<U>: HasAssoc where T == Outer {
typealias Assoc = T
}
struct Conformancy2<U> {}
struct Conformancy3 {}
}
extension Container.Conformancy2: HasAssoc where T == Outer {
typealias Assoc = T
}
extension Container.Conformancy3: HasAssoc where T == Outer {
typealias Assoc = T
}
// CHECK-CONSTANTS-LABEL: @"$s15nested_generics9ContainerO12Conformancy3Vyx_GAA8HasAssocA2A5OuterORszrlWP" =
// CHECK-CONSTANTS-SAME: @"symbolic{{.*}}15nested_generics5OuterO"
// CHECK-CONSTANTS-LABEL: @"$s15nested_generics9ContainerO12Conformancy2Vyx_qd__GAA8HasAssocA2A5OuterORszrlWP" =
// CHECK-CONSTANTS-SAME: @"symbolic{{.*}}15nested_generics5OuterO"
// CHECK-CONSTANTS-LABEL: @"$s15nested_generics9ContainerO11ConformancyVyx_qd__GAA8HasAssocAAWP" =
// CHECK-CONSTANTS-SAME: @"symbolic{{.*}}15nested_generics5OuterO"